自動化測試可以幫助你的團隊快速且自信地建立複雜的 Vue 專案,Vue 鼓勵你把你的專案切成可測試的函式、模組、類別與元件。因為就和任何新專案一樣,你的 Vue 專案可能以任何形式崩潰,所以測試就變得相當重要。(簡單來說就是可以利用測試確保的你的專案符合你的需求,或是幫助你找出 bug 等等)
這篇文章會介紹一些基本的技術並且提供可以使用在 Vue3 的推薦工具。
還有一個專門介紹 Vue 專屬的組合式函式測試方式的章節
越早越好,最好是專案建立時就能建立測試方法
當你在設計 Vue 的測試策略時,要考慮下面幾種測試
一般來說,單元測試會驗證函式的邏輯以及正確性
除了函式之外,在 Vue 中還有兩個東西需要單元測試
一般來說在測試組合式函式時,會分成兩個類別: 與元件有關聯的組合式函式和與元件無關的組合式函式。
如果組合式函式有用到以下 API ,表式它和元件有關:
如果只有使用到 Reactivity API,只要用 assert 就可以測試了(和一般的 unit test 一樣)
單如果牽扯到其他 API,或是使用了 Provide / Inject,它就必須被包在元件內來測試
等於說我們要建立並渲染一個測試用組件來測試我們的組合式函式。
如果要更複雜,包在元件裡面並使用元件測試會比較容易。
一個元件可以用以下兩種方式來測試:
因為在 Vue 中,元件是組成 UI 的基本架構,一般來說組件測試位於單元測試之上,可以被視為一種整合測試,所以你的測試應該要涵蓋到你 Vue 專案大部分功能,我們建議每個Vue組件都應該有自己的規格文件。
組件測試應該捕捉與你的組件相關的問題,包括組件的屬性(props)、事件(events)、提供的插槽(slots)、樣式、類別(classes)、生命周期鉤子等等。
元件測試不應該模擬子組件,而應該通過像使用者一樣與元件進行互動來測試元件與其子元件之間的互動。例如,元件測試應該像使用者一樣點擊元素,而不是以程式與組件進行互動。
元件測試應該專注於元件的介面,而不是內部實現細節。對於大多數元件來說,介面僅限於:發出的事件、屬性(props)和插槽。在進行測試時,請記住測試元件的功能,而不是它的實現方式。
對於視覺上的測試: 根據輸入的 prop 和插槽斷言渲染輸出是否正確。
對於互動上的測試: 斷言渲染的更新是否正確,或者觸發的事件是否正確地回應了用戶輸入事件。
官網提供的例子
不要斷言元件的 private 方法或是 private 狀態,寫這麼細會使得你的測試程式碼太脆弱,可能你內部方法有個小地方更改你就必須整個測試重寫。
元件最終的目標就是渲染 DOM 元素,所以只要專注在這上面就好。
不要完全依賴快照(snapshot),斷言 HTML 字串並不能完全說明正確性
如果一個方法需要測試,那就把他單獨提取出來並為他專門寫一個獨立的單元測試,如果他不能直接抽出來那他就該被視為元件、整合或是 e2e 測試的一部份。
Vitest 與 其他基於瀏覽器運行的工具不同之處在於運行速度與執行的上下文。簡而言之,基於瀏覽器的運行器(例如 Cypress)能夠捕捉到基於 Node 的運行器(如 Vitest)所無法捕捉到的問題(如樣式問題、原生 DOM 事件、Cookies、本地儲存和網路故障),但基於瀏覽器的運行器比 Vitest 慢數倍,因為它們需要執行開啟瀏覽器、編譯樣式表等步驟。請閱讀 Vitest 文件中的「比較」章節以了解 Vitest 和 Cypress 的差異。
我們建議在應用程式中使用 @vue/test-utils 來測試組件。在測試帶有 Suspense 的異步組件時,使用 @testing-library/vue 可能會遇到問題,因此在使用時需要謹慎考慮。
E2E 測試的重點: 使用者實際在使用你的應用程式時到底會遇到什麼問題。通常,這些測試可以捕捉到與路由、狀態管理庫、頂級元件(通常是 App 或 Layout)、公共資源或任何請求處理相關的問題。如上所述,它們能夠捕捉到單元測試或元件測試無法捕捉到的關鍵問題。
安裝與設定 Vitest
撰寫測試文件
添加命令