GitHub Actions と Testcontainers Cloud を使用した testcontainers テストの実行

Testcontainers は、実際の依存関係を Docker コンテナとして使用して統合テストを記述するための好ましい選択肢です。 この記事では、以下について説明します。

  • GitHub Actions CI で Testcontainers ベースのテストを実行する方法。
  • Test containers Cloud を使用するように GitHub Actions を構成する方法。
  • Testcontainers Cloud ダッシュボードの Testcontainers の使用パターン。

GitHub Actionsを使用して、Spring BootアプリケーションでTestcontainersベースの統合テストを実行する方法を見てみましょう。 この記事では、 testcontainers-showcase アプリケーションを使用して、GitHub Actions を使用してテストを実行する方法を示します。

github アクションと testcontainers クラウドを使用して testcontainers テストを実行するバナー

ローカルマシンにDockerがインストールされている場合は、次のようにリポジトリをクローンしてローカルでテストを実行できます。

git clone https://github.com/testcontainers/testcontainers-showcase.git
cd testcontainers-showcase
./mvnw verify

GitHub Actions CI の構成

次の構成で GitHub Actions 構成ファイル .github/workflows/ci.yml を追加しましょう。

name: CI Build
on:
 push:
   branches:
     - '**'
jobs:
 build:
   name: Maven Build
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@v3
     - name: Setup Java 17
       uses: actions/setup-java@v3
       with:
         java-version: 17
         distribution: 'temurin'
         cache: 'maven'
     - name: Build with Maven

Testcontainers ライブラリでは、テストを実行するために 有効な Docker 環境が必要です 。 GitHub Actions はデフォルトで Docker 環境を提供するため、有効な Docker 環境を提供するために特別に何も構成する必要はありません。

ここで .github/workflows/ci.yml ファイルを追加し、変更をコミットしてプッシュすると、GitHub Actions CI パイプラインが自動的にトリガーされ、テストが正常に実行されます。

Testcontainers Cloud を使用するための GitHub Actions の構成

デフォルトの Docker 環境を使用して GitHub Actions で Testcontainers ベースのテストを実行できますが、テストに必要なコンテナの実行の負担を Testcontainers Cloud にオフロードすることで、テストの実行を高速化できます。

Testcontainers Cloudにアクセスし、まだお持ちでない場合は無料アカウントを取得してください。 

Testcontainers Cloudにログインしたら、 Webアプリのインストール手順に従って サービストークンを作成できます。 次に、トークンを GitHub シークレットとして TC_CLOUD_TOKEN という名前で構成します。

次に、 .github/workflows/ci.yml ファイルを更新して、Testcontainers Cloud Agent を次のように構成しましょう。

name: CI Build
on:
 push:
   branches:
     - '**'
jobs:
 build:
   name: Maven Build
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@v3
     - name: Setup Java 17
       uses: actions/setup-java@v3
       with:
         java-version: 17
         distribution: 'temurin'
         cache: 'maven'
     - name: Setup Testcontainers Cloud Client
       uses: atomicjar/testcontainers-cloud-setup-action@v1
       with:
         token: ${{ secrets.TC_CLOUD_TOKEN }}
     - name: Build with Maven
       run: ./mvnw verify

atomicjar/testcontainers-cloud-setup-action@v1を使用して Testcontainers Cloud エージェントを起動する手順を追加しました。また、GitHub Actions Secrets からフェッチされた Service Account Token 値と共に、トークンを引数として渡しました。

ここで、変更をコミットしてプッシュすると、テストが Testcontainers Cloud を使用して実行されていることを示す次のログ ステートメントに気付くはずです。 また、テストはデフォルトのDocker環境よりも高速に実行されることも確認できます。

[testcontainers-lifecycle-0] INFO org.testcontainers.DockerClientFactory - Connected to docker:
Server Version: 78+testcontainerscloud
API Version: 1.43
Operating System: Ubuntu 22.04.2 LTS
Total Memory: 15537 MB

Testcontainers Cloud Turbo モードと並行してテストを実行する

