はじめに
現在参画している案件で、「テストのカバレッジ測定したい」というお話をいただきました。
あー、またかと思いつつ、Javaの場合は最近どんなやり方やるんだろうなと思い、調べてみました。古くは、Cobertura を使ってレポートしてましたが、最近の動向は抑えてなかったので、調べるところから
調査結果
以下ようなものを見つけて試してみました。
- Clover ・・・ atlassianの製品みたい。途中まで進めるもライセンスファイル要求され断念
- Kover ・・・Android用。Javaでも使えるっぽい。テストは実行できるもカバレッジ出ず断念
- JaCoCo ・・・まだ0.8.12であるものの、以前にも使ったので、結果としてはこれを採用
環境
Java 21
Gradle 8.8
JaCoCo
やってみる
Gradleの設定ファイルを作る
build.gradle
plugins {
id 'java'
id 'jacoco'
id 'application'
}
group = 'com.example'
version = '0.0.1'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
・・・必要な依存関係は適宜追加してください・・・
}
jacoco {
applyTo tasks.run // runタスクにJacocoを適用
}
tasks.register('applicationCodeCoverageReport', JacocoReport) {
executionData tasks.test // 実行データをテストタスクのものに設定
sourceSets sourceSets.main // ソースコードをメインソースセットに設定
reports {
html.required = true // HTMLレポートを生成
xml.required = false // XMLレポートは不要
}
}
// "test" タスクの設定。JUnit 5 を使用してテストを実行する
tasks.named("test", Test) {
useJUnitPlatform() // JUnit 5 を使用する
include '**/*Test.class' // 特定の名前のテストクラス(*Test.class)を対象にする
}
// すべてのコンパイルタスクで使用する文字コードを UTF-8 に固定
tasks.withType(AbstractCompile).each {
it.options.encoding = 'UTF-8' // ソースコードのエンコーディングを UTF-8 に設定
}
// すべてのテストタスクで実行時に使用するファイルエンコーディングを UTF-8 に固定
tasks.withType(Test) {
systemProperty "file.encoding", "UTF-8" // 実行環境の文字コードを UTF-8 に設定
}
// テストタスク (test) が終了した後に、コードカバレッジのレポートを生成するタスク (jacocoTestReport) を実行
test.finalizedBy jacocoTestReport
// Jacoco のカバレッジレポートから除外するクラスファイルを定義
def coverageExcludeFiles = [
'**/*$*.class', // ネストされたクラス(インナークラス)を除外
'**/*$lambda$*.class', // ラムダ式に対応するクラスを除外
]
// Jacoco のテストカバレッジレポートの設定
jacocoTestReport {
// レポートの出力形式を設定
reports {
html.required = true // HTML レポートを有効化
xml.required = false // XML レポートは無効化(必要に応じて変更可能)
}
// Jacoco のクラスファイル設定を後から評価して適用
afterEvaluate {
// クラスディレクトリのファイルリストを収集し、除外設定を適用
classDirectories = files(classDirectories.files.collect {
fileTree(
dir: it, // 各クラスファイルのディレクトリ
exclude: coverageExcludeFiles // 除外するクラスファイルパターン
)
})
}
}
実行する
./gradlew test
実行結果
おわりに
いろいろ試してみましたが、結局以前に使ったことのあるJaCoCoに落ち着きました。
Koverの情報がもう少し整ってくれば、乗り換えも検討したいと思います。