【わかりやすい】ホワイトボックステストの具体例をC言語で【5手法網羅】

システム開発
スポンサーリンク
 

・’ホワイトボックステストとは’ はざっくりわかったから、具体例を見たい

・具体例だから、プログラム言語でちゃんと例示して欲しい

 

今回の記事では、上記のような要望を叶えるため、応用情報技術者の筆者が丁寧に解説させて頂きます。

 

ホワイトボックステスト概要

具体例を確認する前に、ホワイトボックステストについて一応確認しておきましょう。

ホワイトボックステストとは、「プログラムの内部仕様に着目し、誤りを検出するテスト方法」です。命令や分岐が正しく動作するかにのみ焦点をおいているため、仕様を誤解して作成した場合にもテストをクリアします。

これと対称的に、入力データと出力結果のみに着目し、内部構造を考慮しない、ブラックボックステストというものがあります。

 

ホワイトボックステストに関する用語

ホワイトボックステストを解説する上で、重要な単語を先に見ておきましょう。

 

命令

例えば、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 || puts("ok");  //  何も表示されない。(左式の1の時点で、全体の式は真のため右式を短絡)
  0 || puts("ok");  //  okと表示されない。
というように、|| や && などの論理演算子式において、不要な式評価を省くこと
つまり、テストケース3の条件2は通過できていません。
 
よって、正しくは

 

テストケース 条件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    
            真

これで、全ての条件の組み合わせ。つまり、「判定条件の全ての可能な結果を網羅」できていますね!

 

まとめ

テストというのは、なかなかややこしいですね💦 また、短絡評価にはご注意ください。

お疲れ様でした。

コメント

タイトルとURLをコピーしました