🐥

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