🛠️

AWS CodeBuildでテストレポートとカバレッジレポートをいい感じに表示する

2023/01/12に公開

目指すもの

この記事では、AWS CodeBuildで実行したテスト結果をレポート形式で表示したり、ソースコードベースのカバレッジ詳細をブラウザで確認できるようにする手順を紹介します。

テスト結果を円滑に共有することで、自動テストをいい感じにしていきましょう。

テストレポート(CodeBuild画面)

カバレッジレポート(CodeBuild画面)

カバレッジの詳細(S3でホスティング)

環境

  • 言語:Java
  • ビルドツール:Gradle
  • テストフレームワーク: JUnit
  • カバレッジ測定ライブラリ: JaCoCo

CodePipelineの作成

まずCodePipelineを構築します。手順は以下サイトなど参考に。
https://classmethod.github.io/ci-cd-hands-on-ecs/codepipeline/

テストレポートの出力

AWS CodeBuildリファレンスを参考に、reportsを追加するだけでOK。

buildspec.yml
version: 0.2 
 
phases: 
  build: 
    commands: 
      - ./gradlew build

artifacts: 
  files: 
    - ./build/libs/sample.jar
  discard-paths: yes

reports:
  junit:
    files:
      - '**/*'
    base-directory: "build/test-results"
    file-format: 'JUnitXML'

file-formatJUnitXMLを指定することで、JUnitのテスト結果をAWS側でいい感じのレポートにしてくれます。

たったこれだけでテストレポートが出力されるようになり、
AWSコンソール画面のCodeBuild>ビルドプロジェクト>レポートから参照できます。

カバレッジレポートの出力

Gradle公式ドキュメントを参考に、GradleでJaCoCoカバレッジレポートが出力されるように設定します。

build.gradle
plugins {
    id 'jacoco'
}

jacoco {
    toolVersion = "0.8.8"
}

test {
    finalizedBy jacocoTestReport
}
jacocoTestReport {
    dependsOn test
    reports {
        xml.enabled = true
    }
    // カバレッジ除外クラスの設定
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                "example/model/**",
            ])
        }))
    }
}

testタスク実行後にjacocoTestReportタスクを実行し、xmlでレポートを出力するという定義ですね。
また、afterEvaluateでカバレッジ除外クラスも設定しています。

次に、buildspec.ymlreportsjacocoを追加しましょう。

buildspec.yml
version: 0.2 
 
phases: 
  build: 
    commands: 
      - ./gradlew build
      
artifacts: 
  files: 
    - ./build/libs/sample.jar
  discard-paths: yes

reports:
  junit:
    files:
      - '**/*'
    base-directory: "build/test-results"
    file-format: 'JUnitXML'
  # jacocoを追加
  jacoco:
    files:
      - 'build/reports/jacoco/test/jacocoTestReport.xml'
    file-format: 'JACOCOXML'

テストレポートと同様、AWSコンソール画面のCodeBuild>ビルドプロジェクト>レポートから参照できます。

カバレッジの詳細をS3でホスティング

カバレッジレポートで各クラスがカバレッジ何%かはわかりますが、具体的にソースコードのどの部分が実行されたのか分かりません。
JaCoCoはそういったカバレッジの詳細をHTML出力することもできます。S3でホスティングして、ブラウザから確認できるようにしてみましょう。

S3を静的サイトとして公開

AWS公式ドキュメントを参考にしながら設定します。

まず、S3でバケットを作成します。
「パブリックアクセスをすべてブロック」のチェックを外しておきましょう。

バケットを作成後、アクセス許可のバケットポリシーを編集します。
ここでは、IP制限をするため"Effect": "Deny"NotIpAddressを設定しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::バケット名/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::バケット名/*"
        }
    ]
}

バケットのプロパティに「静的ウェブサイトホスティング」があるので、編集します。

静的ウェブサイトホスティングを有効にして、インデックスドキュメントにindex.htmlを指定しましょう。

バケットに適当なindex.htmlをアップロード後、プロパティの「静的ウェブサイトホスティング」のバケットウェブサイトエンドポイントを開くと、webページが表示されます。

buildspecにセカンダリアーティファクトを設定

JaCoCoが出力するhtmlをセカンダリアーティファクトとして追加します。

buildspec.yml
version: 0.2 
 
phases: 
  build: 
    commands: 
      - ./gradlew build
      
artifacts: 
  files: 
    - ./build/libs/sample.jar
  discard-paths: yes
  
  # セカンダリアーティファクトを追加
  secondary-artifacts:
    coverage_report:
      base-directory: "build/reports/jacoco/test/html"
      files:
        - '**/*'

reports:
  junit:
    files:
      - '**/*'
    base-directory: "build/test-results"
    file-format: 'JUnitXML'
  jacoco:
    files:
      - 'build/reports/jacoco/test/jacocoTestReport.xml'
    file-format: 'JACOCOXML'

CodeBuildにセカンダリアーティファクトを追加

CodeBuildの編集で「アーティファクト」を選択します。

「アーティファクトの追加」をして、以下を設定しましょう。

  • アーティファクト識別子:任意の名前
  • タイプ:Amazon S3
  • バケット名:静的サイトとして公開したバケットを指定
  • 名前:任意の名前(URLのパスになる)

あとは、CodePipelineを実行すると、S3にhtmlが出力されます。
以下のようにアーティファクトの「名前」で設定したディレクトリの中に、

JaCoCoが生成したHTMLファイルが出力されていますね。

バケットウェブサイトエンドポイントにURLに、アーティファクトの「名前」で設定したパスを追加すれば、詳細なカバレッジレポートが表示されます。

おわりに

S3でのホスティングはちょっと面倒ですが、ブラウザからカバレッジ詳細を確認できるのは良いですね。
それではよいテスト自動化ライフを!

Discussion