コードカバレッジ

テストがソースコードのどの程度の範囲を実行しているかを測定する指標

テスト品質

コードカバレッジとは

コードカバレッジ (Code Coverage) は、テストスイートがソースコードのどの程度の範囲を実行しているかを数値化した指標である。テストの網羅性を客観的に評価し、テストされていないコードパスを特定するために使う。

カバレッジの種類

種類 測定対象 厳密さ
行カバレッジ (Line) 実行された行の割合 低い
分岐カバレッジ (Branch) if/else の全分岐の実行割合 中程度
関数カバレッジ (Function) 呼び出された関数の割合 低い
文カバレッジ (Statement) 実行された文の割合 低い
function calculateDiscount(total: number, isMember: boolean): number {
  if (total > 10000) {        // 分岐 1
    if (isMember) {           // 分岐 2
      return total * 0.2;     // 行 A
    }
    return total * 0.1;       // 行 B
  }
  return 0;                   // 行 C
}

// テスト: calculateDiscount(15000, false) → 行 B を実行
// 行カバレッジ: 66% (B, C のうち B のみ)
// 分岐カバレッジ: 50% (分岐 1 の true のみ、分岐 2 の false のみ)

Vitest でのカバレッジ測定

// vitest.config.ts
export default defineConfig({
  test: {
    coverage: {
      provider: 'v8',
      reporter: ['text', 'html', 'lcov'],
      thresholds: {
        lines: 80,
        branches: 80,
        functions: 80,
        statements: 80,
      },
    },
  },
});
npx vitest run --coverage
# ✓ Lines:      85.2%  (threshold: 80%)
# ✓ Branches:   78.5%  (threshold: 80%) ← 失敗!
# ✓ Functions:  90.1%  (threshold: 80%)

カバレッジの目安

目標 適するケース
80% 一般的なアプリケーション (推奨)
90%+ ライブラリ、決済処理、セキュリティ関連
100% 現実的でない (テストのためのテストになる)

80% は「重要なビジネスロジックがテストされている」目安だ。100% を目指すと、getter/setter やエラーハンドリングの些末なテストが増え、保守コストが上がる。

カバレッジの落とし穴

カバレッジが高い ≠ テストの品質が高い

// カバレッジ 100% だが、テストの品質は低い
test('calculateDiscount', () => {
  calculateDiscount(15000, true);  // 実行するだけで assert がない!
});

行を実行しただけでカバレッジは上がるが、結果を検証していなければバグは検出できない。

分岐カバレッジを重視する

行カバレッジより分岐カバレッジの方が重要だ。1 行に複数の分岐がある場合 (a && b || c)、行カバレッジは 100% でも分岐カバレッジは低い可能性がある。

CI での活用

# GitHub Actions: カバレッジが閾値を下回ったら CI を失敗させる
- name: Test with coverage
  run: npx vitest run --coverage

PR ごとにカバレッジを測定し、閾値を下回ったらマージをブロックする。カバレッジの低下を防ぐ「ラチェット」として機能する。

実務での活用方法は関連書籍にも詳しい。

関連用語