ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

Coverageに関する言葉の整理

 コードカバレッジ(code coverage)は、ホワイトボックステストの尺度の1つ。プログラムのソースコードが、どの程度の網羅率でテストされたかを示します。その「網羅」のレベルにもいろいろあって、かつ名前もややこしい・・・。ので、簡単に整理してみました。

 まず、次のようなプログラムを考えてみます。
 たとえば「数値」として16を与えて実行すると、「16 は6の倍数ではない。」というメッセージが表示されます。

Sub カバレッジの確認(数値 As Integer)  
  If 数値 Mod 2 Or 数値 Mod 3 Then '←判定  
    MsgBox 数値 & " は6の倍数ではない。" '←命令  
  End If  
End Sub

 「カバレッジの確認」では、まず判定があります。この判定は「数値 Mod 2」(=数値を2で割った余り)か「数値 Mod 3」(=数値を3で割った余り)のどちらかが0(偽)にならない、つまり「2か3かどちらか(あるいは両方)で割り切れないか」という判定をしています。
 割り切れない(=条件を満たす)場合はメッセージを表示しますが、割り切れる(=条件を満たさない)場合は何もせずIF文から抜けます。・・・この例こそややこしいな!

 さて、2つの条件のORをとっての判定であるから、それぞれの条件が真か偽かによって、4種類のパターンが考えられます。

A. 数値 mod 2:真、数値 mod 3:真 (たとえば 数値=5)
  → 判定:真、命令:実行される
B. 数値 mod 2:真、数値 mod 3:偽 (たとえば 数値=3)
  → 判定:真、命令:実行される
C. 数値 mod 2:偽、数値 mod 3:真 (たとえば 数値=2)
  → 判定:真、命令:実行される
D. 数値 mod 2:偽、数値 mod 3:偽 (たとえば 数値=6)
  → 判定:偽、命令:実行されず

 それでは、網羅性のレベルを見てみましょう。

(1) 命令網羅(Statement Coverage、C0)

 プログラム上のすべての命令を、1回以上実行するようなテスト。「真偽のパターン」でいうと、(A)か(B)か(C)のどれか1つを行えばよい。たとえば、数値=5とすれば、命令は実行されます。

(2) 判定網羅(Decision Coverage、C1)、分岐網羅(Branch Coverage)

 プログラム上のすべての判定結果が、真と偽をそれぞれ1回以上カバーするテスト。「真偽のパターン」でいうと「判定」が、真の場合を1回、偽の場合を1回行えばよいので、(A)か(B)か(C)のどれか1つに加えて、(D)を行えばよい。
 判定の中のそれぞれの条件は考慮しないので、たとえば(C)と(D)でテストしても、「数値 mod 2」が真になるケースが漏れます。

(3) 条件網羅(Condition Coverage)

 プログラム上のすべての条件が、真と偽をそれぞれ1回以上カバーするテスト。分岐の真偽ではなく、分岐を形成する各条件が真/偽になります。「真偽のパターン」でいうと、(B)と(C)をテストしておけば、条件「数値 mod 2」も条件「数値 mod 3」も、それぞれ1度ずつ真にも偽にもある。(A)と(D)でもよい。それぞれの条件は、真と偽の2値なので、テストケースは最大2つで済んでしまうことになります。
 分岐網羅とは逆に、分岐の結果は考慮しません。たとえば(B)と(C)でテストすると、メッセージ出力の命令が実行されない!

(4) 条件判定網羅(Condition Decision Coverage、C2)、分岐条件網羅

 条件の真偽も、判定の真偽もともに網羅したもの。条件網羅をストレート、判定網羅をフラッシュとすると、ストレートフラッシュにあたるのがこの基準。「真偽のパターン」でいうと、(A)(B)(C)(D)すべてを行う必要があります*1

 世の中の参考書には、例となるフローチャートやプログラムで、分岐の中の条件が1つしかなかったりする。すると、判定網羅も条件網羅も条件判定網羅も同じテストケースになってしまうため、わかりづらいのではないかと思います。

 コードカバレッジについては、以下であらためて整理しています。

www.kzsuzuki.com www.kzsuzuki.com

*1:(2011/8/14追記)「プログラム上のすべての条件で、真と偽のすべての組み合わせをカバーするようなテスト」と書いていましたが、それだと条件網羅と同じになってしまいますね。if x = 1 or 1 =1 なんてのがあったら、xをどうしたって判定が真になってしまい、判定が網羅できません。