c0,c1,c2カバレッジってなんだっけな話
はじめに
c0,c1カバレッジと状態遷移図のnスイッチの話が自分の中でごっちゃになってたので調べて自分の中で整理する話です。
※状態遷移図テストとnスイッチの話もしようと思ったが、長くなりそうなので今回はc0,c1カバレッジを
教えてwiki先生!!
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)
また静的解析でのカバレッジについては若干ニュアンスが違うので注意されたし。
感想
プログラム的には体積の表示は最初のエラーが出た時点で計算ができないから表示させたくなかったのだけれど、意図的に変な書き方になっています。
テストデータに文字列とかを入れると結果がエラー内容が変わって来ちゃったりするのですがいろいろややこしくなるので今回は簡素にこんな形にしました。
理解はしていたつもりだったけど実際に書いて確かめるって大事だと改めて思いました。