すべての命令が少なくとも1回実行されることを確認するテスト網羅基準。
命令網羅(ステートメントカバレッジ)とは、テストのときプログラム中のすべての命令(処理の1行)が、少なくとも1回は実行されたかを確認する網羅基準のことです。プログラムの中身(コード)を見ながら検証する、ホワイトボックステストの代表的な基準です。
身近な例で考えると、料理のレシピの全工程を一度は試しておくのに似ています。「炒める」「煮る」「盛り付ける」という手順があるなら、そのすべてを最低1回は実際にやってみて、おかしな手順がないか確かめる、というイメージです。
上のツールで▶ボタンを押すと、正の数・負の数の2つのテストを実行して、未実行だった命令が緑(実行済)に変わり、命令網羅100%に到達する流れを確認できます。
どれだけ命令を実行できたかは命令網羅率という割合で表します。計算はとても単純で、割り算1つで求められます。
命令網羅率 = 実行できた命令数 ÷ 全命令数 × 100
上のツールの例(命令が全部で3つ)で計算してみます。
・テスト1だけ:通った命令は2つ → 2 ÷ 3 × 100 ≒ 67%
・テスト2を追加:残り1つも通り3つ全部 → 3 ÷ 3 × 100 = 100%
目標は命令網羅率100%です。100%になっていないということは、一度も実行されていない命令(テストで通っていない処理)が残っているということなので、その部分を通すテストを足していきます。
ホワイトボックステストの網羅基準には、命令網羅のほかに分岐網羅(ブランチカバレッジ)があります。分岐網羅は、if文などの各分岐で「真」と「偽」の両方の経路を1回ずつ通したかを確認する、より厳しい基準です。
| 項目 | 命令網羅 | 分岐網羅 |
|---|---|---|
| 確認すること | 全命令を1回実行 | 全分岐の真・偽を実行 |
| 厳しさ | ゆるい | 厳しい(命令網羅を含む) |
| 必要なテスト数 | 少なくて済むことが多い | より多く必要 |
注意したいのは、命令網羅100%でも、分岐網羅100%とは限らないという点です。たとえば if 文で「偽」のとき何もしない(else が無い)場合、真の経路だけ通れば全命令を実行できますが、偽の経路を通っていなければ分岐網羅は未達です。だから分岐網羅のほうが厳しい基準なのです。
「テストをやった」だけでは不十分なことがあります。たとえば10行のプログラムがあっても、テストが特定の入力値だけだと、残り数行が一度も実行されないまま見落とされる可能性があります。その見落とし部分にバグ(誤り)が潜んでいても、テストで検出できません。
なぜ命令網羅が必要か。「全命令を最低1回通す」という基準を設けることで、「実行されていない命令がゼロ」という状態を目指します。実行されていない行はテストで確認できていない行なので、その部分を必ず通すようにテストを追加していきます。
身近な例で考えると、建物の点検に似ています。「点検した」と言っても、地下室だけ点検していなければ地下室の不具合を見逃します。「全部屋を最低1回点検する(命令網羅100%)」という基準を守ることで、見落としのない点検が保証されます。
命令網羅で「命令(ステートメント)」として数えるのは、実際に何か処理を行う行です。すべての行が対象というわけではありません。
命令として数える行の例は次のとおりです。
・代入:x = 10 のように値を変数に入れる行
・条件判定:if (score > 60) のような分岐を決める行
・関数呼び出し:print("結果") のように他の機能を呼ぶ行
逆に数えない行の例は次のとおりです。
・コメント行(// や /* */ で始まる説明文)
・空行・閉じ括弧だけの行(処理を何もしない行)
・変数の宣言だけの行(言語によっては命令に含む場合もある)
命令網羅率の計算では、この「命令として数える行」の合計数が分母になります。上のツールのコードブロックでは、命令と見なされた行に緑の縦バーがつき、網羅率の計算に反映される仕組みを確認できます。