GithubのPR時にJacocoのテストカバレッジ計測結果を確認する
はじめに
Septeni Japan株式会社でプロダクト開発を行なっているエンジニアの丸山です。
単体テストはバグの発見やデグレードの防止などシステムの品質を維持するための重要な手段の一つです。その単体テストが不足していると、システムの品質にも関わってくることにもなります。
そこで今回は以下のような環境・ツールでテストが不足していないかを検知する仕組みを作っていきたいと思います。
- Github
- Gradle(Kotlin)
- Jacoco
- Jacoco Report(Github Actions)
今回作るもの
今回はオニオンアーキテクチャのドメイン層とユースケース層(アプリケーションサービス層)に単体テストを書くという状況で、この2つの層のテストが不足していないかを検知するための仕組みとして、テストカバレッジの計測結果をGithubのPR時にコメントに表示するようにしてみました。
Jacocoの設定
テストカバレッジの計測に使うのはJacocoというJava用コードカバレッジライブラリです。
build.gradleにJacocoの設定を追加します。
plugins {
...
id("jacoco") //プラグインの追加
}
tasks.test {
finalizedBy(tasks.jacocoTestReport) // ./gradlew test時にカバレッジレポートが出力されるよう設定
}
tasks.jacocoTestReport { // Jacocoの詳細な設定
dependsOn(tasks.test)
reports {
xml.required = true
csv.required = false
html.required = true
}
classDirectories.setFrom(
files(
classDirectories.files.map {
fileTree(it) {
include("**/domain/**", "**/usecase/**")
}
},
),
)
}
tasks.jacocoTestReportの部分で、
- レポートをxml、htmlの形で出力する
reports {
xml.required = true
csv.required = false
html.required = true
}
- 出力されるレポートはdomain層、usecase層のテストカバレッジのみ
classDirectories.setFrom(
files(
classDirectories.files.map {
fileTree(it) {
include("**/domain/**", "**/usecase/**")
}
},
),
)
という設定を行なっています。
ここでxmlを指定しているのは、後程紹介するJaCoCo Reportでxml形式のレポートを使用するためです。またhtmlはJaCoCo Reportを使うだけであれば必要ありませんが、ローカルなどでhtmlを開くことでより詳細な計測結果の内容を確認できるので、合わせて出力しています。
この状態で./gradlew testを実行すると、build/reports/jacoco配下にレポートが出力されます。
Jacoco Reportの設定
次に出力した計測結果がgithubのPR時にコメントに表示されるようにしていきます。
ここではJaCoCo ReportというJacocoのレポートをコメントで表示してくれるGitHub Actionを使用します。
GitHub Actionsのワークフローで下記のような設定をします。
name: Unit Test
on:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: 17
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- name: Run Unit Test
run: |
./gradlew test
- name: Report Test Coverage
uses: madrapps/jacoco-report@v1.7.1
with:
paths: |
${{ github.workspace }}/**/build/reports/jacoco/jacocoTestReport.xml
token: ${{ secrets.GITHUB_TOKEN }}
skip-if-no-changes: true
Report Test Coverage
というステップがJaCoCo Reportを使った部分になります。
pathsにはJacocoの設定時にレポートが出力されたパスを記述してください。
また、今回skip-if-no-changesをtrue(defaultではfalse)にしています。これはカバレッジの情報がないファイルが変更された場合PRのコメントに計測結果を出さないようにする機能です。
今回でいえばカバレッジの計測はdomainとusecaseのみで行っているので、それ以外のファイルの変更のPRに対しては計測結果が出なくなります。
これでPRのコメントに計測結果が表示されます。
まとめ
以上、JacocoとJacoco Reportを使って、GithubのPRでテストカバレッジ計測結果を確認する方法でした。計測結果の数値を確認するだけであればこの方法で簡単に導入できますので、検知を目的とする場合はまずはここから始めても良いのではないでしょうか。
Discussion