從一次故障聊聊前端 UI 自動化測試

来源:https://www.cnblogs.com/karthuslorin/archive/2020/07/19/13338353.html
-Advertisement-
Play Games

背景 事件的起因在於老闆最近的兩次“故障”,一次去年的,一次最近。共同原因都是腳手架在發佈平臺發佈打包時出錯,導致線上應用白屏不可用。 最神奇的是,事後多次 Code Review,結果還是沒有發現任何能夠導致該問題的 bug,最後推測有可能是伺服器在發佈打包的時候出了問題。 當老闆第 N + 1 ...


背景

事件的起因在於老闆最近的兩次“故障”,一次去年的,一次最近。共同原因都是腳手架在發佈平臺發佈打包時出錯,導致線上應用白屏不可用。

最神奇的是,事後多次 Code Review,結果還是沒有發現任何能夠導致該問題的 bug,最後推測有可能是伺服器在發佈打包的時候出了問題。

當老闆第 N + 1 次吐槽因為他寫的工程化工具領來的天外飛鍋,我突然思考起來,如何才能避免這種天外飛鍋。

歸根結底,導致這類線上故障的原因都是在於打包上線的代碼沒有經過驗證。針對這個問題,有兩種方法可以解決:

  1. 治本,由於請求地址不同,預發(測試)版本不可直接發線上,而線上版本缺少了上線之前的驗證過程。所以,可以通過在發佈系統的預發和線上之間,新增一個 beta 發佈,beta 發佈使用線上發佈的打包流程,不同的是,只允許內網訪問,專門用於內部測試。有人可能會問,哪怕添加了 beta 發佈,依然無法保證線上發佈重新打包的時候不出錯呀?重點來了,這種解決方案的核心就在於,beta 發佈測試通過後,直接將 beta 發佈的打包產物進行線上發佈,因為不需要二次打包,所以避免了打包過程中產生新的問題。由於添加 beta 發佈需要不同崗位,比如運維、後端、移動端的協作,所以實施難度較大。
  2. 治標,既然線上版本上線之前驗證不了,那麼上線之後立刻回歸驗證,如果發現問題,立刻手動回滾。正所謂沒有人發現的故障就不是故障,perfect!

正如之前所說的,治本的方法實施難度較大,所以,我們重點關註治標的方法,即上線之後進行回歸驗證。

說到這裡,問大家一個問題,需求上線之後,作為前端,大家會主動進行回歸驗證而不是等測試進行驗證嗎?

不管你們會不會,反正我是不會[doge]。

在這種情況下,前端 UI 自動化測試閃亮登場。

什麼是前端 UI 自動化測試

眾所周知,測試是一個很重要的環節,由於它的重要性,甚至軟體工程中出現了 TDD 這種說法。

在之前,所謂的前端測試,更多的是在頁面上點點點,進行人肉測試,毫無疑問,效率低下。

所以,有了前端自動化測試,使用機器代替人工。一般來說,前端自動化測試分為兩種:單元測試以及 e2e 測試(UI 自動化測試)。

單元測試本質上是一種白盒測試,是對程式中的最小可測試單元進行測試。

e2e 測試本質上是一種黑盒測試,相當於模擬用戶訪問應用程式,主要檢查界面或功能是否正確。

相比於單元測試,UI 自動化測試更多的是站在用戶角度,從用戶的角度發現問題。但是,由於它其實是一種黑盒測試,所以效率相對於白盒測試要低一些。

前端 UI 自動化測試框架對比

Selenium:e2e 測試鼻祖級的框架,有多種編程語言的版本,如果你去問問你們公司的測試,那麼你一定會發現,他們正在用 Python 版本的 Selenium 寫自動化測試腳本。值得一提的是,它是基於 webdriver 而不是 webkit 內核實現的,所以,Selenium 的瀏覽器相容性相對於其他瀏覽器要好很多。

PhantomJS:開創性的 headless(無頭)測試框架,何為 headless?即沒有 UI 界面的瀏覽器。headless 最大好處在於可以像單元測試一樣,在命令行中跑 e2e 測試。

nightmare:一句話——加強版的 PhantomJS,相對於 PhantomJS,無論是開發還是運行效率都得到了很大的提升。

tips:nightmare 還有個優點——它提供了一個 Chrome 插件 daydream,該插件可以通過錄製屏幕,自動化生成測試代碼,懶人福音。

nightwatch:名字和 nightmare 很像,但是完全不一樣的一個 e2e 框架,使用 Node 調用 webdriver 實現。相對於 Selenium,開發和運行效率更高,最重要的是,迭代很活躍,這點,用開源產品的用戶懂得都懂。

cypress:我接觸的第一個 e2e 測試框架,測試界面和文檔做到極致的一個產品,推薦大家可以試一試。

