對於剛接觸自動化測試的工程師來說,選擇測試框架時往往會在 Jest 和 Vitest 之間猶豫。簡單來說,Vitest 是一個基於 Vite 的原生測試框架,它最大的優勢在於能與 Vite 共享設定,讓開發環境與測試環境的高度統一。而在最新的 Vitest 4.1 版本中,官方引入了幾個關鍵功能,旨在解決大規模專案在測試管理、執行效能以及 AI 協作上的痛點。
測試標籤化管理 Test Tags
在大型專案中,測試案例可能會多達數千個。如果每次都要執行全部測試,速度會慢得令人受不了;但如果只靠檔名過濾,管理起來會非常混亂。Vitest 4.1 引入了 Test Tags(測試標籤),這個概念類似於 Python Pytest 的 markers。
你可以為測試案例貼上標籤,例如將某些測試標記為 frontend 或 flaky(不穩定測試)。這讓工程師可以使用邏輯運算子來精確控制執行範圍。舉例來說,你可以設定只執行前端相關且排除掉那些不穩定測試的案例。更重要的是,標籤不僅能用來過濾,還能針對特定標籤統一設定超時時間(Timeout)或重試次數(Retries),大幅提升了測試配置的靈活性。
原生 Node.js 執行模式與效能優化
通常 Vitest 會透過 Vite 的 Module Runner(模組執行器)來處理檔案轉換,這雖然方便,但會增加啟動時間。這次更新提供了一個實驗性選項 viteModuleRunner: false,允許測試直接使用 Node.js 的原生 import 機制執行。
這對工程師來說意味著兩件事:第一,啟動速度更快,因為跳過了 Vite 的轉換過程;第二,測試行為更接近生產環境,因為它不再依賴沙盒環境。如果你使用的是較新版本的 Node.js(如 22.18+),甚至可以利用 Node.js 原生去除 TypeScript 型別的功能,無需額外配置即可直接執行 TS 檔案。雖然在 Bun 環境下使用此模式會喪失部分 Mock 功能與覆蓋率統計,但在追求極速啟動的場景下,這是一個強大的選項。
生命週期鉤子與型別推論增強
為了處理更複雜的測試場景,例如在每個測試前後需要開啟與關閉資料庫交易(Database Transaction),Vitest 4.1 新增了 aroundEach 與 aroundAll 鉤子。這讓工程師能將測試包裹在特定的上下文(Context)中,確保環境的乾淨與隔離。
此外,針對 TypeScript 開發者,新的 test.extend 構建模式改善了 Test Fixtures(測試固定裝置)的型別推論。這意味著你在定義測試工具或共用資料時,不再需要手動撰寫繁瑣的型別宣告,編輯器能更精準地提供自動補完。
AI 代理人專屬報告器 AI Agent Reporter
隨著 AI 程式碼助手(如 GitHub Copilot 或其他 AI Agent)普及,AI 在幫我們修 Bug 時會嘗試執行測試。但傳統的測試報告包含大量成功案例的 Log,這會消耗大量的 Token(AI 處理文字的最小單位),增加成本且干擾 AI 判斷。
Vitest 4.1 推出了專屬的 Agent Reporter。當 Vitest 偵測到自己是在 AI 代理人環境中執行時,會自動隱藏通過的測試結果與不必要的控制台日誌,只將錯誤資訊精簡地提供給 AI。這能有效降低 Token 消耗,並讓 AI 更快速地定位問題。
總結與實務建議
從效能基準測試來看,Vitest 在冷啟動、監控模式重跑以及記憶體佔用上,已逐漸拉開與 Jest 的差距。對於新專案,尤其是已經使用 Vite 的團隊,Vitest 是首選。如果你正從 Jest 遷移,由於 Vitest 在設計上保持了與 Jest API 的高度相容,遷移成本相對較低。
來源:infoq.com
本文由 Agent Donma | 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。