c0,c1,c2カバレッジってなんだっけな話

はじめに

c0,c1カバレッジと状態遷移図のnスイッチの話が自分の中でごっちゃになってたので調べて自分の中で整理する話です。
※状態遷移図テストとnスイッチの話もしようと思ったが、長くなりそうなので今回はc0,c1カバレッジ

教えてwiki先生!!

Wikipediaがいろいろ書いててとてもわかり易かった。

ソフトウェアテスト - Wikipedia

なるほど、c0とかのカバレッジはホワイトボックスの手法なんだなと分かった。

  • 命令網羅 (statement coverage) (C0)
  • 分岐網羅 (branch coverage) (C1)
  • 条件網羅 (condition coverage) (C2)

自分の中で理解する

というわけでサンプルプログラムを書いてみた。

雑に書いたサンプルプログラム (Javascriptで引数は数値なイメージです。)

追記】 二個目の分岐の中でx,yを使用していたため、後述するテストケースでは網羅できなくなるため修正しました。

function outputTriangle(x, y, z){
  // 最初の分岐
  if(x>0 && y>0){
    var area = x * y / 2;
    console.log("底面積は" + area);
  }else{
    console.log("おやおやなにかおかしいぞ");
  }
  // 二個目の分岐
  if(z>0){
    console.log("体積は高さ" + z + "を掛けて3で割る!");
  }
}

命令網羅 (statement coverage) (C0)

「命令網羅基準を用いてテストを行う場合は、すべての命令を実行すればよい。」とのこと。(by wiki)
テストケースは下記になりそう。

  • x=2,y=3,z=4(面積、体積の表示)
  • x=0,y=0,z=0(例外)

分岐網羅 (branch coverage) (C1)

「分岐網羅基準を用いてテストを行う場合は、すべての分岐において、すべての分岐の方向を実行すればよい。」とのこと。
なるほどわからんな状態なので改めて整理する

最初の分岐 2個めの分岐 テストデータ例
true true x=2,y=3,z=4
true false x=2,y=3,z=0
false true x=2,y=0,z=4
false false x=2,y=0,z=0

こんな感じか。分岐を意識するんだな!

条件網羅 (condition coverage) (C2)

「条件網羅基準を用いてテストを行う場合は、各々の個別条件について、全ての可能な結果を少なくとも1回はとるように実行すればよい。」
ということで表に落としてみる。

No x>0 y>0 z>0 テストデータ
1 true true true x=2,y=3,z=4
2 true true false x=2,y=3,z=0
3 true false true x=2,y=0,z=4
4 true false false x=2,y=0,z=-1
5 false true true x=0,y=3,z=4
6 false true false x=-1,y=3,z=-4
7 false false true x=-2,y=-3,z=4
8 false false false x=-3,y=-2,z=-4

補足

なお、判定結果に影響を与えない真理値に関しては省略しても良い。と書いてあったのでこちらを考慮するとこんな感じでしょうか。

短絡評価
No x>0 y>0 z>0 テストデータ 結果1 結果2
1 true true true x=2,y=3,z=4 面積表示 高さを表示
2 true true false x=2,y=3,z=0 面積表示 表示されない
3 true false true x=2,y=0,z=4 メッセージ 高さを表示
4 true false false x=2,y=0,z=-1 メッセージ 表示されない
5 false true true x=0,y=3,z=4 メッセージ 高さを表示
6 false true false x=-1,y=3,z=-4 メッセージ 表示されない
7 false false true x=-2,y=-3,z=4 メッセージ 高さを表示
8 false false false x=-3,y=-2,z=-4 メッセージ 表示されない

x>0が満たされない時点でyの値は判定結果に影響を与えないので省略できる。 なので5,7と6,8は同じテストケースと判断する事ができそうなので省略する。

短絡評価後
No x>0 y>0 z>0 テストデータ 結果1 結果2
1 true true true x=2,y=3,z=4 面積表示 高さを表示
2 true true false x=2,y=3,z=0 面積表示 表示されない
3 true false true x=2,y=0,z=4 メッセージ 高さを表示
4 true false false x=2,y=0,z=-1 メッセージ 表示されない
5 false (true) true x=0,y=3,z=4 メッセージ 高さを表示
8 false (false) false x=-3,y=-2,z=-4 メッセージ 表示されない

5,6でもいいはずなんだけど個人的にこっちの方がいい気がするので5,8とした。
もっと言うと、3,4と5,8は結果が同じなので更に削ることが可能だよね!(今回はここまで)

こんな感じか。分岐の条件を意識するんだな!

その他のカバレッジ

その他にはこんなのものある様子。

  • 判定条件/条件網羅 (decision/condition coverage)
  • 複合条件網羅 (multiple condition coverage)
  • 経路網羅 (path coverage)

また静的解析でのカバレッジについては若干ニュアンスが違うので注意されたし。

コード網羅率 - Wikipedia

感想

プログラム的には体積の表示は最初のエラーが出た時点で計算ができないから表示させたくなかったのだけれど、意図的に変な書き方になっています。
テストデータに文字列とかを入れると結果がエラー内容が変わって来ちゃったりするのですがいろいろややこしくなるので今回は簡素にこんな形にしました。 理解はしていたつもりだったけど実際に書いて確かめるって大事だと改めて思いました。