カスタムプール
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 で確認できます。