Рабочая область
Пример проекта
Vitest предоставляет возможность определять несколько конфигураций проекта в рамках одного процесса Vitest. Эта функция особенно полезна для монорепозиториев, но также может использоваться для запуска тестов с различными конфигурациями, такими как resolve.alias
, plugins
, test.browser
и другими.
Определение рабочей области
Рабочая область должна включать файл vitest.workspace
или vitest.projects
в своей корневой директории (расположенной в той же папке, что и ваш корневой файл конфигурации, или в рабочем каталоге, если он не существует). Vitest поддерживает расширения ts
, js
и json
для этого файла.
ИМЕНОВАНИЕ
Обратите внимание, что эта функция называется workspace
, а не workspaces
(без "s" в конце).
Файл конфигурации рабочей области должен иметь экспорт по умолчанию со списком файлов или шаблонов glob, указывающих на ваши проекты. Например, если у вас есть папка с именем packages
, которая содержит ваши проекты, вы можете определить рабочую область с этим файлом конфигурации:
export default ['packages/*'];
Vitest будет рассматривать каждую папку в packages
как отдельный проект, даже если файл конфигурации отсутствует. Начиная с Vitest 2.1, если этот шаблон glob совпадает с любым файлом, он будет считаться конфигурацией Vitest, даже если в его имени нет vitest
.
WARNING
Vitest не рассматривает корневой файл vitest.config
как проект рабочей области, если он явно не указан в конфигурации рабочей области. Следовательно, корневая конфигурация будет применяться только к глобальным параметрам, таким как reporters
и coverage
.
Вы также можете ссылаться на проекты по их файлам конфигурации:
export default ['packages/*/vitest.config.{e2e,unit}.ts'];
Этот шаблон будет включать только проекты с файлом vitest.config
, в имени которого есть e2e
или unit
перед расширением.
Вы также можете определять проекты, используя встроенную конфигурацию. Файл рабочей области поддерживает оба синтаксиса одновременно.
import { defineWorkspace } from 'vitest/config';
// defineWorkspace обеспечивает удобство разработки благодаря подсказкам типов
export default defineWorkspace([
// соответствует каждой папке и файлу внутри папки `packages`
'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 по умолчанию будет использовать свойство "name" в ближайшем файле package.json
или, если такое свойство отсутствует, имя папки.
Если вы не используете встроенные конфигурации, вы можете создать небольшой файл JSON в корневой директории:
["packages/*"]
Проекты рабочей области не поддерживают все параметры конфигурации. Для лучшей типобезопасности используйте метод defineProject
вместо defineConfig
в файлах конфигурации проекта:
// @errors: 2769
import { defineProject } from 'vitest/config';
export default defineProject({
test: {
environment: 'jsdom',
// "reporters" не поддерживается в конфигурации проекта,
// поэтому будет показана ошибка
reporters: ['json'],
},
});
Запуск тестов
Чтобы запустить тесты внутри рабочей области, определите скрипт в вашем корневом package.json
:
{
"scripts": {
"test": "vitest"
}
}
Теперь тесты можно запускать с помощью вашего пакетного менеджера:
npm run test
yarn test
pnpm run test
bun test
Если вам нужно запустить тесты только для одного проекта, используйте опцию CLI --project
:
npm run test --project e2e
yarn test --project e2e
pnpm run test --project e2e
bun test --project e2e
TIP
Опция CLI --project
может использоваться несколько раз для фильтрации нескольких проектов:
npm run test --project e2e --project unit
yarn test --project e2e --project unit
pnpm run test --project e2e --project unit
bun 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',
},
})
);
На уровне defineWorkspace
вы можете использовать опцию extends
для наследования корневой конфигурации. Все опции будут объединены.
import { defineWorkspace } from 'vitest/config';
export default defineWorkspace([
{
extends: './vitest.config.ts',
test: {
name: 'unit',
include: ['**/*.unit.test.ts'],
},
},
{
extends: './vitest.config.ts',
test: {
name: 'integration',
include: ['**/*.integration.test.ts'],
},
},
]);
Некоторые из опций конфигурации не разрешены в конфигурации проекта. Наиболее заметные:
coverage
: покрытие рассчитывается для всего рабочего пространстваreporters
: поддерживаются только репортеры, определенные на корневом уровнеresolveSnapshotPath
: используется только корневой резолвер- все остальные опции, которые не затрагивают тестовые раннеры
TIP
Все опции конфигурации, которые не поддерживаются в конфигурации проекта, обозначены знаком * в руководстве "Config".