工作區
Vitest 透過工作區設定檔,提供對 monorepo(單一儲存庫)的內建支援。您可以建立一個工作區來定義專案的設定。
定義工作區
工作區的根目錄中應包含 vitest.workspace
或 vitest.projects
檔案(若有設定檔,則應位於同一資料夾)。Vitest 支援此檔案的 ts
/js
/json
副檔名。
工作區設定檔應有一個預設導出,包含引用您專案的檔案或 glob 樣式的清單。例如,如果您有一個名為 packages
的資料夾,其中包含您的專案,您可以使用此設定檔定義一個工作區:
export default ['packages/*'];
即使 packages
中的資料夾沒有設定檔,Vitest 仍會將其視為個別專案。
WARNING
除非在此設定中指定,否則 Vitest 不會將根設定視為工作區專案(因此不會執行 include
中指定的測試)。
您也可以使用專案的設定檔來引用專案:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];
此模式僅會包含檔名為 vitest.config
,且副檔名前包含 e2e
或 unit
的專案。
WARNING
若使用 glob 模式引用檔案名稱,請確保設定檔以 vite.config
或 vitest.config
開頭,否則 Vitest 將會略過。
您也可以使用行內設定定義專案。工作區檔案同時支援這兩種語法。
import { defineWorkspace } from 'vitest/config';
// defineWorkspace 提供良好的類型提示開發者體驗(DX)
export default defineWorkspace([
'packages/*',
{
// 使用 "extends" 合併兩個設定
extends: './vite.config.js',
test: {
include: ['tests/**/*.{browser}.test.{ts,js}'],
// 建議在使用行內設定時定義名稱
name: 'happy-dom',
environment: 'happy-dom',
},
},
{
test: {
include: ['tests/**/*.{node}.test.{ts,js}'],
name: 'node',
environment: 'node',
},
},
]);
WARNING
所有專案都應該有唯一的名稱。否則,Vitest 將會拋出錯誤。如果您沒有在行內設定中提供名稱,Vitest 將會分配一個數字。若未使用 glob 語法定義專案設定,且未提供名稱,Vitest 預設會使用目錄名稱。
如果您不依賴行內設定,只需在根目錄中建立一個小的 json 檔案:
["packages/*"]
工作區專案不支援所有的設定屬性。為了更好的類型安全,請在專案設定檔中使用 defineProject
而不是 defineConfig
方法:
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" 在專案設定中不受支援,
// 因此它會顯示一個錯誤
reporters: ['json'],
},
});
執行測試
若要在工作區內執行測試,請在根目錄的 package.json
中定義 script:
{
"scripts": {
"test": "vitest"
}
}
現在可以使用您的套件管理工具來執行測試:
npm run test
yarn test
pnpm run test
bun test
如果您只需在單個專案中執行測試,請使用 --project
CLI 選項:
npm run test --project e2e
TIP
CLI 選項 --project
可以多次使用,以篩選出多個專案:
npm run test --project e2e --project unit
設定
所有設定選項皆不會從根層級設定檔繼承。您可以建立一個共享的設定檔,並將其與專案設定合併:
import { defineProject, mergeConfig } from 'vitest/config';
import configShared from '../vitest.shared.js';
export default mergeConfig(
configShared,
defineProject({
test: {
environment: 'jsdom',
},
})
);
此外,某些設定選項在專案設定中是不允許的。最值得注意的是:
coverage
:coverage 是為整個工作區完成的reporters
:僅支援根層級的 reporterresolveSnapshotPath
:僅採用根層級的 resolver- 所有其他不影響測試運行器的選項
TIP
所有在專案設定中不受支援的設定選項,在 "Config" 頁面中都有 * 標記。
覆蓋率
工作區專案的覆蓋率功能可正常運作。但是,如果您啟用了 all
選項,並且在某些專案中使用了非傳統的副檔名,您需要在根設定檔中加入處理此副檔名的外掛。
例如,如果您有一個使用 Vue 檔案的套件,並且它有自己的設定檔,但是某些檔案沒有在您的測試中匯入,覆蓋率功能將會失敗,因為它依賴根設定而非專案設定,嘗試分析未使用檔案的情況。