Azure Pipelines を使用した Testcontainers テストの実行

Testcontainersは、エフェメラルDockerコンテナを使用して、データベース、メッセージキュー、検索エンジンなどの依存関係でテストを実行できるテストライブラリです。 Testcontainers は、プログラム可能なAPIを使用してこれらのDockerコンテナのライフサイクルを管理し、必要なアプリケーションの依存関係の設定をより細かく制御できます。

Azure Pipelines は、Azure DevOps ツール スイートの一部として Microsoft が提供するクラウドベースの継続的インテグレーションおよび継続的デリバリー (CI/CD) サービスです。 Azure Pipelines は、ソフトウェア開発と配信プロセスを効率化するために、開発者や DevOps チームによって広く使用されています。

この記事では、Azure DevOps プラットフォーム上の Azure Pipelines を使用して Testcontainers ベースのテストを実行する方法について説明します。 ここでは、GitHubで見つけられる Java/Spring Bootアプリケーションの例を使用します。

紫色の背景に testcontainers と azure のロゴを示すバナー画像

プロジェクトのセットアップ

この記事では、GitHub でプロジェクトを作成し、CI プラットフォームとして Azure Pipelines を使用するように構成します。 すでにアプリケーションがある場合は、そのアプリケーションを使用するか、新しいプロジェクトを作成できます。

テストに Testcontainers を使用する Spring Boot アプリケーションである testcontainers-showcase リポジトリを使用します。 まず、プロジェクトのルート ディレクトリに次の内容の azure-pipelines.yml ファイルを作成し、変更をコミットしてプッシュします。

trigger:
- '*'
pool:
vmImage: ubuntu-latest
steps:
- task: JavaToolInstaller@0
 inputs:
   versionSpec: '17'
   jdkArchitectureOption: 'x64'
   jdkSourceOption: 'PreInstalled'
 displayName: 'SetUp Java'
- script: |
  ./mvnw verify
 displayName: 'Build with Maven'

JavaToolInstallerを使用して、使用するJDKバージョンを構成しています。この例では、Java 17を使用しています。次に、 ./mvnw verify コマンドを実行して Maven ビルド ツールを使用してテストを実行するステップを構成しました。

Azure Pipelines のセットアップ

次に、 Azure DevOps ページ に移動し、資格情報を使用してログインします。 [New Project (新規プロジェクト)] ボタンをクリックし、プロジェクト名を入力して [Visibility (可視性)] を選択し、[Create (作成)] を選択します。プロジェクトが作成されたら、 プロジェクト ビュー に移動し、[ パイプライン] を選択します。

プロジェクトのパイプラインを構成するには、次の手順に従います。

  1. [新しいパイプライン] ボタンをクリックし、[GitHub] を選択します。 
  2. まだ認証されていない場合は、GitHub アカウントで認証するように求められます。
  3. パイプラインを構成するリポジトリを選択します。
  4. azure-pipelines.yml ファイルがない場合は、リポジトリ内のビルド構成ファイルに基づいて、標準パイプライン構成の一覧が提案されます。リポジトリにはすでに azure-pipelines.yml ファイルがあるため、パイプラインエディタには azure-pipelines.yml ファイルの内容が事前入力されます。
  5. [実行] を選択してパイプラインをトリガーします。

Azure Pipelines ランナーには既に Docker がインストールされて構成されているため、テストは正常に実行されるはずです (図 1)。

成功したジョブの横に緑色のチェックが表示されている Azure パイプライン ページのスクリーンショット。
図 1: Azure Pipelines で成功したジョブ。

この図に示すように、テストは Azure Pipeline ランナーの既定の Docker サポートを使用して正常に実行されました。 プロジェクトが大きくなるにつれて、テストに使用するコンテナが増え、テストの実行にリソースを大量に消費する可能性があります。 Azure パイプライン ランナー自体でテスト依存関係コンテナーを実行する代わりに、 Testcontainers Cloud を使用して、コンテナーをクラウド環境上で実行できます。

Testcontainers Cloudを使用すると、ランナーでDockerデーモンを実行する必要さえありません。 コンテナはオンデマンドのクラウド環境で実行されるため、ビルドに高CPU/メモリの強力なCIワーカーを使用する必要はありません。

