Skip to content

测试项目

示例项目

GitHub - 在线试玩

WARNING

此功能也称为 workspaceworkspace 自 3.2 版本起已被废弃,并由 projects 配置取代。它们的功能是相同的。

Vitest 提供了一种在单个 Vitest 进程中定义多个项目配置的方法。此功能特别适用于 monorepo 结构,也可以用于使用不同配置运行测试,例如 resolve.aliaspluginstest.browser 等。

定义项目

你可以在根目录的 配置文件 中定义项目:

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    projects: ['packages/*'],
  },
})

项目配置可以是内联配置、文件或指向项目的 glob 模式。例如,如果你有一个名为 packages 的文件夹包含多个项目,可以在根 Vitest 配置中定义一个数组:

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    projects: ['packages/*'],
  },
})

Vitest 会将 packages 中的每个文件夹视为独立项目,即使其中没有配置文件。如果该 glob 模式匹配到 任意文件,它将被视为 Vitest 配置,即使文件名中没有包含 vitest 或文件扩展名不常见。

WARNING

Vitest 不会将根目录的 vitest.config 文件视为项目,除非在配置中显式指定。因此,根配置只会影响全局选项,如 reporterscoverage。但 Vitest 总会执行根配置文件中指定的某些插件钩子,如 applyconfigconfigResolvedconfigureServer。Vitest 也会使用相同的插件执行全局设置和自定义覆盖提供者。

你也可以用配置文件路径来引用项目:

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    projects: ['packages/*/vitest.config.{e2e,unit}.ts'],
  },
})

此模式只会包含带有 e2eunit 字样的 vitest.config 文件的项目。

你还可以使用内联配置定义项目。两种语法可以同时使用。

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    projects: [
      // 匹配 packages 文件夹下的所有文件和文件夹
      'packages/*',
      {
        // 添加 "extends: true" 继承根配置中的选项
        extends: true,
        test: {
          include: ['tests/**/*.{browser}.test.{ts,js}'],
          // 建议内联配置时定义项目名称
          name: 'happy-dom',
          environment: 'happy-dom',
        }
      },
      {
        test: {
          include: ['tests/**/*.{node}.test.{ts,js}'],
          // 名称标签颜色可自定义
          name: { label: 'node', color: 'green' },
          environment: 'node',
        }
      }
    ]
  }
})

WARNING

所有项目名称必须唯一,否则 Vitest 会报错。如果内联配置未提供名称,Vitest 会自动分配数字。对于使用 glob 语法定义的项目,Vitest 会默认使用最近的 package.json 文件中的 "name" 属性,若无则使用文件夹名称。

项目配置不支持所有配置属性。为获得更好的类型安全,建议在项目配置文件中使用 defineProject 方法而非 defineConfig

packages/a/vitest.config.ts
ts
import { 
defineProject
} from 'vitest/config'
export default
defineProject
({
test
: {
environment
: 'jsdom',
// "reporters" 不支持在项目配置中使用, // 因此会报错 reporters: ['json']
No overload matches this call. The last overload gave the following error. Object literal may only specify known properties, and 'reporters' does not exist in type 'ProjectConfig'.
} })

运行测试

在根目录的 package.json 中定义脚本:

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

然后使用包管理器运行测试:

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

如果只想运行某个单独项目中的测试,可以使用 --project CLI 选项:

bash
npm run test --project e2e
bash
yarn test --project e2e
bash
pnpm run test --project e2e
bash
bun run test --project e2e

TIP

CLI 选项 --project 可以多次使用,以筛选多个项目:

bash
npm run test --project e2e --project unit
bash
yarn test --project e2e --project unit
bash
pnpm run test --project e2e --project unit
bash
bun run test --project e2e --project unit

配置说明

项目配置不会继承根配置文件中的选项。你可以创建共享配置文件,并在项目配置中手动合并:

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

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

另外,你可以使用 extends 选项继承根配置,所有选项都会被合并。

vitest.config.ts
ts
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'

export default defineConfig({
  plugins: [react()],
  test: {
    pool: 'threads',
    projects: [
      {
        // 继承此配置的选项,如 plugins 和 pool
        extends: true,
        test: {
          name: 'unit',
          include: ['**/*.unit.test.ts'],
        },
      },
      {
        // 不继承任何此配置的选项
        // 这是默认行为
        extends: false,
        test: {
          name: 'integration',
          include: ['**/*.integration.test.ts'],
        },
      },
    ],
  },
})

不支持的选项

部分配置选项不允许在项目配置中使用,主要包括:

  • coverage:覆盖率统计针对整个进程
  • reporters:只支持根级别的 reporters
  • resolveSnapshotPath:只尊重根级别的快照路径解析器
  • 其他不影响测试运行器的选项

所有不支持在项目配置中使用的配置选项,在 "配置" 指南中会用 * 标记。它们必须在根配置文件中定义一次。

Released under the MIT License.