コンテンツへスキップ

カスタムプール

警告

これは高度なAPIです。単にテストを実行するだけなら、おそらくこれは必要ありません。主にライブラリの作成者によって使用されます。

Vitestはプール内でテストを実行します。デフォルトでは、いくつかのプールがあります。

  • threads: node:worker_threadsを使用してテストを実行します(新しいワーカーコンテキストで分離が提供されます)。
  • forks: node:child_processを使用してテストを実行します(新しいchild_process.forkプロセスで分離が提供されます)。
  • vmThreads: node:worker_threadsを使用してテストを実行します(ただし、新しいワーカーコンテキストではなくvmモジュールで分離が提供されます)。
  • browser: ブラウザプロバイダーを使用してテストを実行します。
  • typescript: テストで型チェックを実行します。

ファイルパスを指定することで、独自のプールを提供できます。

ts
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`インターフェースに一致するオブジェクトを返す必要があります。

ts
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を参照してください(最も重要なのはcollectFilesupdateTasksです)。Vitestはそのため、@vitest/runnerパッケージのstartTests関数を使用します。

異なるプロセス間で通信するには、vitest/nodecreateMethodsRPCを使用してメソッドオブジェクトを作成し、任意の通信方法を使用できます。たとえば、birpcでWebSocketsを使用するには、次のように記述できます。

ts
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レポーターに報告します。

ts
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に簡単な例があります。

MITライセンスの下でリリースされています。