最小限のセットアップでTestcontainers Cloudを使用し、Testcontainersベースのテストを実行する方法を見てみましょう。

Testcontainers クラウドベースのセットアップ

Testcontainers Cloudアカウントをまだお持ちでない場合は、次のようにアカウントを作成し、サービスアカウントトークンを取得します(図 2)。

  1. Testcontainers Cloudアカウントにサインアップします
  2. ログインしたら、組織を作成します。
  3. Testcontainers Cloud ダッシュボードに移動し、サービス アカウントを生成します。
サービスアカウント作成ページのスクリーンショットで、アクセストークンを再度表示できなくなるため、コピーするようにリマインダーが表示されます。
図 2: 新しい Testcontainers クラウド サービス アカウントを作成します。

次に、 TC_CLOUD_TOKEN を環境変数として設定する必要があります。

  • パイプラインに移動し、[編集] を選択して、[変数] ボタンをクリックします。
  • [ 新しい変数 ] を選択し、詳細を入力します。
    • 名前: TC_CLOUD_TOKEN.
    • 値: サービス アカウント アクセス トークンを入力します。
    • [この値を秘密にする] チェックボックスをオンにします。
    • [OK] をクリックし、[保存] をクリックします。

次に、次のように azure-pipelines.yml ファイルを更新します。

trigger:
- '*'
pool:
   vmImage: ubuntu-latest
steps:
- task: Bash@3
 inputs:
   targetType: "inline"
   script: 'sh -c "$(curl -fsSL https://get.testcontainers.cloud/bash)"'
 env:
   TC_CLOUD_TOKEN: $(TC_CLOUD_TOKEN)
 displayName: 'SetUp TC Cloud Agent'
- task: JavaToolInstaller@0
 inputs:
   versionSpec: '17'
   jdkArchitectureOption: 'x64'
   jdkSourceOption: 'PreInstalled'
 displayName: 'SetUp Java'
- script: |
   ./mvnw verify
 displayName: 'Build with Maven'

テストを実行する前に、 TC_CLOUD_TOKEN を環境変数として渡してTestcontainers Cloudエージェントを開始するステップを含め、Pipelineで以前に定義した変数から値を検索します。

これで、更新された azure-pipelines.yml ファイルをコミットすると、パイプラインは Testcontainers Cloud を使用してテストを実行します。 次の logs ステートメントが表示され、Testcontainers ベースのテストが既定の Docker デーモンではなく Testcontainers Cloud を使用していることがわかります。

05:19:28.539 [main] INFO org.testcontainers.DockerClientFactory - Connected to docker:
Server Version: 78+testcontainerscloud (via Testcontainers Desktop 1.4.15)
API Version: 1.43
Operating System: Ubuntu 22.04.3 LTS
Total Memory: 15689 MB
05:19:29.727 [main] INFO org.testcontainers.utility.RyukResourceReaper - Ryuk started - will monitor and terminate Testcontainers containers on JVM exit

また、Testcontainers CloudのTurboModeを、並列実行機能を備えたビルドツールと組み合わせて、テストを並列に実行することもできます。

Maven の場合、 -DforkCount=N システムプロパティを使用して並列化の度合いを指定できます。 Gradleの場合、「maxParallelForks」プロパティを使用して並列化の程度を指定できます。

次のように、 azure-pipelines.yml の 4 つのフォークを使用してテストの並列実行を有効にすることができます。

- script: |
   ./mvnw verify -DforkCount=4
 displayName: 'Build with Maven'

TurboModeの使用の詳細については、 ドキュメントを参照してください。 

結論

この記事では、既定の Docker デーモンを使用して Azure Pipelines で Testcontainers ベースのテストを実行する方法について説明しました。 次に、Testcontainers Cloud アカウントを作成し、Testcontainers Cloud を使用してテストを実行するようにパイプラインを構成する方法を学びました。 また、Testcontainers Cloud TurboMode をビルドツールの並列実行機能と組み合わせて使用する方法も検討しました。

例として Java プロジェクトを使用してこのセットアップを示しましたが、Testcontainers ライブラリは他の一般的な言語にも存在し、同じ構成パターンに従って、Golang、.NET、Python、Node.js などの Azure Pipelines で Testcontainers ベースのテストを実行できます。

Testcontainers Cloudは、 無料アカウントを作成することで使い始めることができます。

さらに詳しく