カスタムプール
警告
これは高度なAPIです。単にテストを実行するだけなら、おそらくこれは必要ありません。主にライブラリの作成者によって使用されます。
Vitestはプール内でテストを実行します。デフォルトでは、いくつかのプールがあります。
threads
:node:worker_threads
を使用してテストを実行します(新しいワーカーコンテキストで分離が提供されます)。forks
:node:child_process
を使用してテストを実行します(新しいchild_process.fork
プロセスで分離が提供されます)。vmThreads
:node:worker_threads
を使用してテストを実行します(ただし、新しいワーカーコンテキストではなくvm
モジュールで分離が提供されます)。browser
: ブラウザプロバイダーを使用してテストを実行します。typescript
: テストで型チェックを実行します。
ファイルパスを指定することで、独自のプールを提供できます。
export default ({
: {
// will run every file with a custom pool by default
: './my-custom-pool.ts',
// you can provide options using `poolOptions` object
: {
: {
: true,
},
},
// you can also specify pool for a subset of files
: [
['**/*.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
でWebSocketsを使用するには、次のように記述できます。
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[]) {
// ... running tests, put into "files" and "tasks"
const methods = createMethodsRPC(project)
await methods.onCollected(files)
// most reporters rely on results being updated in "onTaskUpdate"
await methods.onTaskUpdate(tasks)
}
pool/custom-pool.tsに簡単な例があります。