カスタムプール
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';
// ---cut---
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>;
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/node
のcreateMethodsRPC
を使用してメソッドオブジェクトを作成し、任意の通信方式を使用できます。たとえば、birpc
で WebSocket を使用するには、次のように記述できます。
import { createBirpc } from 'birpc';
import { parse, stringify } from 'flatted';
import { WorkspaceProject, createMethodsRPC } 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にあります。