テストプロジェクト
WARNING
この機能は workspace
とも呼ばれます。workspace
は 3.2 で廃止され、projects
構成に置き換えられました。機能的には同じです。
Vitestでは、単一のVitestプロセス内で複数のプロジェクト設定を定義できます。この機能は特にモノレポのセットアップに役立ちますが、resolve.alias
、plugins
、test.browser
など、異なる設定でテストを実行する際にも活用できます。
プロジェクトの定義
ルートの設定でプロジェクトを定義できます。
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
プロジェクト設定は、インライン設定、ファイル、またはプロジェクトを参照するグロブパターンで構成されます。例えば、プロジェクトを含むpackages
という名前のフォルダーがある場合、ルートのVitest設定で配列を定義できます。
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*'],
},
});
Vitestは、packages
内のすべてのフォルダーを、設定ファイルが内部になくても個別のプロジェクトとして扱います。このグロブパターンが_いずれかのファイル_に一致する場合、その名前にvitest
が含まれていなくても、あるいは不明なファイル拡張子を持っていても、Vitest設定と見なされます。
WARNING
Vitestは、ルートのvitest.config
ファイルを、設定で明示的に指定されない限りプロジェクトとして扱いません。そのため、ルート設定はreporters
やcoverage
といったグローバルオプションにのみ影響します。Vitestは、ルート設定ファイルで指定されたapply
、config
、configResolved
、configureServer
といった特定のプラグインフックを常に実行する点に注意してください。Vitestは、グローバルセットアップとカスタムカバレッジプロバイダーを実行するためにも同じプラグインを使用します。
設定ファイルでプロジェクトを参照することもできます。
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
projects: ['packages/*/vitest.config.{e2e,unit}.ts'],
},
});
このパターンは、拡張子名の前にe2e
またはunit
が含まれるvitest.config
ファイルを持つプロジェクトのみを含めます。
インライン設定を用いてプロジェクトを定義することも可能です。設定は両方の構文に同時に対応しています。
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は番号を割り当てます。グロブ構文で定義されたプロジェクト設定の場合、Vitestはデフォルトで最も近いpackage.json
ファイルの「name」プロパティを使用します。存在しない場合は、フォルダー名が使用されます。
プロジェクトはすべての設定プロパティをサポートしているわけではありません。型安全性を高めるために、プロジェクト設定ファイル内ではdefineConfig
の代わりにdefineProject
メソッドを使用してください。
// @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 run test
単一のプロジェクト内でのみテストを実行する必要がある場合は、--project
CLIオプションを使用します。
npm run test --project e2e
yarn test --project e2e
pnpm run test --project e2e
bun run 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 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',
},
})
);
また、extends
オプションを使用してルートレベルの設定から継承することも可能です。すべてのオプションがマージされます。
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';
export default defineConfig({
plugins: [react()],
test: {
pool: 'threads',
projects: [
{
// プラグインやプールなど、この設定からオプションを継承します
extends: true,
test: {
name: 'unit',
include: ['**/*.unit.test.ts'],
},
},
{
// この設定からオプションを継承しません
// これがデフォルトの動作です
extends: false,
test: {
name: 'integration',
include: ['**/*.integration.test.ts'],
},
},
],
},
});
サポートされていないオプション
一部の設定オプションはプロジェクト設定では許可されていません。特に次のとおりです。
coverage
: カバレッジはプロセス全体に対して行われますreporters
: ルートレベルのレポーターのみがサポートされますresolveSnapshotPath
: ルートレベルのリゾルバーのみが尊重されます- テストランナーに影響しないその他のすべてのオプション
プロジェクト設定内でサポートされていないすべての設定オプションは、"Config"ガイドで*の記号でマークされています。それらはルート設定ファイルで一度定義する必要があります。