スペックを並列実行する
Node.js での並列実行のサポートは、5.0.0 以降のリリースで利用可能です。以下のすべてに当てはまる場合、Jasmine のスペックを並列実行できます。
jasmine
パッケージを使用して Node.js でスペックを実行している。- ランダム化が有効で、ランダムシードが指定されていない場合、スペックは一貫して合格する。(これは Jasmine 3.0 以降のデフォルト設定です。)
describe
の内側にないbeforeAll
またはafterAll
の呼び出しがある場合、それらはデータベースのようなプロセス外の状態を設定するためだけに使用され、グローバル変数のようなプロセス内の状態を設定するためには使用されない。beforeEach
またはafterEach
の呼び出しは、describe
の内側か、ヘルパーファイルにある。- Jasmine に付属していないレポーターを使用している場合は、並列モードで動作するように更新できる。
並列モードを使用するには
- 以下の制限事項とバグのリストを読み、該当するものがないことを確認してください。特に、スイートを確実に実行するために、ランダム化を無効にしたり、ランダムシードを指定したり、カスタムオーダーを指定したりする必要がないことを確認してください。
jasmine
の依存関係を5.0.0
以降に設定します。jasmine
コマンドに--parallel=<n>
引数を追加します。例えば、jasmine --parallel=4
で、4つの並列プロセスでスペックを実行します。
ワーカーの理想的な数は、スペックの性質と、利用可能な CPU コアの数と種類によって異なります。CPU バウンドのスイートは、ワーカーの数がコア数よりわずかに少ない場合に最も速く実行されることがよくあります。I/O バウンドのスイートは、ワーカーの数を少なくするとメリットが得られる場合があります。
制限事項
以下の制限事項は、並列モードのみに適用され、通常のシーケンシャル実行モードには適用されません。
- ランダム化を無効にしたり、ランダムシードを設定したりすることはできません。
fit
とfdescribe
はサポートされていません。- スペックファイルのトップレベルでの
beforeEach
およびafterEach
の呼び出しはサポートされていません。(ヘルパーファイル内またはdescribe
内でのこれらの関数の呼び出しは、引き続き完全にサポートされています。) beforeAll
およびafterAll
の呼び出しは、describe
の内側でのみサポートされています。データベースやその他の外部サービスを開始するなど、プロセス外の状態の初期化を正確に1回実行する必要がある場合は、以下で説明する新しいグローバルセットアップ/ティアダウン API を参照してください。- Jasmine に付属していないレポーターは、並列モードで動作するように更新する必要があります。詳細については、以下のレポーターに関するセクションを参照してください。
addReporter
,configure
など、状態を変更するEnv
メソッドはサポートされていません。代わりに、構成、CLI 引数、またはParallelRunner
クラスの同等のメソッドを使用してください。specFilter
コア構成プロパティは、関数を別のプロセスに送信することができないため、サポートされていません。代わりに、--filter=
CLI オプションを使用するか、フィルター文字列をParallelRunner#execute
の2番目のパラメーターとして渡してください。
新しいグローバルセットアップ/ティアダウン 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 はサポートされていません。
どのセットアップ/ティアダウンツールを使用すべきかわからない?
describe
内の各スペックに対して実行する必要がある場合は、そのdescribe
内でbeforeEach
/afterEach
を使用してください。- スイート全体の各スペックに対して実行する必要がある場合は、ヘルパーファイルで
beforeEach
/afterEach
を使用します。(例:グローバルに利用可能にする必要があるカスタムマッチャーを追加する。) describe
内のすべてのスペックに対して1回実行する必要がある場合は、そのdescribe
内でbeforeAll
/afterAll
を使用します。- スイート全体のすべてのスペックに対して1回実行する必要があり、外部状態を初期化する場合は、
globalSetup
/globalTeardown
を使用します。トップレベルのbeforeAll
/afterAll
もこれに使用できますが、並列モードでは使用できません。(例:外部サービスの開始やデータベースのシード。) - スイート全体のすべてのスペックに対して1回実行する必要があり、プロセス内の状態を初期化する場合は、並列モードを使用できません。
注意すべき違い
- スペックまたはヘルパーファイルのロード中のエラーなど、特定の種類の致命的なエラーは、シーケンシャルモードでは
jasmineStarted
レポーターイベントの前に発生し、並列モードでは後に発生します。 - 複数のスペックが同時に実行されるため、並列モードでは
console.log
を介したデバッグが困難または不可能になる場合があります。デバッグの際は、シーケンシャルモードまたはjasmine.debugLog
を使用することをお勧めします。 --fail-fast
CLI オプションとstopOnSpecFailure
構成設定は、ベストエフォートでサポートされています。最初の失敗の後、できるだけ早く実行が停止します。
並列モードで動作するようにレポーターを更新する
並列モードは、レポーターに多くの制限を課します。最も人気のあるサードパーティのレポーターの一部は、並列モードで動作するためにいくつかの変更が必要になるため、Jasmine は、互換性を宣言しない限り、レポーターが並列モードと互換性がないと見なします。レポーターは、値が {parallel: true}
の reporterCapabilities
プロパティを公開することで、並列モードと互換性があることを宣言できます。
イベント順序
注意すべき最大の制限は、イベントがワーカープロセスから受信した順序で配信されることです。つまり、関連のないスペックとスイートのイベントがインターリーブする可能性があります。specDone
イベントが、最も最近受信した specStarted
イベントと同じスペックのものである、または suiteStarted
イベントと suiteDone
イベントの間のすべてのイベントがそのスイートの子に関連していると想定するレポーターは、並列モードでは動作しません。Jasmine は、並列モードでのイベント順序について、以下の保証のみを行います。
jasmineStarted
は、他のすべてのイベントの前に報告されます。jasmineDone
は、他のすべてのイベントの後に報告されます。specStarted
は、同じスペックのspecDone
イベントの前に報告されます。suiteStarted
は、同じスイートのsuiteDone
イベントの前に報告されます。- スイートの子に対するすべてのイベントは、スイートの
suiteStarted
イベントの後、およびsuiteDone
イベントの前に報告されます。
Jasmine 4.6 以降では、スイートとスペックのレポーターイベントには、イベント順序に依存せずに、スペックまたはスイートの親スイートを識別できる parentSuiteId
プロパティがあります。
同時イベントディスパッチ
シーケンシャルモードでは、Jasmine は、続行する前に、非同期レポーター関数の完了を待ちます。並列モードでは、そうではありません。非同期レポーターは、イベントを同時に処理するか、内部でキューに入れるかのいずれかを準備する必要があります。
API の違い
さらに、レポーターが使用するいくつかの API は利用できないか、制限されています。
Env#topSuite
は利用できません。jasmineStarted
レポーターイベントには、totalSpecsDefined
またはorder
フィールドがありません。JasmineDone
レポーターイベントには、order
フィールドがありません。
上記は並列モードにのみ適用されることに注意してください。デフォルトのシーケンシャルモードでは、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 リファレンスドキュメントを参照してください。