カスタムプール
WARNING
これは高度で非常に低レベルなAPIです。単にテストを実行したいだけであれば、おそらく必要ありません。主にライブラリの作者によって使用されます。
Vitestはプールを使用してテストを実行します。デフォルトでは、いくつかのプールが用意されています。
threads:node:worker_threadsを使用してテストを実行します(新しいワーカーコンテキストによる分離を提供します)。forks:node:child_processを使用してテストを実行します(新しいchild_process.forkプロセスによる分離を提供します)。vmThreads:node:worker_threadsを使用してテストを実行します(ただし、新しいワーカーコンテキストではなくvmモジュールによる分離を提供します)。browser: ブラウザプロバイダーを使用してテストを実行します。typescript: テストの型チェックを実行します。
ファイルパスを指定することで、独自のプールを提供できます。
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
// デフォルトでは、全てのファイルがカスタムプールで実行されます
pool: './my-custom-pool.ts',
// `poolOptions` オブジェクトを使用してオプションを提供できます
poolOptions: {
myCustomPool: {
customProperty: true,
},
},
},
});異なるプールでテストを実行する必要がある場合は、projects 機能を使用してください。
export default defineConfig({
test: {
projects: [
{
extends: true,
test: {
pool: 'threads',
},
},
],
},
});API
pool オプションで指定されたファイルは、Vitest インターフェースを最初の引数として受け入れる関数(非同期でも可)をエクスポートする必要があります。この関数は ProcessPool インターフェースに一致するオブジェクトを返す必要があります。
import type { ProcessPool, TestSpecification } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: TestSpecification[],
invalidates?: string[]
) => Promise<void>;
collectTests: (
files: TestSpecification[],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}この関数は一度だけ呼び出されます(サーバー設定が更新されない限り)。通常、テストに必要なすべての初期化をこの関数内で行い、runTests が呼び出されたときに再利用するのが良いでしょう。
Vitestは新しいテストの実行がスケジュールされたときに runTests を呼び出します。files が空の場合は呼び出しません。最初の引数は TestSpecifications の配列です。runTests が呼び出される前に、ファイルは sequencer を使用してソートされます。同じファイルが2回含まれる可能性は低いですが、その場合でも常に異なるプロジェクトに属します。これは projects 設定を介して実装されています。
Vitestは実行を終了する前に runTests の完了を待ちます(つまり、runTests が解決された後にのみ onFinished を発行します)。
カスタムプールを使用する場合、テストファイルとその結果を自前で用意する必要があります。そのためには vitest.state を参照できます(特に collectFiles と updateTasks が重要です)。Vitestは @vitest/runner パッケージの startTests 関数を使ってこれを行います。
vitest.collect が呼び出された場合、またはCLIコマンドを介して vitest list が呼び出された場合、Vitestは collectTests を呼び出します。これは runTests と同じように機能しますが、テストコールバックを実行する必要はなく、vitest.state.collectFiles(files) を呼び出すことでタスクを報告するだけで済みます。
異なるプロセス間で通信するには、vitest/node から createMethodsRPC を使用してメソッドオブジェクトを作成し、任意の通信手段を利用できます。たとえば、birpc でWebSocketsを使用するには、次のように記述します。
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { createMethodsRPC, TestProject } from 'vitest/node';
function createRpc(project: TestProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}テストを実行せずに収集済みとしてマークする、ゼロから作成されたプールの簡単な例は、pool/custom-pool.ts で確認できます。