スペックを並列実行する

Node.js での並列実行のサポートは、5.0.0 以降のリリースで利用可能です。以下のすべてに当てはまる場合、Jasmine のスペックを並列実行できます。

並列モードを使用するには

  1. 以下の制限事項とバグのリストを読み、該当するものがないことを確認してください。特に、スイートを確実に実行するために、ランダム化を無効にしたり、ランダムシードを指定したり、カスタムオーダーを指定したりする必要がないことを確認してください。
  2. jasmine の依存関係を 5.0.0 以降に設定します。
  3. jasmine コマンドに --parallel=<n> 引数を追加します。例えば、jasmine --parallel=4 で、4つの並列プロセスでスペックを実行します。

ワーカーの理想的な数は、スペックの性質と、利用可能な CPU コアの数と種類によって異なります。CPU バウンドのスイートは、ワーカーの数がコア数よりわずかに少ない場合に最も速く実行されることがよくあります。I/O バウンドのスイートは、ワーカーの数を少なくするとメリットが得られる場合があります。

制限事項

以下の制限事項は、並列モードのみに適用され、通常のシーケンシャル実行モードには適用されません。

新しいグローバルセットアップ/ティアダウン API

Jasmine 5.0 では、正確に1回だけ実行されるグローバルセットアップとティアダウンのための新しい API が提供されています。これは、ワーカーの数に関係なく、プロセス外のセットアップを1回だけ実行する必要がある並列実行シナリオをサポートすることを目的としています。デフォルトのシーケンシャル実行モードでも使用できます。

グローバルセットアップ/ティアダウン API を使用するには、Jasmine 構成に globalSetup および/または globalTeardown 関数を追加します。例:

module.exports = {
  spec_dir: "spec",
  // ...
  globalSetup() {
    // ... your setup code here
  }
  globalTeardown() {
    // ... your teardown code here
  }
}

グローバルセットアップ/ティアダウン関数が async として宣言されているか、それ以外で Promise を返す場合、Jasmine は返された Promise が解決されるまで待機してから続行します。コールバック形式の async はサポートされていません。

どのセットアップ/ティアダウンツールを使用すべきかわからない?

注意すべき違い

並列モードで動作するようにレポーターを更新する

並列モードは、レポーターに多くの制限を課します。最も人気のあるサードパーティのレポーターの一部は、並列モードで動作するためにいくつかの変更が必要になるため、Jasmine は、互換性を宣言しない限り、レポーターが並列モードと互換性がないと見なします。レポーターは、値が {parallel: true}reporterCapabilities プロパティを公開することで、並列モードと互換性があることを宣言できます。

イベント順序

注意すべき最大の制限は、イベントがワーカープロセスから受信した順序で配信されることです。つまり、関連のないスペックとスイートのイベントがインターリーブする可能性があります。specDone イベントが、最も最近受信した specStarted イベントと同じスペックのものである、または suiteStarted イベントと suiteDone イベントの間のすべてのイベントがそのスイートの子に関連していると想定するレポーターは、並列モードでは動作しません。Jasmine は、並列モードでのイベント順序について、以下の保証のみを行います。

Jasmine 4.6 以降では、スイートとスペックのレポーターイベントには、イベント順序に依存せずに、スペックまたはスイートの親スイートを識別できる parentSuiteId プロパティがあります。

同時イベントディスパッチ

シーケンシャルモードでは、Jasmine は、続行する前に、非同期レポーター関数の完了を待ちます。並列モードでは、そうではありません。非同期レポーターは、イベントを同時に処理するか、内部でキューに入れるかのいずれかを準備する必要があります。

API の違い

さらに、レポーターが使用するいくつかの API は利用できないか、制限されています。

上記は並列モードにのみ適用されることに注意してください。デフォルトのシーケンシャルモードでは、Jasmine 5 は既存のレポーターと完全に互換性があります。

プログラムによる使用

ParallelRunner クラスを使用して、スペックをプログラムで並列実行できます。

const ParallelRunner = require('jasmine/parallel');
const runner = new ParallelRunner({numWorkers: 3});
runner.loadConfigFile('spec/support/jasmine.json');
runner.execute();

ParallelRunner は、Jasmine クラスと同じ多くのメソッドをサポートしています。詳細については、API リファレンスドキュメントを参照してください。