Testcontainers Cloud Turbo モードでは、テストを並行して実行できるため、各テストプロセスが独自のクラウド環境を受け取り、テストの並列化をスケーラブルにすることができます。 Testcontainers Cloud Turboモードの詳細については、 ナレッジベースをご覧ください

CIでターボモードをオンにするには、次のように TC_CLOUD_CONCURRENCY 環境変数を渡すこともできます。

- name: Setup Testcontainers Cloud Client
 uses: atomicjar/testcontainers-cloud-setup-action@v1
 with:
   token: ${{ secrets.TC_CLOUD_TOKEN }}
   env:
     TC_CLOUD_CONCURRENCY: 2

ターボモードを有効にすると、ビルドツールのテスト並列化機能を活用して、テストを並行して実行できます。 次のように、4つのフォークを使用してテストを実行するように Maven Surefire Plugin を構成できます。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>3.1.2</version>
   <configuration>
         <parallel>classes</parallel>
         <forkCount>4</forkCount>
   </configuration>
</plugin>

ターボ モードとテスト並列化を使用すると、テストの実行が高速になります。 Testcontainers Cloud がアプリのコンテナ依存関係を処理するため、テストを並列化する場合でも、デフォルトの GitHub アクションワーカーを便利に使用していることに注意してください。 

Testcontainers Cloud には、テストの実行を調べるダッシュボードも用意されています。

Testcontainers Cloud からのテスト実行に関するインサイト

Testcontainers Cloud にログインすると、ダッシュボード ページにリダイレクトされ、図 1に示すように、過去 30 日間の Testcontainers アクティビティと上位 10 のイメージを確認できます。

過去 30 日間のセッションと上位10画像を示す testcoontainers クラウドのスクリーンショット
図 1: Testcontainers Cloud ダッシュボード。

また、特定のユーザーまたはサービス アカウントを選択して、その特定のアカウントのアクティビティを確認することもできます。

図 2に示すように、Testcontainers Cloud テスト実行セッションを確認できます。

最近のテストを一覧表示する testcontainers アクティビティのスクリーンショット。
図 2: Testcontainers Cloud テスト実行セッション。

データベースやメッセージ ブローカーなど、特定のバージョンのサービスを使用している場合は、同じバージョンのコンテナーでテストを実行することをお勧めします。 ダッシュボードから、実行中のコンテナの概要を取得でき、予期しないバージョンでテストが実行されているかどうかを簡単に把握できます (図 3)。

実行中のテストを示す testcontainers のスクリーンショット。
図 3: テストの実行。

このスクリーンショットでは、テストがさまざまなバージョン (15-alpine、 15.2-alpine、 15.3-alpine) の postgres コンテナーを使用して実行されていることがわかりますが、これはおそらく必要なものではありません。 ダッシュボードは、この種の問題を見つけるのにも役立ちます。

また、各コンテナの実行時間も確認できます(図 4)。

現在のコンテナの実行時間を示すグラフを示す testcontainers のスクリーンショット。
図 4: コンテナの実行時間。

このビューを使用すると、別々のテスト クラスに対して複数のコンテナーを実行するかどうか、 またはシングルトン コンテナー パターン を利用して複数のテスト クラスに同じコンテナー セットを使用するかどうかを簡単に評価できます。

JUnit 5 を使用した Testcontainers のライフサイクル管理の詳細については、 こちらのガイドをご覧ください。 また、JUnit 5を使用したTestcontainersコンテナのライフサイクル管理のビデオ版もご覧いただけます。

結論

この記事では、Testcontainers ベースのテストを実行するように GitHub Actions を構成する方法と、Testcontainers Cloud を活用してコンテナー ワークロードをスケールアップする方法について説明しました。 また、ターボ モードの使用方法と、テスト並列化手法を使用してテストを迅速に実行する方法についても検討しました。 最後に、Testcontainers Cloudダッシュボードを使用してTestcontainers Cloudの使用状況に関する洞察を得る方法を見てきました。

Testcontainers Cloudの素晴らしさを自分で体験してみませんか? 今すぐ無料アカウントを作成しましょう。

さらに詳しく