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つが参考になった。

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 とうまく共存させる方法がわからなかったのでもうちょっと調べたい

The Test Report Aggregation Plugin