用語集 · テストの基礎
コードカバレッジ
英語: Code coverage
別名: カバレッジ, 命令網羅, 分岐網羅, C0カバレッジ
定義
テスト実行中に実行されたソースコード(行、ステートメント、ブランチ、関数)の割合です。何がテストされていないかは分かりますが、十分にテストされているかは分かりません。
コードカバレッジは、テスト実行によってコードのどれだけが実行されたかを測定します。ツールがコードを計装し(Java なら JaCoCo、JavaScript なら Istanbul/nyc または V8 カバレッジ、Python なら coverage.py)、テストを実行して、どの行とブランチが通過したかを報告します。ホワイトボックスの指標であり、主にユニットテストと結合テストで収集されます。
カバレッジの種類
次のコードを考えます。
int shippingCost(double total, boolean isMember) {
if (total >= 100 || isMember) {
return 0;
}
return 5;
}
- ステートメント(行)カバレッジ(C0): 両方の
return文が実行されたか?(150, false)と(20, false)の 2 つのテストで 100% になります。 - ブランチ(判定)カバレッジ(C1):
ifが真と偽の両方になったか? 同じ 2 つのテストでこちらも 100% になります。 - 条件カバレッジ(C2): 各ブール条件が真と偽の両方に評価されたか? 上のテストでは
isMemberが一度も真にならないため、完全ではありません。(20, true)を追加すれば解決します。 - 関数カバレッジ: 各関数が少なくとも 1 回呼び出されたか。
1 行に複数のパスが隠れていることがあるため、一般に行カバレッジよりもブランチカバレッジの方が目標として有用です。
カバレッジから分からないこと
カバレッジが証明するのはコードが実行されたことであって、検証されたことではありません。次のテストは上のメソッドの行カバレッジとブランチカバレッジを 100% にしますが、何も検証していません。
@Test
void runsShippingCost() {
shippingCost(150, false);
shippingCost(20, false);
}
また、カバレッジでは欠けているコードを明らかにできません。要件で「特定地域の会員は送料を支払う」と定められていても、誰も実装していなければ、未カバーになる行そのものが存在しません。テストが実際に欠陥を検出できるかを測るには、通常ミューテーションテストを使います。
上手な使い方
- 数値だけでなく、カバーされていない行を見る。 決済処理パス上の未テストのエラーハンドラーは、未テストの
toString()よりもはるかに重要です。 - 変更されたコードのカバレッジでゲートを設ける。 例として「新しいコードはブランチカバレッジ 80% 以上」とします。全体の割合を基準にすると、どうでもよいゲッターまでテストする動機が生まれます。
- 100% を目標にしない。 指標が目標になると、アサーションのないテストが現れます。