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

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

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

テストを並列で実行することは、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 サンプルでは、 の パラメーターと --filter パラメーターdotnet testを使用--list-testsしてテストをスライスします。 テストは 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 種類の並列処理を組み合わせて超並列テストを行うことができます。これにより、パイプラインでのテストが非常に効率的になります。

ヘルプとサポート