[アップデート] AWS CodeBuild がテスト分割と並列処理をサポートしており、並列テスト時のテストレポートマージもしてくれるようになりました

[アップデート] AWS CodeBuild がテスト分割と並列処理をサポートしており、並列テスト時のテストレポートマージもしてくれるようになりました

Clock Icon2025.03.01

いわさです。

AWS CodeBuild 上でユニットテストを実行することは多いと思うのですが、2025 年 1 月 と 2 月の分散テストのサポートが強化されています。

まず 2025 年 1 月の次のアップデートではテストを分割して並列実行コンピューティング環境で実行ができるようになりました。
実行時のオプションでシャーディング戦略を指定することで良い感じにテストを分散して実行してくれるようになります。
これによってテスト時間の短縮が期待できます。

https://aws.amazon.com/jp/about-aws/whats-new/2025/01/aws-codebuild-test-splitting-parallelism/

で、AWS CodeBuild にはテストレポートを出力することもできます。
上記に伴って分散テストが実行できるようになったのですが、レポートも分散されるようになってしまいました。

それが先日 2025 年 2 月のアップデートで分散テスト実行時にもテストレポートをマージして 1 つの統合レポートを作成してくれるようになりました。

https://aws.amazon.com/about-aws/whats-new/2025/02/aws-codebuild-merging-parallel-test-reports-compute-options/

上記 2 つのアップデートをまとめて検証してみたいと思います。

まず普通にテストしてみる

まずは普通にテストしてみます。
検証用のアプリケーション、テストコードは以下のリポジトリに作成しました。文字列結合とかしてくれるだけのあまり意味のないやつです。

https://github.com/Tak1wa/hoge0301unittestpython

以下はテストフレームワークに Pytest を使った場合の BuildSpec の公式サンプルです。

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-parallel-test-python.html

並列テストが有効化されているのですが、まずは並列 + テスト分割なしでテストしたいので batch セクションを削除します。
テスト分割もまずは使わないのでcodebuild-tests-runコマンドのsharding-strategyオプションも削除しておきます。

version: 0.2

phases:
  install:
    commands:
      - echo 'Installing Python dependencies'
      - apt-get update
      - apt-get install -y python3 python3-pip
      - pip3 install --upgrade pip
      - pip3 install pytest
  build:
    commands:
      - echo 'Running Python Tests'
      - |
         codebuild-tests-run \
          --test-command 'python -m pytest' \
          --files-search "codebuild-glob-search 'tests/test_*.py'" 
  post_build:
    commands:
      - echo "Test execution completed"

実行してみましょう。

image.png

お、テストが無事完了しました。

テストレポートを出力する

で、上記だけだと次のようにテストレポートは出力されません。

image.png

以下の公式ドキュメントに詳細は記載されていますが、reportsセクションを追加する必要があります。

https://docs.aws.amazon.com/codebuild/latest/userguide/test-reporting.html

また、AWS CodeBuild でサポートされているレポート形式は以下のようなので、今回は JUnit XML を出力させましょう。

  • Cucumber JSON (.json)
  • JUnit XML (.xml)
  • NUnit XML (.xml)
  • NUnit3 XML (.xml)
  • TestNG XML (.xml)
  • Visual Studio TRX (.trx)
  • Visual Studio TRX XML (.xml)
version: 0.2

phases:
  install:
    commands:
      - echo 'Installing Python dependencies'
      - apt-get update
      - apt-get install -y python3 python3-pip
      - pip3 install --upgrade pip
      - pip3 install pytest
  build:
    commands:
      - echo 'Running Python Tests'
      - mkdir -p test-reports
      - |
         codebuild-tests-run \
          --test-command 'python -m pytest --junitxml=test-reports/junit.xml' \
          --files-search "codebuild-glob-search 'tests/test_*.py'"
  post_build:
    commands:
      - echo "Test execution completed"

reports:
  test_reports:
    files:
      - "test-reports/junit.xml"
    file-format: JUNITXML

artifacts:
  files:
    - test-reports/**/*
  name: test-reports
  discard-paths: false

またビルド(テスト)を実行してみると、今度はレポートが出力されました。「レポート」タブから確認が可能です。

image.png

レポートを見てみると、12件のテストが実行されオールグリーンであることが確認できます。
冒頭のサンプルリポジトリを見ていただくとわかるのですが、今回は 4 件のテストケースを 3 つのファイルに分けて実行しています。

image.png

並列テストを実行する

で、ここまでは 1 つのコンピューティングリソースでビルド&テストを実行していましたが、ここからは分散テストを CodeBuild で実行してみます。
並列テストについては以下の公式ドキュメントで解説されています。

https://docs.aws.amazon.com/codebuild/latest/userguide/parallel-test.html

バッチビルドを行うのですが、あわせてbatchセクションとsharding-strategyを追加します。

version: 0.2

batch:
  fast-fail: false
  build-fanout:
    parallelism: 3
    ignore-failure: false

phases:
  install:
    commands:
      - echo 'Installing Python dependencies'
      - apt-get update
      - apt-get install -y python3 python3-pip
      - pip3 install --upgrade pip
      - pip3 install pytest
  build:
    commands:
      - echo 'Running Python Tests'
      - mkdir -p test-reports
      - |
         codebuild-tests-run \
          --test-command 'python -m pytest --junitxml=test-reports/junit.xml' \
          --files-search "codebuild-glob-search 'tests/test_*.py'" \
          --sharding-strategy 'equal-distribution'
  post_build:
    commands:
      - echo "Test execution completed"

reports:
  test_reports:
    files:
      - "test-reports/junit.xml"
    file-format: JUNITXML

artifacts:
  files:
    - test-reports/**/*
  name: test-reports
  discard-paths: false

バッチビルドの実行結果詳細を見てみると、複数のビルド実行が行われていることがわかります。並列実行されてます。

A7A9AF8C-1CD0-4CA8-BEFE-C66226BCDC19.png

上記のうちのひとつのビルド実行詳細を確認してみましょう。以下は 1 つ目です。
レポートを見てみると次のように 4 件のテストがこの環境では実行されています。

07D0D700-A52E-4B79-8C14-2C9C2F97EDEA.png

次は 2 つ目のビルド実行です。こちらも 4 件実行されていますが別のテストケースが実行されていることがわかりますね。
こんな感じで複数のビルドが並列で実行され、それぞれの環境でテストファイルを分割実行していることがわかります。なるほどなぁ。

image.png

マージされた統合レポートを確認する

最後に、先日のアップデートである並列テスト実行時のマージレポートについても確認してみましょう。
バッチ実行詳細自体にもレポートタブがありまして、こちらからレポートが確認できます。

image.png

マージされて 12 件のテスト結果が確認できますね。それぞれの分散環境のレポートを手動で拾わなくて良いのでこれは便利です。

image.png

さいごに

本日は AWS CodeBuild がテスト分割と並列処理をサポートしており、並列テスト時のテストレポートマージもしてくれるようになったので一通り確認してみました。

テスト分割機能は大規模なテストを実行している場合にテスト時間の短縮が期待できる機能です。また、その弊害としてレポートが分散してしまう問題も今回のマージレポートによって解決されるようになりました。

CodeBuild のテスト実行時間でお悩みの方は是非検討してみましょう。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.