カバレッジの種類(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.javaSpring Boot 起動クラスはロジックなし
**/config/**Bean 定義クラスは通常ビジネスロジックなし
**/dto/**, **/vo/**データクラス(getter/setter のみ)はテスト価値低
**/generated/**自動生成コード(QueryDSL・jOOQ など)
**/*Exception.javaカスタム例外クラスはロジックなし
**/*Mapper.javaMyBatis 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 単位にカバレッジを自動チェックし、品質の継続的な維持を実現する
  • カバレッジ数値ではなく「仕様の条件分岐が検証されているか」を本質的な目標に置く