並列テスト実行

Spring Framework 5.0 は、Spring TestContext フレームワークを使用する場合に、単一の JVM 内で並行してテストを実行するための基本的なサポートを導入しました。一般に、これは、ほとんどのテストクラスまたはテストメソッドを、テストコードや構成を変更せずに並行して実行できることを意味します。

並列テスト実行の設定方法の詳細については、テストフレームワーク、ビルドツール、IDE のドキュメントを参照してください。

テストスイートに同時実行性を導入すると、予期しない副作用、奇妙なランタイム動作、テストが断続的またはランダムに失敗する可能性があることに注意してください。Spring チームは、テストを並行して実行しない場合の次の一般的なガイドラインを提供します。

次の場合は、テストを並行して実行しないでください。

  • Spring Framework の @DirtiesContext サポートを使用します。

  • Spring Boot の @MockBean または @SpyBean サポートを使用します。

  • JUnit 4 の @FixMethodOrder サポート、またはテストメソッドが特定の順序で実行されるように設計されたテストフレームワーク機能を使用します。ただし、テストクラス全体が並行して実行される場合、これは当てはまりません。

  • データベース、メッセージブローカー、ファイルシステムなどの共有サービスまたはシステムの状態を変更します。これは、組み込みシステムと外部システムの両方に適用されます。

現在のテストの ApplicationContext がアクティブでなくなったことを示す例外で並列テストの実行が失敗した場合、これは通常、異なるスレッドで ApplicationContext が ContextCache から削除されたことを意味します。

これは、@DirtiesContext の使用または ContextCache からの自動削除が原因である可能性があります。@DirtiesContext が原因の場合は、@DirtiesContext の使用を回避する方法を見つけるか、そのようなテストを並列実行から除外する必要があります。ContextCache の最大サイズを超えた場合は、キャッシュの最大サイズを増やすことができます。詳細については、コンテキストキャッシュに関する説明を参照してください。

Spring TestContext フレームワークでの並列テスト実行は、TestContext (Javadoc) の javadoc に従って、基礎となる TestContext 実装がコピーコンストラクターを提供する場合にのみ可能です。Spring で使用される DefaultTestContext は、このようなコンストラクターを提供します。ただし、カスタム TestContext 実装を提供するサードパーティライブラリを使用する場合、それが並列テストの実行に適していることを確認する必要があります。