
・’ホワイトボックステストとは’ はざっくりわかったから、具体例を見たい
・具体例だから、プログラム言語でちゃんと例示して欲しい
今回の記事では、上記のような要望を叶えるため、応用情報技術者の筆者が丁寧に解説させて頂きます。
ホワイトボックステスト概要
具体例を確認する前に、ホワイトボックステストについて一応確認しておきましょう。
ホワイトボックステストとは、「プログラムの内部仕様に着目し、誤りを検出するテスト方法」です。命令や分岐が正しく動作するかにのみ焦点をおいているため、仕様を誤解して作成した場合にもテストをクリアします。
これと対称的に、入力データと出力結果のみに着目し、内部構造を考慮しない、ブラックボックステストというものがあります。
ホワイトボックステストに関する用語
ホワイトボックステストを解説する上で、重要な単語を先に見ておきましょう。
命令
例えば、if ( x > 0 && y < 0 ) x = 2; という文があれば、
- if ( x > 0 && y < 0 ) , x = 2; の2文を 命令
と呼びます。
条件 と 判定条件
例えば、if ( x > 0 && y < 0 ) という文があれば、
- x > 0 , y < 0 をそれぞれ 条件
- if ( x > 0 && y < 0 ) を 判定条件
と呼びます。
ホワイトボックステストの種類
ホワイトボックステストには、網羅性のレベルによって、以下5種類の基準が存在します。下の条件ほど、網羅率の高い基準になっています。
命令網羅 | 全ての命令を少なくとも1回は実行すればよい |
判定条件網羅 (分岐網羅) | それぞれの判定条件で「真の場合」「偽の場合」を1回ずつ実行すればよい |
条件網羅 | 判定条件で、それぞれの条件が「真の場合」「偽の場合」を組み合わせた全パターンを実行すればよい |
判定条件/条件網羅 | 判定条件網羅と分岐網羅、2つの条件を満たす |
複数条件網羅 | 判定条件の全ての可能な結果を網羅、かつ、全命令を1回は実行 |
では、ホワイトボックステストの基本を理解したところで、具体例を見ていきましょう。
ホワイトボックステストの具体例
先ほど紹介したホワイトボックステストの種類ごとに、具体例を提示していきます。
今回の例では、以下のC言語プログラムでテストしていきます。また、➀~➃は命令文番号を表しています。
void
main(){
int
a;
/*➀*/
scanf
(
"%d"
,&a); /*➁*/
if
(a%2 == 1 || a < 0){ /*➂*/
printf
(
"入力値は奇数か負数です。¥n"
); /*➃*/
}
}
命令網羅の例
命令網羅では、”全ての命令を少なくとも1回は実行すればよい” ので、➀~➃の命令をとりあえず全部実行できればクリア。つまり、以下の1パターンのみでOKです。
テストケース | 条件1 ( a%2 == 1 ) | 条件2 ( a < 0 ) | 判定条件 ( if(a%2 == 1 || a < 0) ) |
1 | 真 | 真 | 真 |
これで、➀~➃すべての命令が実行されますね。もちろん、条件1 のみが真のケース等でも構いません。
判定条件網羅の例
判定条件網羅では、”それぞれの判定条件で「真の場合」「偽の場合」を1回ずつ実行すればよい” ので、
テストケース | 条件1 ( a%2 == 1 ) | 条件2 ( a < 0 ) | 判定条件 ( if(a%2 == 1 || a < 0) ) |
1 | 真 | 真 | 真 |
2 | 偽 | 偽 | 偽 |
これで、すべての判定条件で「真の場合」「偽の場合」を1回ずつ実行できていますよね。
条件網羅の例
条件網羅では、”それぞれの条件で「真の場合」「偽の場合」を1回ずつ実行すればよい” ので、
テストケース | 条件1 ( a%2 == 1 ) | 条件2 ( a < 0 ) | 判定条件 ( if(a%2 == 1 || a < 0) ) |
3 | 真 | 偽 | 真 |
4 | 偽 | 真 | 真 |
これで、2つの条件で、「真の場合」「偽の場合」を1回ずつ実行できていますね。
と思うと思いますが、実はできていません。なぜなら、実際の言語では短絡評価が行われているためです。
テストケース | 条件1 ( a%2 == 1 ) | 条件2 ( a < 0 ) | 判定条件 ( if(a%2 == 1 || a < 0) ) |
3 | 真 | 偽 | 真 |
4 | 偽 | 真 | 真 |
2 | 偽 | 偽 | 偽 |
となります。ご注意ください。
判定条件網羅の例
判定条件/条件網羅では、”それぞれの判定条件で「真の場合」「偽の場合」を1回ずつ実行、かつ、”それぞれの条件で「真の場合」「偽の場合」を1回ずつ実行すればよい” ので、
テストケース | 条件1 ( a%2 == 1 ) | 条件2 ( a < 0 ) | 判定条件 ( if(a%2 == 1 || a < 0) ) |
3 | 真 | 偽 | 真 |
4 | 偽 | 真 | 真 |
2 | 偽 | 偽 | 偽 |
先ほどの、条件判定網羅と同じテストケースでクリアできますね!
複数条件網羅の例
複数条件網羅では、判定条件の全ての可能な結果を網羅、かつ、全命令を1回は実行すればよい” 。ここで、「判定条件の全ての可能な結果を網羅」というのは、今回なら、「2条件の組み合わせを全て網羅しなければならない」という意味です。よって、下記の表のようになります。
テストケース | 条件1 ( a%2 == 1 ) | 条件2 ( a < 0 ) | 判定条件 ( if(a%2 == 1 || a < 0) ) |
3 | 真 | 偽 | 真 |
4 | 偽 | 真 | 真 |
2 | 偽 | 偽 | 偽 |
1 | 真 | 真 | 真 |
これで、全ての条件の組み合わせ。つまり、「判定条件の全ての可能な結果を網羅」できていますね!
まとめ
テストというのは、なかなかややこしいですね💦 また、短絡評価にはご注意ください。
お疲れ様でした。
コメント