跳至内容

工作区

示例项目

GitHub - 在线体验

Vitest 通过工作区配置文件为单仓库提供内置支持。您可以创建工作区来定义项目的设置。

定义工作区

工作区应该在其根目录(如果您有配置文件,则与配置文件在同一文件夹中)中包含一个 vitest.workspacevitest.projects 文件。Vitest 支持此文件的 ts/js/json 扩展名。

工作区配置文件应该有一个默认导出,其中包含一个文件或 glob 模式列表,这些文件或 glob 模式引用您的项目。例如,如果您有一个名为 packages 的文件夹包含您的项目,您可以使用此配置文件定义一个工作区

ts
export default [
  'packages/*'
]

Vitest 将考虑 packages 中的每个文件夹作为一个单独的项目,即使它内部没有配置文件。

警告

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 文件的包,它有自己的配置文件,但某些文件未在您的测试中导入,覆盖率将失败,因为它试图分析未使用文件的用法,因为它依赖于根配置而不是项目配置。