與其他測試執行器的比較
Jest
Jest 透過為大多數 JavaScript 專案提供開箱即用的支援、易用的 API(it
和 expect
),以及大多數設定所需的完整測試功能(快照、模擬、覆蓋率),在測試框架領域中佔據了主導地位。我們感謝 Jest 團隊和社群創造了令人愉悅的測試 API,並促成了許多現已成為網路生態系統標準的測試模式。
您可以在 Vite 設定中使用 Jest。@sodatea 開發了 vite-jest,旨在為 Jest 提供一流的 Vite 整合。Jest 中最後的 問題 已被解決,因此這對於您的單元測試來說是一個有效的選項。
然而,在一個 Vite 已能支援大多數常見網路工具(TypeScript、JSX、最流行的 UI 框架)的環境中,Jest 則代表了重複的複雜性。如果您的應用程式由 Vite 提供支援,那麼擁有兩個不同的管道來配置和維護是不合適的。使用 Vitest,您可以將開發、建置和測試環境的配置整合為單一管道,共享相同的插件和相同的 vite.config.js。
即使您的函式庫沒有使用 Vite(例如,如果它是使用 esbuild 或 Rollup 建置的),Vitest 仍然是一個值得考慮的選項,因為它能讓您的單元測試執行得更快,並且由於使用 Vite 即時熱模組重新載入(HMR)的預設監聽模式,能顯著提升開發者體驗 (DX)。Vitest 提供了與大多數 Jest API 和生態系統函式庫的相容性,因此在大多數專案中,它應該能直接取代 Jest。
Cypress
Cypress 是一個基於瀏覽器的測試執行器,也是 Vitest 的補充工具。如果您想使用 Cypress,我們建議將 Vitest 用於應用程式中的所有無頭邏輯,並將 Cypress 用於所有基於瀏覽器的邏輯。
Cypress 被稱為端到端測試工具,但其新的元件測試執行器對測試 Vite 元件有極佳的支援,是測試任何在瀏覽器中渲染內容的理想選擇。
基於瀏覽器的執行器,如 Cypress、WebdriverIO 和 Web Test Runner,將會捕捉到 Vitest 無法捕捉到的問題,因為它們使用真實的瀏覽器和真實的瀏覽器 API。
Cypress 的測試核心專注於判斷元素是否可見、可訪問和可互動。Cypress 專為 UI 開發和測試而設計,其開發者體驗 (DX) 的核心在於驅動測試您的視覺元件。您會看到您的元件與測試報告一同渲染。一旦測試完成,元件仍可保持互動性,您可以使用瀏覽器開發者工具除錯任何發生的錯誤。
相比之下,Vitest 專注於為極速的「無頭」測試提供最佳的開發者體驗 (DX)。像 Vitest 這樣的基於 Node 的執行器支援各種部分實現的瀏覽器環境,例如 jsdom
,它們提供了足夠的功能,讓您可以快速單元測試任何引用瀏覽器 API 的程式碼。代價是這些瀏覽器環境在實現功能方面存在限制。例如,jsdom 缺少許多功能,例如 window.navigation
或排版引擎(offsetTop
等)。
最後,與 Web Test Runner 相比,Cypress 測試執行器更像是一個 IDE,而非單純的測試執行器,因為您還可以在瀏覽器中看到真實渲染的元件,以及其測試結果和日誌。
Cypress 也一直在將 Vite 整合到他們的產品中:使用 Vitesse 重建其應用程式的 UI,並利用 Vite 來推動其專案開發。
我們認為 Cypress 並不適合用於單元測試無頭程式碼,但若結合使用 Cypress(用於 E2E 和元件測試)與 Vitest(用於單元測試),則能滿足您應用程式的測試需求。
WebdriverIO
WebdriverIO 與 Cypress 類似,是另一種基於瀏覽器的測試執行器,也是 Vitest 的補充工具。它可以用作端到端測試工具,也可以用於測試 web 元件。它甚至在內部使用了 Vitest 的部分元件,例如用於元件測試中的模擬和存根。
WebdriverIO 具有與 Cypress 相同的優勢,讓您可以在真實瀏覽器中測試您的邏輯。然而,它使用實際的 web 標準 進行自動化,這克服了在 Cypress 中執行測試時的一些取捨和限制。此外,它還允許您在行動裝置上執行測試,讓您能夠在更多環境中測試您的應用程式。
Web Test Runner
@web/test-runner 在無頭瀏覽器中執行測試,提供與您的網路應用程式相同的執行環境,且無需模擬瀏覽器 API 或 DOM。這也使得在真實瀏覽器中使用開發者工具進行調試成為可能,儘管不像 Cypress 測試那樣,沒有顯示用於逐步執行測試步驟的 UI。
若要將 @web/test-runner 與 Vite 專案搭配使用,請安裝 @remcovaes/web-test-runner-vite-plugin。@web/test-runner 不包含斷言或模擬函式庫,因此需要您自行添加。
uvu
uvu 是一個適用於 Node.js 和瀏覽器的測試執行器。它在單一線程中執行測試,因此測試之間不隔離,可能會互相影響或洩漏到其他檔案。然而,Vitest 使用工作線程來隔離測試並平行執行。
在轉換程式碼方面,uvu 依賴於 require 和 loader 鉤子。Vitest 使用 Vite,因此檔案能透過 Vite 插件系統的強大功能進行轉換。在一個 Vite 已能支援大多數常見網路工具(TypeScript、JSX、最流行的 UI 框架)的環境中,uvu 則代表了複雜度的重複。如果您的應用程式由 Vite 提供支援,那麼擁有兩個不同的管道來配置和維護是不合適的。使用 Vitest,您可以將開發、建置和測試環境的配置整合為單一管道,共享相同的插件和相同的配置。
uvu 不提供智慧監聽模式來重新執行已變更的測試,而 Vitest 由於使用 Vite 即時熱模組重新載入(HMR)的預設監聽模式,能顯著提升您的開發者體驗 (DX)。
uvu 是執行簡單測試的快速選擇,但 Vitest 對於更複雜的測試和專案來說可能更快、更可靠。