LoginSignup
4
3

More than 1 year has passed since last update.

JacocoMerge が Deprecated になったので、JacocoReport でレポートをマージする

Posted at

概要

カバレッジ計測ツール JaCoCo の Gradle プラグインで、JacocoMerge が Deprecated になりましたので、
これを使わない方法でマルチモジュールの JaCoCo レポートをマージするように変更しました。

背景

Gradle6系 + Jacoco + マルチモジュール + フルKotlin + Android + Robolectric環境でユニットテストのカバレッジを出す
の記事を参考にして、マルチモジュールの Android アプリプロジェクトで JaCoCo のレポートをマージしていました。

Deprecated.

JacocoMerge より

The JacocoReport task accepts multiple execution files as an input.
This task type provides duplicated functionality and will be removed in Gradle 8.0.

JaCoCo Gradle プラグインの JacocoMerge は残念ながら Deprecated となってしまいました。
Gradle 8.0 で削除予定ということで、いつまでも使い続けるわけにはいきません。

修正

先ほどの引用の通り、 JacocoReport が複数の実行ファイルを扱えるようになったので、それを利用します。

変更前

私のプロジェクトの場合は、ルートの build.gradle に以下の記述をして、
$ gradlew jacocoTestReport で各モジュールのカバレッジレポートを作成してから、
$ gradlew jacocoMergedTestReport を実行することで、マージされたレポートを作成していました。

build.gradle
task mergeJacocoFiles(
    type: JacocoMerge,
    group: "verification"
) {
    gradle.afterProject { project, _ ->
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            executionData "${project.buildDir}/jacoco/testDebugUnitTest.exec"
        }
    }
}

task jacocoMergedTestReport(
    type: JacocoReport,
    dependsOn: [tasks.mergeJacocoFiles],
    group: "verification"
) {
    getExecutionData().from = mergeJacocoFiles.destinationFile

    gradle.afterProject { project, _ ->
        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
            getSourceDirectories().from += "${project.projectDir}/src/main/java"
            getClassDirectories().from += project.fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/debug")
        }
    }
    reports {
        xml.enabled = true
        html.enabled = true
    }
}

変更全体

差分は以下の通りです。

-task mergeJacocoFiles( // 元記事では jacocoMerge タスク
-    type: JacocoMerge,
-    group: "verification"
-) {
-    gradle.afterProject { project, _ ->
-        if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
-            executionData "${project.buildDir}/jacoco/testDebugUnitTest.exec"
-        }
-    }
-}// ここまで 1
-
 task jacocoMergedTestReport(
     type: JacocoReport,
-    dependsOn: [tasks.mergeJacocoFiles], // 2
     group: "verification"
 ) {
-    getExecutionData().from = mergeJacocoFiles.destinationFile // 3
-
     gradle.afterProject { project, _ ->
         if (project.rootProject != project && project.plugins.hasPlugin('jacoco')) {
+            getExecutionData().from += "${project.buildDir}/jacoco/testDebugUnitTest.exec" // 4

具体的には以下の変更をしました。

  1. 出力先を変更していた mergeJacocoFiles タスクを削除
  2. jacocoMergedTestReport からその依存(dependsOn の行)を削除
  3. jacocoMergedTestReport の1行目に書いていた getExecutionData().from = mergeJacocoFiles.destinationFile を削除
  4. ループの中に executionData を移動させるコードを追加

実行

修正前と同様に、 $ gradlew jacocoTestReport で各モジュールのカバレッジレポートを作成してから、
$ gradlew jacocoMergedTestReport を実行することで、マージされたレポートが作成されました。

おわりに

JaCoCo Gradle プラグインの JacocoMerge が Deprecated になりました。
jacocoReport を使ってマージするようにタスクを書き換え、複数モジュールの JaCoCo レポートをマージするように変更しました。

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3