8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プライム・ブレインズAdvent Calendar 2024

Day 4

Javaのコードカバレッジを測定する

Last updated at Posted at 2024-12-03

はじめに

現在参画している案件で、「テストのカバレッジ測定したい」というお話をいただきました。
あー、またかと思いつつ、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

実行結果

こんな感じで、パッケージ単位のサマリも出力されます。
image.png

クラス毎のカバレッジも、以下のように参照が可能です。
image.png

おわりに

いろいろ試してみましたが、結局以前に使ったことのあるJaCoCoに落ち着きました。
Koverの情報がもう少し整ってくれば、乗り換えも検討したいと思います。

8
0
0

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
8
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?