テストの実行
WARNING
このガイドでは、Node.js スクリプトを介してテストを実行するための高度な API の使用方法を説明します。単にテストを実行したい場合は、通常この内容は必要ありません。これは主にライブラリの作者が使用することを想定しています。
実験的な API を使用する場合は、破壊的変更が SemVer に従わない可能性があるため、Vitest のバージョンを固定してください。
Vitest は、テスト実行を開始するための2つのメソッドを提供しています。
startVitest
: Vitest を起動し、必要なパッケージがインストールされていることを検証した後、すぐにテストを実行します。createVitest
: Vitest を起動するだけで、テストは実行しません。
startVitest
import { startVitest } from 'vitest/node';
const vitest = await startVitest(
'test',
[], // CLI フィルター
{}, // テスト設定を上書き
{}, // Vite 設定を上書き
{} // カスタム Vitest オプション
);
const testModules = vitest.state.getTestModules();
for (const testModule of testModules) {
console.log(testModule.moduleId, testModule.ok() ? 'passed' : 'failed');
}
TIP
TestModule
、TestSuite
、および TestCase
API は実験的なものではなく、Vitest 2.1 以降 SemVer に準拠しています。
createVitest
テストを実行せずに Vitest インスタンスを作成します。
createVitest
メソッドは、必要なパッケージがインストールされていることを検証しません。また、config.standalone
や config.mergeReports
の設定も適用されません。watch
が無効になっていても、Vitest は自動的に終了しません。
import { createVitest } from 'vitest/node';
const vitest = await createVitest(
'test',
{}, // テスト設定を上書き
{}, // Vite 設定を上書き
{} // カスタム Vitest オプション
);
// `vitest.cancelCurrentRun()` が呼び出されたときに実行される
vitest.onCancel(() => {});
// `vitest.close()` 呼び出し中に実行される
vitest.onClose(() => {});
// Vitest がテストファイルを再実行するときに実行される
vitest.onTestsRerun(files => {});
try {
// テストが失敗した場合、process.exitCode を 1 に設定しますが、
// プロセスは自動的に閉じません。
await vitest.start(['my-filter']);
} catch (err) {
// これは以下のエラーをスローする可能性があります:
// - ファイルが見つからなかった場合は "FilesNotFoundError"
// - `--changed` でリポジトリが初期化されていない場合は "GitNotFoundError"
} finally {
await vitest.close();
}
Vitest
インスタンスを保持する予定がある場合は、少なくとも init
を呼び出すようにしてください。これにより、レポーターとカバレッジプロバイダーが初期化されますが、テストは実行されません。Vitest のウォッチ機能を使用しない場合でも、インスタンスを実行し続けたい場合は、watch
モードを有効にすることをお勧めします。Vitest は、一部の機能が継続的なプロセスで正しく動作するために、このフラグに依存しています。
レポーターの初期化後、手動でテストを実行する必要がある場合は、runTestSpecifications
または rerunTestSpecifications
を使用します。
watcher.on('change', async file => {
const specifications = vitest.getModuleSpecifications(file);
if (specifications.length) {
vitest.invalidateFile(file);
// "reporter.onWatcher*" フックを呼び出したくない場合は、
// runTestSpecifications を使用できます。
await vitest.rerunTestSpecifications(specifications);
}
});
WARNING
上記の例は、デフォルトのウォッチャー動作を無効にした場合のユースケースを示しています。デフォルトでは、Vitest はファイル変更時に自動的にテストを再実行します。
また、getModuleSpecifications
は、globTestSpecifications
によってすでに処理されていない限り、テストファイルを解決しないことに注意してください。新規作成されたファイルの場合は、代わりに project.matchesGlobPattern
を使用してください。
watcher.on('add', async file => {
const specifications = [];
for (const project of vitest.projects) {
if (project.matchesGlobPattern(file)) {
specifications.push(project.createSpecification(file));
}
}
if (specifications.length) {
await vitest.rerunTestSpecifications(specifications);
}
});
ウォッチ機能を無効にする必要がある場合は、Vite 5.3 以降では server.watch: null
を、または Vite 設定に server.watch: { ignored: ['*/*'] }
を渡すことができます。
await createVitest(
'test',
{},
{
plugins: [
{
name: 'stop-watcher',
async configureServer(server) {
await server.watcher.close();
},
},
],
server: {
watch: null,
},
}
);