跳至內容

工作區

範例專案

GitHub - 線上執行

Vitest 透過工作區設定檔提供對單一儲存庫的內建支援。你可以建立一個工作區來定義專案的設定。

定義工作區

工作區應在其根目錄(如果有的話,與設定檔在同一個資料夾)中有一個 vitest.workspacevitest.projects 檔。Vitest 支援此檔的 ts/js/json 副檔名。

工作區設定檔應具有預設匯出,其中包含檔案或 glob 模式清單,用於參照您的專案。例如,如果您有一個名為 packages 的資料夾,其中包含您的專案,您可以使用這個設定檔定義一個工作區

ts
export default [
  'packages/*'
]

即使 packages 中的每個資料夾內沒有設定檔,Vitest 仍會將其視為個別專案。

警告

除非在此設定檔中指定,否則 Vitest 不會將根設定檔視為工作區專案(因此不會執行在 include 中指定的測試)。

您也可以使用其設定檔參照專案

ts
export default [
  'packages/*/vitest.config.{e2e,unit}.ts'
]

此模式只會包含具有 vitest.config 檔案的專案,且該檔案在副檔名前包含 e2eunit

警告

如果您使用 glob 模式參照檔案名稱,請確保您的設定檔以 vite.configvitest.config 開頭。否則 Vitest 會略過它。

您也可以使用內嵌設定檔定義專案。工作區檔案同時支援使用這兩種語法。

ts
import {  } from 'vitest/config'

// defineWorkspace provides a nice type hinting DX
export default ([
  'packages/*',
  {
    // add "extends" to merge two configs together
    : './vite.config.js',
    : {
      : ['tests/**/*.{browser}.test.{ts,js}'],
      // it is recommended to define a name when using inline configs
      : 'happy-dom',
      : 'happy-dom',
    }
  },
  {
    : {
      : ['tests/**/*.{node}.test.{ts,js}'],
      : 'node',
      : 'node',
    }
  }
])

警告

所有專案都應具有唯一名稱。否則,Vitest 會擲回錯誤。如果您沒有在內嵌設定檔中提供名稱,Vitest 會指定一個數字。如果您沒有在使用 glob 語法定義的專案設定檔中提供名稱,Vitest 會預設使用目錄名稱。

如果您不依賴內嵌設定檔,您可以在根目錄中建立一個小型 json 檔案

json
[
  "packages/*"
]

工作區專案不支援所有設定屬性。為了更好的類型安全性,請在專案設定檔中使用 defineProject 方法,而不是 defineConfig 方法

ts
import {  } from 'vitest/config'

export default ({
  : {
    : 'jsdom',
    // "reporters" is not supported in a project config,
    // so it will show an error
    : ['json']
  }
})

執行測試

若要在工作區內執行測試,請在根目錄的 package.json 中定義一個指令碼

json
{
  "scripts": {
    "test": "vitest"
  }
}

現在可以使用您的套件管理員執行測試

bash
npm run test
bash
yarn test
bash
pnpm run test
bash
bun test

如果您只需要在單一專案中執行測試,請使用 --project CLI 選項

bash
npm run test --project e2e

提示

CLI 選項 --project 可以使用多次來篩選出多個專案

bash
npm run test --project e2e --project unit

設定

沒有任何設定選項會從根層級設定檔繼承。您可以建立一個共用設定檔,並自行與專案設定合併

ts
import { defineProject, mergeConfig } from 'vitest/config'
import configShared from '../vitest.shared.js'

export default mergeConfig(
  configShared,
  defineProject({
    test: {
      environment: 'jsdom',
    }
  })
)

此外,某些設定選項不允許在專案設定中使用。最顯著的是

  • coverage:涵蓋範圍是針對整個工作區進行
  • reporters:僅支援根層級的報告者
  • resolveSnapshotPath:僅尊重根層級的解析器
  • 所有其他不會影響測試執行器的選項

提示

所有在專案設定中不受支援的設定選項,在 "設定" 頁面上會在它們旁邊標示 * 符號。

涵蓋範圍

工作區專案的涵蓋範圍開箱即用。但如果您啟用了 all 選項,並在某些專案中使用非傳統擴充功能,您需要在根設定檔中有一個處理此擴充功能的外掛程式。

例如,如果您有一個使用 Vue 檔案的套件,並且它有自己的設定檔,但某些檔案未匯入測試中,涵蓋範圍將無法分析未使用的檔案的使用情況,因為它依賴於根設定,而不是專案設定。