カスタムプール
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,
},
},
// ファイルのサブセットに対してプールを指定することもできます
poolMatchGlobs: [['**/*.custom.test.ts', './my-custom-pool.ts']],
},
});API
poolオプションで指定するファイルは、Vitestインターフェースを第一引数として受け取る関数(非同期関数も可)をエクスポートする必要があります。この関数は、ProcessPoolインターフェースに適合するオブジェクトを返す必要があります。
import { ProcessPool, WorkspaceProject } from 'vitest/node';
export interface ProcessPool {
name: string;
runTests: (
files: [project: WorkspaceProject, testFile: string][],
invalidates?: string[]
) => Promise<void>;
collectTests: (
files: [project: WorkspaceProject, testFile: string][],
invalidates?: string[]
) => Promise<void>;
close?: () => Promise<void>;
}この関数は(サーバー設定が更新されない限り)一度だけ呼び出されます。一般的には、テストに必要なすべてのものをこの関数内で初期化し、runTestsが呼び出された際に再利用することをお勧めします。
Vitest は、新しいテストの実行がスケジュールされた場合にrunTestsを呼び出します。filesが空の場合、呼び出しは行われません。第一引数はタプルの配列で、最初の要素はワークスペースプロジェクトへの参照、2 番目の要素はテストファイルへの絶対パスです。ファイルは、runTestsが呼び出される前にsequencerを使用してソートされます。同じファイルが 2 回含まれる可能性もあります(まれですが)、常に異なるプロジェクトが関連付けられます。これはvitest.workspace.tsの設定によって実現されます。
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で WebSocket を使用するには、次のように記述できます。
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { createMethodsRPC, WorkspaceProject } from 'vitest/node';
function createRpc(project: WorkspaceProject, wss: WebSocketServer) {
return createBirpc(createMethodsRPC(project), {
post: msg => wss.send(msg),
on: fn => wss.on('message', fn),
serialize: stringify,
deserialize: parse,
});
}すべてのテストを確実に収集するには、ctx.state.collectFilesを呼び出し、その結果を Vitest レポーターに通知します。
async function runTests(project: WorkspaceProject, tests: string[]) {
// ... テストを実行し、"files"と"tasks"に格納します
const methods = createMethodsRPC(project);
await methods.onCollected(files);
// ほとんどのレポーターは"onTaskUpdate"による結果の更新に依存しています
await methods.onTaskUpdate(tasks);
}簡単な例は、pool/custom-pool.tsにあります。