ブランチカバレッジとは?
ブランチカバレッジは、コード内の各判定ポイントを通るすべての可能なパスが、テストによって通過されたかどうかを測定します。
ブランチカバレッジは、判定カバレッジと呼ばれることもあり、行カバレッジのより厳格ないとこです。行が実行されたかどうかを問う代わりに、すべての if、ループ、条件分岐の true と false それぞれの結果が実行されたかどうかを問います。これにより、浅いテストでごまかすのがはるかに難しくなります。
ブランチと行
1 行に 2 つの結果を持つ判定が含まれることがあります。行カバレッジは、片方の結果しかテストされていなくても、その行が実行されればカバー済みとしてマークします。ブランチカバレッジは true と false の両方のパスが通過されたことを要求するため、行カバレッジが見逃すテストされていない else パスを捉えます。
わかりやすい例
ガード節を完全にブランチカバーするには 2 つのテストが必要です。条件が true になるものと、false になるものです。ハッピーパスのテスト 1 つだけでは、もう一方のブランチが暗いまま残ります。
Two branches to cover
function discount(price, isMember) {
if (isMember) return price * 0.9; // need member case
return price; // and non-member case
}なぜより良いシグナルなのか
- テストされていない else や default のパスを露呈させます。
- 些細なテストで水増しするのが難しいです。
- 実際の欠陥検出とより良く相関します。
- より多くのテストが必要な複雑な条件分岐を浮き彫りにします。
実務上の限界
深くネストした条件分岐で完全なブランチカバレッジを得るには多くのテストが必要になり、収穫は逓減します。チームはしばしばブランチカバレッジの目標を 100 パーセントより低く設定し、定型的なコードではなく重要なモジュールに最も厳格な目標を集中させます。
CI におけるブランチカバレッジ
ほとんどのカバレッジツールは行カバレッジと並べてブランチカバレッジを報告し、パイプラインはそれをゲートに使えます。ブランチのインストルメンテーションはオーバーヘッドを追加するため、高速な runner でスイートを実行することで、より厳格な測定が各 push を遅らせないようにします。
重要なポイント
- ブランチカバレッジは、各判定の両方の結果をテストすることを要求します。
- 行カバレッジよりも厳格で正直です。
- あらゆる場所ではなく、重要なコードで高いブランチカバレッジを目指しましょう。
関連ガイド
What Is Code Coverage?Code coverage explained: the main coverage types, how instrumentation works, what the numbers do and do not m…
What Is Test Coverage?Test coverage explained: what it measures, why high coverage is not the same as good tests, how to use it wel…
What Is Mutation Testing?Mutation testing explained: how it grades your tests by introducing bugs and checking if tests catch them, th…
What Is a Unit Test?Unit testing explained: what a unit is, why these tests are small and fast, a simple example, common pitfalls…