Рабочая область
Пример проекта
Vitest предоставляет встроенную поддержку монорепозиториев (monorepos) через файл конфигурации рабочей области. Вы можете создать рабочую область, чтобы определить настройки для каждого проекта в вашем монорепозитории.
Определение рабочей области
Рабочая область определяется файлом vitest.workspace
или vitest.projects
в корневом каталоге (в той же папке, что и ваш основной файл конфигурации, если он существует). Vitest поддерживает расширения ts
, js
и json
для этого файла.
Файл конфигурации рабочей области должен содержать экспорт по умолчанию, представляющий собой список файлов или glob-паттернов, указывающих на ваши проекты. Например, если у вас есть папка packages
, содержащая ваши проекты, вы можете определить рабочую область следующим образом:
export default ['packages/*'];
Vitest будет рассматривать каждую папку в packages
как отдельный проект, даже если в ней нет собственного файла конфигурации.
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 предоставляет удобный интерфейс с подсказками типов
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
:
{
"scripts": {
"test": "vitest"
}
}
Теперь тесты можно запустить с помощью вашего пакетного менеджера:
npm run test
yarn test
pnpm run test
bun test
Если вам нужно запустить тесты только в одном проекте, используйте параметр командной строки --project
:
npm run test --project e2e
TIP
Параметр командной строки --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
: покрытие кода выполняется для всей рабочей областиreporters
: поддерживаются только репортеры корневого уровняresolveSnapshotPath
: учитывается только resolver корневого уровня- все остальные опции, не влияющие на тестовые раннеры.
TIP
Все опции конфигурации, не поддерживаемые в конфигурации проекта, отмечены знаком * на странице "Config".
Покрытие кода
Покрытие кода для проектов рабочей области работает сразу после установки. Но если у вас включена опция all
и вы используете нестандартные расширения файлов в некоторых из ваших проектов, вам потребуется плагин, который обрабатывает эти расширения в вашем корневом файле конфигурации.
Например, если у вас есть пакет, который использует Vue-файлы и имеет свой собственный файл конфигурации, но некоторые из этих файлов не импортируются в ваших тестах, покрытие кода завершится с ошибкой при попытке проанализировать неиспользуемые файлы. Это связано с тем, что используется корневая конфигурация, а не конфигурация проекта.