カバレッジの種類(C0 / C1 / C2)
コードカバレッジには複数の指標があります。JaCoCo が測定する代表的な指標を整理します。
| 指標 | 別名 | 意味 | 一般的な目標値 |
|---|---|---|---|
| C0 | 命令網羅(Statement Coverage) | 実行された命令文の割合 | 80% 以上 |
| C1 | 分岐網羅(Branch Coverage) | if/switch の真偽両方を実行した割合 | 70% 以上 |
| C2 | 条件網羅(Condition Coverage) | 複合条件の各部分条件を真偽両方で実行 | プロジェクト依存 |
| 行カバレッジ | Line Coverage | 実行されたソースコード行の割合 | 80% 以上 |
| メソッドカバレッジ | Method Coverage | テストで呼び出されたメソッドの割合 | 90% 以上 |
ℹ️ JaCoCo の Branch Coverage は C1 に相当
JaCoCo レポートの「Branches」列が C1 カバレッジです。if 文・三項演算子・switch 文のすべての分岐を網羅しているかを示します。
Gradle プラグイン設定
// build.gradle
plugins {
id 'java'
id 'jacoco' // JaCoCo プラグインを有効化
}
jacoco {
toolVersion = "0.8.11" // 最新バージョンを指定
}
test {
useJUnitPlatform()
finalizedBy jacocoTestReport // テスト後に自動でレポート生成
}
jacocoTestReport {
dependsOn test // テストが完了してからレポートを生成
reports {
xml.required = true // SonarQube / Codecov 連携用
html.required = true // ブラウザで確認する HTML レポート
csv.required = false
}
// ── 除外クラスの設定 ──
afterEvaluate {
classDirectories.setFrom(files(classDirectories.files.collect {
fileTree(dir: it, exclude: [
'**/config/**', // Spring 設定クラス
'**/dto/**', // DTO(ロジックなし)
'**/*Application*', // SpringBoot 起動クラス
'**/generated/**' // コード生成クラス
])
}))
}
}
レポートの読み方
./gradlew test jacocoTestReport を実行すると build/reports/jacoco/test/html/index.html が生成されます。
| 列名 | 意味 |
|---|---|
| Element | パッケージ / クラス / メソッド名 |
| Missed Instructions | 実行されなかった命令数(赤色表示) |
| Cov. (%) | C0 カバレッジ率 |
| Missed Branches | テストされていない分岐数 |
| Cov. (%) ※2列目 | C1 カバレッジ率(分岐網羅) |
| Missed / Cov. Lines | 行カバレッジ |
| Missed / Cov. Methods | メソッドカバレッジ |
クラスをクリックするとソースコード表示に切り替わり、緑(テスト済)・黄(部分的)・赤(未テスト)で色分けされます。赤い行を優先的にテストを追加する対象とします。
カバレッジ閾値の設定と CI ゲート
jacocoTestCoverageVerification タスクで閾値を設定し、基準を下回ったらビルドを失敗させられます。
jacocoTestCoverageVerification {
violationRules {
rule {
limit {
// C0(命令網羅)80% 以上
counter = "INSTRUCTION"
value = "COVEREDRATIO"
minimum = 0.80
}
}
rule {
limit {
// C1(分岐網羅)70% 以上
counter = "BRANCH"
value = "COVEREDRATIO"
minimum = 0.70
}
}
rule {
// クラスごとに最低限のメソッドカバレッジを要求
element = "CLASS"
excludes = [
"com.example.config.*",
"com.example.dto.*"
]
limit {
counter = "METHOD"
value = "COVEREDRATIO"
minimum = 0.80
}
}
}
}
// test → jacocoTestReport → jacocoTestCoverageVerification の順に実行
check.dependsOn jacocoTestCoverageVerification
計測対象から除外するクラス
カバレッジ計測から除外すべきクラスとその理由を整理します。
| 除外対象 | 理由 |
|---|---|
**/*Application.java | Spring Boot 起動クラスはロジックなし |
**/config/** | Bean 定義クラスは通常ビジネスロジックなし |
**/dto/**, **/vo/** | データクラス(getter/setter のみ)はテスト価値低 |
**/generated/** | 自動生成コード(QueryDSL・jOOQ など) |
**/*Exception.java | カスタム例外クラスはロジックなし |
**/*Mapper.java | MyBatis Mapper インターフェース |
GitHub Actions 連携
プルリクエストごとにテストとカバレッジ検証を自動実行するワークフローです。
# .github/workflows/ci.yml
name: CI — Test & Coverage
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }}
- name: Run tests with coverage
run: ./gradlew test jacocoTestReport jacocoTestCoverageVerification
- name: Upload JaCoCo HTML Report
uses: actions/upload-artifact@v4
if: always() # テスト失敗時もレポートをアップロード
with:
name: jacoco-report
path: build/reports/jacoco/test/html/
# Codecov へのアップロード(オプション)
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: build/reports/jacoco/test/xml/jacoco.xml
fail_ci_if_error: false
✅ PR コメントにカバレッジを表示
madrapps/jacoco-report アクションを追加すると、PR のコメントにカバレッジサマリが自動投稿されてレビュー効率が上がります。
カバレッジ向上の実践 Tips
⚠️ カバレッジ 100% を目指さない
getter/setter・例外コンストラクタ・設定クラスのカバレッジを無理に上げると「意味のないテスト」が増えます。重要なビジネスロジックの C0 80%・C1 70% 達成を優先してください。
✅ 未カバー分岐の見つけ方
HTML レポートで黄色ハイライトされた行は「部分的にしか通過していない分岐」を示します。条件式が複数条件(AND/OR)の場合、各部分条件の真偽をテストする @ParameterizedTest を追加しましょう。
まとめ
- JaCoCo は
id 'jacoco'プラグインで即座に利用できる。finalizedBy jacocoTestReportでテスト後に自動生成 - C0(命令網羅)80% ・C1(分岐網羅)70% を
jacocoTestCoverageVerificationでゲート化する - DTO・設定クラス・自動生成コードは計測対象から除外してノイズを減らす
- GitHub Actions で PR 単位にカバレッジを自動チェックし、品質の継続的な維持を実現する
- カバレッジ数値ではなく「仕様の条件分岐が検証されているか」を本質的な目標に置く