概要
カバレッジ計測ツール 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
を実行することで、マージされたレポートを作成していました。
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
具体的には以下の変更をしました。
- 出力先を変更していた mergeJacocoFiles タスクを削除
- jacocoMergedTestReport からその依存(dependsOn の行)を削除
- jacocoMergedTestReport の1行目に書いていた getExecutionData().from = mergeJacocoFiles.destinationFile を削除
- ループの中に executionData を移動させるコードを追加
実行
修正前と同様に、 $ gradlew jacocoTestReport
で各モジュールのカバレッジレポートを作成してから、
$ gradlew jacocoMergedTestReport
を実行することで、マージされたレポートが作成されました。
おわりに
JaCoCo Gradle プラグインの JacocoMerge が Deprecated になりました。
jacocoReport を使ってマージするようにタスクを書き換え、複数モジュールの JaCoCo レポートをマージするように変更しました。