JUnit 5でテストを書いていると、「テストが通っているか」だけでなく、「どの処理までテストで確認できているか」も見たくなることがあります。

そのときに使えるのが、Javaのカバレッジ計測ツールであるJaCoCoです。

この記事では、GradleプロジェクトでJaCoCoを使い、JUnit 5のテスト実行後にHTML形式のカバレッジレポートを出力するための build.gradle 設定を整理します。

JaCoCoでできること

JaCoCoを使うと、テストを実行したときに、どのクラスやメソッドが実行されたかをレポートとして確認できます。

カバレッジは、単に数字を上げるためのものではありません。まだテストで確認できていない処理を探すための材料として使うと便利です。

pluginsにjacocoを追加する

まず、build.gradleplugins ブロックに jacoco プラグインを追加します。

plugins {
    id 'java'
    id 'jacoco'
}

すでに plugins ブロックがある場合は、新しく plugins ブロックを作るのではなく、既存のブロックの中に id 'jacoco' を追加します。

testタスクの後にレポートを作成する

JUnit 5のテストをGradleから実行し、そのあとにJaCoCoのレポートを作成するには、test タスクに設定を追加します。

書き方は大きく分けて2パターンあります。

1つ目は、tasks.named('test') を使う書き方です。

tasks.named('test') {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

すでにプロジェクトに次のような設定が書かれている場合は、

tasks.named('test') {
    useJUnitPlatform()
}

新しく test ブロックを追加するのではなく、既存の tasks.named('test') の中に finalizedBy jacocoTestReport を追加すればOKです。

2つ目は、test ブロックを使う書き方です。

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

どちらも test タスクに対する設定なので、目的は同じです。

useJUnitPlatform() は、JUnit 5のテストをGradleから実行するための設定です。

finalizedBy jacocoTestReport を指定すると、test タスクの実行後に jacocoTestReport が続けて実行されます。

注意点として、次のように両方を同時に書く必要はありません。

tasks.named('test') {
    useJUnitPlatform()
}

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

この場合、useJUnitPlatform() が重複しています。テストが2回実行されるわけではありませんが、同じ設定を2回書いている状態になるため、少しわかりにくくなります。

そのため、既存の tasks.named('test') に追記するか、test ブロックにまとめるか、どちらか一方にそろえるのがおすすめです。

JaCoCoレポートの設定

次に、JaCoCoのHTMLレポートを出力する設定を書きます。

jacocoTestReport {
    dependsOn test

    reports {
        html.required = true
    }
}

dependsOn test は、jacocoTestReport を直接実行した場合でも、先に test を実行してからレポートを作るための設定です。

html.required = true を指定すると、ブラウザで確認しやすいHTML形式のレポートを出力できます。

build.gradleの設定例

ここまでの設定をまとめると、次のようになります。

まず、tasks.named('test') を使う場合の設定例です。

plugins {
    id 'java'
    id 'jacoco'
}

tasks.named('test') {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    dependsOn test

    reports {
        html.required = true
    }
}

すでに tasks.named('test') が書かれているプロジェクトでは、この形で追記するとわかりやすいです。

一方で、test ブロックを使う場合は、次のようになります。

plugins {
    id 'java'
    id 'jacoco'
}

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}

jacocoTestReport {
    dependsOn test

    reports {
        html.required = true
    }
}

どちらの書き方でも、test タスクでJUnit 5を実行し、その後に jacocoTestReport を実行する、という意味になります。

ただし、両方を同時に書く必要はありません。既存のプロジェクトに追加する場合は、pluginstest タスクの設定を重複させないように注意してください。

レポートの出力先

テスト実行後、基本的には次のHTMLファイルをブラウザで開いて確認します。

build/reports/jacoco/test/html/index.html

Gradleやプロジェクト設定によって出力先が少し変わる場合もあるため、見つからない場合は build/reports/jacoco 配下を確認してください。

まとめ

GradleでJaCoCoを使う場合は、pluginsid 'jacoco' を追加し、test の後に jacocoTestReport が実行されるように設定します。

test タスクの設定は、tasks.named('test') を使う書き方でも、test ブロックを使う書き方でも構いません。

ただし、同じ設定を重複して書く必要はないため、既存の build.gradle に合わせて、どちらか一方の書き方にそろえるのがおすすめです。

HTMLレポートを出力しておくと、テストで確認できている範囲と、まだ確認できていない処理を見つけやすくなります。


Java、JUnit 5、Mockito、DBUnit、Spring Bootなどを使ったテスト実装を体系的に学びたい方向けに、Udemyで講座も作っています。

講座はこちらです。
JUnit 5完全攻略: Javaのテスト実装を基礎から実務レベルまで学ぶ