次の方法で共有


テスト ランナーに対して並列でテストを実行する

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020

コードに対する変更を検証するためのテストの実行は、品質を維持するための鍵となります。 継続的インテグレーションのプラクティスを成功させるには、すべてのビルドで実行される優れたテスト スイートが不可欠です。 ただし、コードベースが大きくなると、回帰テスト スイートも同様に増加する傾向があり、完全な回帰テストの実行には時間がかかる場合があります。 場合によっては、テスト自体の実行時間が長くなることがあります。これは通常、エンドツーエンドのテストを記述する場合に当てはまる場合です。 これにより、パイプラインでビルドを十分に迅速に処理できないため、顧客価値を提供する速度が低下します。

テストを並列で実行することは、CI/CD パイプラインの効率を向上させる優れた方法です。 これは、クラウドによって提供される追加の容量を採用することで簡単に行うことができます。 この記事では、複数のエージェントを使用してジョブを処理することでテストを並列化する方法について説明します。

前提条件

エージェントジョブの概念について理解します。 各エージェントは、一度に 1 つのジョブのみを実行できます。 複数のジョブを並列で実行するには、複数のエージェントを構成する必要があります。 また、十分な数の並列ジョブも必要です。

並列ジョブの設定

YAML で 'parallel' 戦略を指定し、ディスパッチする必要があるジョブの数を示します。 変数 System.JobPositionInPhaseSystem.TotalJobsInPhase が各ジョブに追加されます。

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

ヒント

大規模なテスト スイートのテストをスケールアップするには、最大 99 個のエージェントを指定できます。

テスト スイートのスライス

テストを並列で実行するには、最初にテスト スイートをスライス (またはパーティション分割) して、各スライスを個別に実行できるようにする必要があります。 たとえば、1 つのエージェントで 1000 テストの大規模なスイートを実行する代わりに、2 つのエージェントを使用し、各エージェントで 500 個のテストを並列で実行できます。 または、8 つのエージェントを使用し、各エージェントで 125 個のテストを並列で実行することで、テストの実行にかかる時間をさらに短縮できます。

ジョブでテストを実行するステップでは、実行するテスト スライスを認識する必要があります。 変数 System.JobPositionInPhaseSystem.TotalJobsInPhase は、この目的で使用できます。

  • System.TotalJobsInPhase はスライスの合計数を示します (これは "totalSlices" と考えることができます)
  • System.JobPositionInPhase は特定のスライスを識別します (これは "sliceNum" と考えることができます)

すべてのテスト ファイルを 1 次元配列として表す場合、すべてのテスト ファイルが実行されるまで、各ジョブは [sliceNum + totalSlices] でインデックス付けされたテスト ファイルを実行できます。 たとえば、6 つのテスト ファイルと 2 つの並列ジョブがある場合、最初のジョブ (slice0) は 0、2、4 のテスト ファイルを実行し、2 番目のジョブ (slice1) は 1、3、5 のテスト ファイルを実行します。

2 つのスライスで 6 つのテスト

代わりに 3 つの並列ジョブを使用する場合、最初のジョブ (slice0) は 0 と 3 のテスト ファイルを実行し、2 番目のジョブ (slice1) は 1 と 4 のテスト ファイルを実行し、3 番目のジョブ (slice2) は 2 と 5 のテスト ファイルを実行します。

3 つのスライスで 6 つのテスト

サンプル コード

この .NET Core サンプルでは、--list-tests--filterパラメーターとdotnet test パラメーターを使用してテストをスライスします。 テストは NUnit を使用して実行されます。 テスト タスクによって作成されたテスト結果 DotNetCoreCLI@2 サーバーに発行されます。 次のリポジトリを (Azure Repos または Azure DevOps Server に) インポートするか、フォーク (GitHub に) インポートします。

https://github.com/idubnori/ParallelTestingSample-dotnet-core

この Python サンプルでは、PowerShell スクリプトを使用してテストをスライスします。 テストは pytest を使用して実行されます。 pytest によって作成された JUnit スタイルのテスト結果がサーバーに発行されます。 次のリポジトリを (Azure Repos または Azure DevOps Server に) インポートするか、フォーク (GitHub に) インポートします。

https://github.com/PBoraMSFT/ParallelTestingSample-Python

この JavaScript サンプルでは、bash スクリプトを使用してテストをスライスします。 テストは、mocha ランナーを使用して実行されます。 その後、mocha によって作成された JUnit スタイルのテスト結果がサーバーに発行されます。 次のリポジトリを (Azure Repos または Azure DevOps Server に) インポートするか、フォーク (GitHub に) インポートします。

https://github.com/PBoraMSFT/ParallelTestingSample-Mocha

サンプル コードには、パイプラインの作成に使用できるリポジトリのルートに azure-pipelines.yml ファイルが含まれています。 「最初のパイプラインを作成する」のすべての手順に従ってパイプラインを作成し、テスト スライスの動作を確認します。

並列処理を組み合わせて超並列テストを行う

パイプラインで並列ジョブを使用する場合、パイプラインは複数のマシンを使用して各ジョブを並列で実行します。 ほとんどのテスト ランナーは、1 台のコンピューターでテストを並列で実行する機能を提供します (通常は、並列で実行される複数のプロセスまたはスレッドを作成します)。 2 種類の並列処理を組み合わせて超並列テストを行うことができます。これにより、パイプラインでのテストが非常に効率的になります。

ヘルプとサポート