Testing in Modern Frontend

前端自動化測試會遇上的坑

前言

前端 UI 一直是多變且複雜的題材,經歷各種工具迭代與起伏,像是:

  • 早期瀏覽器標準混亂到穩定
  • 沒有完善的測試工具到如今豐富的測試生態系
  • CSS 管理方法論轉變(BEM、OOCSS…… -> Utility First)
  • 早期 jQuery 指令式操作 DOM 轉向 React Vue 等現代聲明式組件框架
  • Pre-styled 樣式庫(Chakra🔗AntD🔗Bootstrap🔗) 到 Headless (zag🔗React Aria🔗Radix UI🔗)框架盛行

經歷過太多的跌宕變化,這篇文章紀錄我認為現階段可以怎麼打造高效率可維護的前端。

坑點一:在不穩定的基礎上建立測試

打造自製的 UI 看似簡單,實際要處理的邊界情況(如瀏覽器差異、無障礙 a11y、鍵盤操作)極為複雜。

大多時候甚至不需要去製作已經爛大街的 UI ,很多界面看起來很簡單但實際維護起來卻是地獄,瀏覽器差異、版本問題、複雜的環境有太多的變因在網頁環境當中,舉例:Radix 一個看似簡單的 Dropdown Menu 就耗費數月上千個 commit 來完善

建立測試需要花費代價,自動化測試應專注於產生價值的代碼:「業務邏輯是否行為正確且可被自動驗證?」

坑點二:速度與信心的兩難

網頁執行於瀏覽器環境中,自然要模擬瀏覽器進行測試,這也是傳統 E2E 測試方案如 Cypress🔗Playwright🔗的強項,而另一方向是透過模擬瀏覽器環境與 API 如 jsdom🔗 來達成在 Node.js 環境模擬測試網頁的目的。

  • 模擬真實瀏覽器永遠太慢太貴。
  • 模擬假的瀏覽器環境又存在許多與真實瀏覽器偏移的問題。
    • 我無法表達光是一個輕微的 jsdom 模擬瀏覽器上的實踐差異就可能造成數小時的 Debug 有多惱人,很多奇怪的問題真的會需要參考成熟的大型專案如 Reka UI 的測試代碼🔗才知道哪些變通方案是必須的。

這也是為什麼 Cypress Component Testing🔗Playwright Components🔗Vitest Browser Mode🔗會出現,為了在現代網頁測試的「速度」與「信心」之間找到一個更優的平衡點,這些技術目前都還在實驗路上。了解測試目的與工具的差異並做出取捨。

坑點三:被遺忘的測試

很多專案寫了測試,但因為太慢、太不穩定(Flaky),導致:

  • 錯誤的測試:一個不穩定測試對團隊信心的打擊,比沒有測試還嚴重。
  • 測試只在被執行時才有價值:上一份工作的測試心得總結 為什麼要替軟體進行測試?
  • 反饋速度: 讓測試能快速運行,開發者才願意在開發中頻繁執行它。

延伸閱讀