コードカバレッジ
テストがソースコードのどの程度の範囲を実行しているかを測定する指標
テスト品質
コードカバレッジとは
コードカバレッジ (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 ごとにカバレッジを測定し、閾値を下回ったらマージをブロックする。カバレッジの低下を防ぐ「ラチェット」として機能する。
実務での活用方法は関連書籍にも詳しい。