AWS CodeBuildでテストレポートとカバレッジレポートをいい感じに表示する
目指すもの
この記事では、AWS CodeBuildで実行したテスト結果をレポート形式で表示したり、ソースコードベースのカバレッジ詳細をブラウザで確認できるようにする手順を紹介します。
テスト結果を円滑に共有することで、自動テストをいい感じにしていきましょう。
テストレポート(CodeBuild画面)
カバレッジレポート(CodeBuild画面)
カバレッジの詳細(S3でホスティング)
環境
- 言語:Java
- ビルドツール:Gradle
- テストフレームワーク: JUnit
- カバレッジ測定ライブラリ: JaCoCo
CodePipelineの作成
まずCodePipelineを構築します。手順は以下サイトなど参考に。
テストレポートの出力
AWS CodeBuildリファレンスを参考に、reports
を追加するだけでOK。
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-format
にJUnitXML
を指定することで、JUnitのテスト結果をAWS側でいい感じのレポートにしてくれます。
たったこれだけでテストレポートが出力されるようになり、
AWSコンソール画面のCodeBuild>ビルドプロジェクト>レポートから参照できます。
カバレッジレポートの出力
Gradle公式ドキュメントを参考に、GradleでJaCoCoカバレッジレポートが出力されるように設定します。
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.yml
のreports
にjacoco
を追加しましょう。
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をセカンダリアーティファクトとして追加します。
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