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

旧ブログからゆっくり移行中です。http://blog.livedoor.jp/prjmng/

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をどうしたって判定が真になってしまい、判定が網羅できません。