puppeteer:e2e 測試框架的集大成者,預設以 headless 模式運行,但是也可以通過配置變為 Chromium 運行。開發效率以及運行效率一流,最重要的是,它像 nightmare 一樣,提供了測試代碼生成插件——puppeteer-recorder

綜上所述,如果考慮瀏覽器相容性,使用 nightwatch,反之,選擇 cypress 或者 puppeteer,如果需要 headless 或者自動化生成代碼的功能,那就使用 puppeteer

使用前端 UI 自動化測試的價值

從自動化測試的收益來說,自動化測試有個公式:

自動化的收益 = 迭代次數 * 全手動執行成本 - 首次自動化成本 - 維護次數 * 維護成本

簡而言之,迭代越頻繁,維護成本越高的項目,添加自動化測試的價值越高。在基建項目或頻繁迭代項目中引入前端 UI 自動化測試,可以大大減少每次迭代後手動測試的時間。比起手動測試,前端 UI 自動化測試測試的更快也更徹底。

另一個方面,隨著前端技術的高速發展,各個公司的前端開發、監控體系已經很完善了,但是缺少前端在測試方向上的延伸。而前端 UI 自動化測試最大的價值,就是在前端部分,彌補開發和監控之間的空白區域,形成一個完整的閉環,三管齊下,極大地保障了項目的質量。

未來的展望

針對前端 UI 自動化測試,我思考了很久,個人認為主要有兩大方向:

  1. 針對單個項目,進行一系列關鍵功能的測試,不過如果需要追求測試覆蓋率的話,比較耗費時間,算是一種比較常規、精細的測試方案,所以比較適合一些長期維護的基建項目或者大型業務項目,缺點在於活動頁基本覆蓋不了。
  2. 針對所有項目,添加一個自動化測試的腳手架(或者平臺化),能夠通過配置項,自動訪問目標頁面,併進行一系列的 e2e 測試,根據不同的結果採取截圖、生成 pdf、報警等不同處理方案。

第二個方案,即通用化方案也是我最近開發的重點方向,接下來我應該會專門寫一篇文章,大概介紹下該方案的設計以及具體實現(如果我沒有懶癌發作的話[doge])。

如果有不同想法的同學,歡迎一起交流~

我的 github:https://github.com/KarthusLorin/blog


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 動靜分離概述 1.1 動靜分離介紹 為了提高網站的響應速度,減輕程式伺服器(Tomcat,Jboss等)的負載,對於靜態資源,如圖片、js、css等文件,可以在反向代理伺服器中進行緩存,這樣瀏覽器在請求一個靜態資源時,代理伺服器就可以直接處理,而不用將請求轉發給後端伺服器。對於用戶請求的動態文件 ...
  • 通常tomcat作為應用伺服器,我們不建議也不應該讓tomcat直接面向客戶端提供服務;因此進入tomcat的訪問就只有其他反代伺服器的請求了;如果說tomcat使用其他反代伺服器對外提供服務,那麼對於https的訪問就應該由代理伺服器端來實現,從代理伺服器到tomcat的訪問,我們應該還是使用h... ...
  • 首先去mysql官網下載mysql的離線rpm安裝包(https://downloads.mysql.com/archives/community/) 上傳到/data/rpm/mysql8.0目錄下 因為Mysql依賴於mariadb,所以我們先用rpm -qa | grep mariadb 查找 ...
  • 路漫漫其修遠兮,吾將上下而求索,又到了周末,我繼續帶各位看官學習回顧Mysql知識。 上次說到了流程式控制制函數,那就從流程式控制制函數來繼續學習吧! #五.流程式控制制函數 #1.if函數:if else的效果 IF(條件表達式,成立返回1,不成立返回2) #與Java三元運算相同SELECT IF(10>5 ...
  • select * from T_A a (nolock) where a.xh not in (select xh from T_B) 方法1:效果甚微 select * from T_A a (nolock) where not exists (select xh from T_B where x ...
  • 本文更新於2020-04-05,使用MySQL 5.7,操作系統為Deepin 15.4。 MySQL體繫結構 MySQL實例由一組後臺線程、一些記憶體塊和若幹服務線程組成。 後臺線程包括: 主線程:主要負責將臟緩存頁刷新到數據文件,執行purge操作,觸發檢查點,合併插入緩衝區等。 IO線程: in ...
  • Redis 6.0 新特性 ACL 介紹 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是沒有用戶的概念的,其實沒有辦法很好的控制許可權,redis 6.0 開始支持用戶,可以給每個用戶分配不同的許可權來控制許可權。 ...
  • 當資料庫出現性能異常時,如何找出引起性能問題的SQL? SQL Server自帶trace & event只能抓取已執行完成的SQL,且無法抓取SQL運行過程中的狀態信息 通過SQL Server系統視圖可抓取正在運行的SQL和豐富的相關信息,如執行計劃,狀態信息等。將抓取到的數據存放在本地資料庫表 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...