すべての分岐の真と偽の両方を実行することを確認するテスト網羅基準。
分岐網羅(ブランチカバレッジ)とは、プログラム中のすべての分岐(=if文などの枝分かれ)について、真と偽の両方のルートを最低1回ずつ実行することを目指すテスト基準です。プログラムの内部構造に注目してテストを設計する「ホワイトボックステスト」の代表的な基準のひとつです。
身近な例で考えると、道路の分かれ道に似ています。左の道と右の道、どちらも実際に車を走らせてみて初めて「両方とも問題なく通れる」と確認できます。片方の道しか通っていなければ、もう片方に穴が空いていても気づけません。
上のツールで▶ボタンを押すと、合否判定の if 文に対して score=80(真)と score=30(偽)の2件を実行し、両方のルートを通って分岐網羅が100%になる流れを確認できます。
分岐網羅率は、実行できた分岐の数を、全分岐数で割って求めます。ここでいう「分岐」は真ルート・偽ルートをそれぞれ1つと数えます。
分岐網羅率 = 実行した分岐数 ÷ 全分岐数
上のツールの例で計算してみましょう。
・全分岐数:1つの if 文に真・偽の2方向 → 2
・score=80 を実行:真ルートを通過 → 実行1(網羅率 50%)
・score=30 を実行:偽ルートを通過 → 実行2(網羅率 100%)
よって 2 ÷ 2 = 100% です。片方のルートしか通っていなければ50%にとどまります。テストの網羅率が高いほど、見落としの少ない丁寧なテストだといえます。
似た言葉に命令網羅(ステートメントカバレッジ)があります。命令網羅は「すべての命令(行)を1回は実行する」基準で、分岐網羅は「すべての分岐の真偽を実行する」基準です。分岐網羅のほうが厳しい(強い)基準です。
| 項目 | 命令網羅 | 分岐網羅 |
|---|---|---|
| 狙い | 全命令を1回実行 | 全分岐の真偽を実行 |
| 厳しさ | 弱い | 強い |
| 包含関係 | 分岐網羅に含まれる | 命令網羅を内包する |
ポイントは「分岐網羅を満たせば命令網羅も自動的に満たされる」という関係です。すべての分岐の真偽を通れば、その途中にある命令はすべて実行されるからです。逆は成り立ちません。たとえば if 文の真ルートだけを通せば「合格」の命令は実行され命令網羅は達成できますが、偽ルートを通っていないので分岐網羅は50%のままです。
なぜ真と偽の両方を通さなければならないのか?それは、通っていないルートに潜むバグは、通らない限り見つけられないからです。
たとえば上の図のように、合格(真)ルートだけをテストしていると、不合格(偽)ルートに書き間違いがあっても気づきません。点数が低いユーザーが実際に使ったときに初めて不具合が起きます。
・片方しか通っていない=もう片方の中身は「存在するが検査されていない」状態
・分岐網羅を要求する理由=「すべての枝を一度は歩いてみる」ことで、隠れた問題を洗い出す
道路の例で言えば、左の道だけ点検して「道は安全」と判断するのは間違いです。右の道に穴が空いていても、誰も通らなければ気づかないからです。分岐網羅とは「どの道も最低1回は実際に走って確かめる」ことを義務づける基準です。
分岐網羅よりさらに厳しい基準として条件網羅(コンディションカバレッジ)があります。条件網羅とは、条件式の中に含まれる個々の比較(部分条件)について、それぞれ真と偽の両方を実行する基準です。
たとえば if (A かつ B) という条件があるとき、分岐網羅は「条件全体が真になるケース」と「偽になるケース」の2つを通せばOKです。しかし条件網羅では、A が真・偽の両方、B が真・偽の両方をそれぞれ実行しなければなりません。
・命令網羅:全命令を1回実行(最も弱い)
・分岐網羅:全分岐の真偽を実行(命令網羅より強い)
・条件網羅:各部分条件の真偽を実行(分岐網羅より強い)
ただし、条件網羅を満たしても分岐網羅を満たすとは限らない点に注意が必要です。これは「部分条件を個別にチェックすることと、全体の分岐の真偽をチェックすることは別」だからです。現場ではテストにかけられるコストと要求される品質に応じて、どの基準を使うかを選びます。