コンテンツにスキップ

隔離と同時実行性

Workers Vitest 統合がテストをどのように実行し、テストを互いに隔離し、モジュールをどのようにインポートするかを確認します。

テストの実行

Workers Vitest 統合を使用してテストを実行すると、Vitest は次のことを行います。

  1. Node.js を使用して構成ファイルを読み取り、評価します。
  2. Node.js を使用して任意の globalSetup ファイルを実行します。
  3. テストファイルを収集し、順序付けします。
  4. 各 Vitest プロジェクトについて、構成された隔離と同時実行性に応じて、1 つ以上の workerd プロセスを開始し、それぞれが 1 つ以上の Workers を実行します。
  5. 適切な Workers を使用して workerdsetupFiles とテストファイルを実行します。
  6. 変更を監視し、構成が変更されていない場合は同じ Workers を使用してテストファイルを再実行します。

隔離と同時実行性モデル

isolatedStoragesingleWorker の構成オプションは、隔離と同時実行性の両方を制御します。Workers Vitest 統合は、可能な限りテスト実行間で Workers とそのモジュールキャッシュを再利用し、開始する workerd プロセスの数を最小限に抑えようとします。現在の隔離ストレージの実装では、各 workerd プロセスが 1 回に 1 つのテストファイルを実行する必要があり、.concurrent テストはサポートされていません。すべての補助的な workers のコピーが各 workerd プロセスに存在します。

デフォルトでは、isolatedStorage オプションは有効になっています。小さなテストファイルが多数ある場合は、singleWorker: true オプションを有効にすることをお勧めします。

isolatedStorage: true, singleWorker: false (デフォルト)

このモデルでは、各テストファイルのために workerd プロセスが開始されます。テストファイルは同時に実行されますが、.concurrent テストはサポートされていません。各テストは隔離されたストレージ環境から読み書きし、独自の補助的な workers にバインドされます。

隔離モデル: 隔離ストレージ & シングルワーカー

isolatedStorage: true, singleWorker: true

このモデルでは、すべてのテストファイルのために単一の Worker を持つ単一の workerd プロセスが開始されます。テストファイルは直列に実行され、.concurrent テストはサポートされていません。各テストは隔離されたストレージ環境から読み書きし、同じ補助的な workers にバインドされます。

隔離モデル: 隔離ストレージ & シングルワーカー

isolatedStorage: false, singleWorker: false

このモデルでは、各テストファイルのために Worker を持つ単一の workerd プロセスが開始されます。テストファイルは同時に実行され、.concurrent テストがサポートされます。すべてのテストは同じ共有ストレージから読み書きし、同じ補助的な workers にバインドされます。

隔離モデル: 隔離ストレージなし & シングルワーカーなし

isolatedStorage: false, singleWorker: true

このモデルでは、すべてのテストファイルのために単一の Worker を持つ単一の workerd プロセスが開始されます。テストファイルは直列に実行されますが、.concurrent テストはサポートされます。すべてのテストは同じ共有ストレージから読み書きし、同じ補助的な workers にバインドされます。

隔離モデル: 隔離ストレージなし & シングルワーカー

モジュール

各 Worker には独自のモジュールキャッシュがあります。Workers はテスト実行間で再利用されるため、そのモジュールキャッシュも再利用されます。Vitest は、変更されたファイルに基づいて各テスト実行の開始時にモジュールキャッシュの一部を無効にします。

Workers Vitest プールは、Vitest が通常 Node.js ワーカースレッド 内で実行するコードを Cloudflare Worker 内で実行することによって機能します。これを可能にするために、プールは nodejs_compat および export_commonjs_default 互換性フラグを有効にする必要があります。また、プールは workerd を Node スタイルのモジュール解決を使用するように構成し、nodejs_compat によって提供されない必要な node:* モジュールのポリフィルを提供します。