jacoco-report-aggregation を使ってマルチモジュール構成のカバレッジレポートを集める
最近本業で地道に gradle の昔から残ってる名残とかを消していくというのを空き時間でやってる。
gradle 7.4 から入った jacoco-report-aggregation
を導入してマルチモジュール構成のカバレッジレポート集計のための古き良き設定を捨てることに成功したのでメモ。
以前までは、例えば、6.5.1の時のドキュメント にも記載の通り、以下のように設定する必要があった。
tasks.register<JacocoReport>("codeCoverageReport") {
subprojects {
val subproject = this
subproject.plugins.withType<JacocoPlugin>().configureEach {
subproject.tasks.matching({ it.extensions.findByType<JacocoTaskExtension>() != null }).configureEach {
val testTask = this
sourceSets(subproject.sourceSets.main.get())
executionData(testTask)
}
subproject.tasks.matching({ it.extensions.findByType<JacocoTaskExtension>() != null }).forEach {
rootProject.tasks["codeCoverageReport"].dependsOn(it)
}
}
}
}
これに近いものを書いたことがある人は多いと思う。
しかし 7,4以降は以下の記事などにある通り jacoco-report-aggregation
を利用することで複数プロジェクトのカバレッジレポート集計が簡単になった。
使い方はというと以下の2つが参考になった。
- The JaCoCo Report Aggregation Plugin
Aggregating code coverage with JaCoCo using a standalone utility project (Incubating) Sample
plugins { // ... // ... id("jacoco-report-aggregation") } subprojects { // ... // ... // モジュール自体には jacoco のプラグインが設定されていることが前提のよう // 個別に設定するのは面倒なので、全てのサブプロジェクトで設定したかった apply(plugin = "jacoco") jacoco { toolVersion = "0.8.7" } // この設定が必要とはドキュメントに書かれていたが、 // 自分の場合は最初からここ設定してたので差分はわからない tasks.withType<Test> { useJUnitPlatform() } } // エントリーポイントとなるモジュールをここに列挙する // 依存するモジュールは全て自動で解決してくれるみたい // e.g. module1 -> shared となっている場合には以下の設定で shared も対象に含まれる dependencies { jacocoAggregation(project(":module1")) jacocoAggregation(project(":module2")) jacocoAggregation(project(":module3")) // ... } // カバレッジレポートの対象を自分達で書いてるアプリケーションコードに限定したい tasks { testCodeCoverageReport { classDirectories.setFrom(files( subprojects.map {it.fileTree(mapOf("dir" to "${it.buildDir}/classes/kotlin/main"))} )) } }
この設定だけで以下のコマンドで
build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml
に集計されたカバレッジレポートが出力される。
./gradlew testCodeCoverageReport
余談
同じようなプラグインとして test-report-aggregation
があってテストレポートを1つにマージするのもできるらしいけど、この置き換えをした時点では jacoco-report-aggregation
とうまく共存させる方法がわからなかったのでもうちょっと調べたい