よしたろうブログ

設計・人文知・歴史・哲学・漫画とかの話が好きです。

テストの網羅方法と分析(同値分析と境界値分析)

テストの網羅方法

テストの網羅率を上げるための基本的な考え方が以下の方法です。テスト対象のプログラムの中で到達可能なパスの全パターンを知る方法です。

網羅方法 内容 網羅率
(下にいくほど高い)
命令網羅 すべての命令を最低1回は実行 C0
判定条件網羅 判定文によるすべての分岐を最低一回は実行。条件は特に考慮しない C1
分岐条件網羅 判定文中のすべての条件を最低1回は実行 C2
判定条件&分岐条件網羅 分岐条件を決める際に判定結果を考慮する
複数条件網羅 判定文中のすべての条件のすべての組み合わせを最低1回は実行
経路組み合わせ網羅 すべての経路(パス)を最低1回は実行 特大

『命令網羅』 :C0

proc1(); 
    if ((A==B) or (C==D)) {
        proc2(); 
    } 
proc3();

命令網羅は、すべての命令を最低1回は実行する。(A==B)が真になるケースか、(C==D)が真になるケースかのいずれか1つを作れば、proc1()、proc2()、proc3() の3つの命令が実行されるため、命令網羅による網羅率は100%になる

『分岐網羅』 :C1

proc1(); 
    if ((A==B) or (C==D)) {
        proc2(); 
    } 
proc3();

分岐網羅は、判定文によるすべての分岐を最低一回は実行する。このプログラムでは、分岐(if文)は1つのため、2通りのテストケースを作れば、分岐網羅による網羅率が100%になる

2通りのテストケースとは

  • (A==B)が真、または(C==D)が真
  • (A==B)、 (C= = D) のいずれも偽

であり、if文の中の2番目の命令を実行するパターン、または実行しないパターンの2種類を行う。

『分岐条件網羅』 :C2

proc1(); 
    if ((A==B) or (C==D)) {
        proc2(); 
    } 
proc3();

分岐条件網羅は、判定文中のすべての条件を最低1回は実行する。このプログラムでは、 判定文の中に2つの関係演算があるため、 次の2通りのテストケースを作れば、分岐条件網羅による網羅率が100%になる。

  • (A==B)が真、かつ(C==D)が真
  • (A==B)が偽、かつ(C==D)が偽

または

  • (A==B)が真、かつ(C==D)が偽
  • (A==B)が偽、かつ(C==D)が真

『判定条件&分岐条件網羅』 網羅度:中

proc1(); 
    if ((A==B) or (C==D)) {
        proc2(); 
    } 
proc3();

判定条件&分岐条件網羅は、分岐条件を決める際に判定結果を考慮する。判定条件の真偽を満たし、 かつ判定分中の複数の条件すべてについて、その組み合わせを考慮すると、次の3通りのテストケースを作れば、判定条件&分岐条件網羅による網羅率が100%になる。

  • (A==B)が真、かつ(C==D)が偽
  • (A==B)が偽、かつ(C==D)が真
  • (A==B)が偽、かつ(C==D)が偽

『複数条件網羅』 網羅度:大

proc1(); 
    if ((A==B) or (C==D)) {
        proc2(); 
    } 
proc3();

複数条件網羅は、判定文中のすべての条件の、すべての組み合わせを、最低1回実行する。次の4通りのテストケースを作れば、複数条件網羅による網羅率が100%になる

  • (A==B)が真、かつ(C==D)が真
  • (A==B)が真、かつ(C==D)が偽
  • (A==B)が偽、かつ(C==D)が真
  • (A==B)が偽、かつ(C==D)が偽

『経路組み合わせ網羅』 網羅度:特大

proc1(); 
    if ((A==B) or (C==D)) {
        proc2(); 
    } 
proc3();

経路組み合わせ網羅は、すべての経路(パス)を最低1回は実行する。次の4通りのテストケースを作れば、経路組み合わせ網羅による網羅率が100%になる。

  • (A==B)が真、かつ(C==D)が真
  • (A==B)が真、かつ(C==D)が偽
  • (A==B)が偽、かつ(C==D)が真
  • (A==B)が偽、かつ(C==D)が偽

参考プログラムが単純なので、4通りのテストケースしかありませんが、複雑なプログラムであれば組み合わせ爆発が起き、テストケースが多くなります。とても現実的ではないテストケースになる場合も多々あるため、プログラムの特性に合わせ、網羅率をどこまで考慮すべきかという方針を定めた上でテストを行う必要があります。

同値分析と境界値分析

バグの出やすい箇所だけを効率的にテストする手法です。一般的に、バグは条件の境目付近に潜んでいる可能性が高くなります。「以下」「未満」を取り違える。「≧」「>」の記述ミスなどが起こりやすい場所だからです。そこで、境界値分析を行うことによって、バグが潜んでいるところを効率的にテストすることができます。 また、ソフトウェアでは入力値や条件によって処理方法が決まりますが、その値の数や組み合わ は膨大なものになってしまいます。そのため、すべての入力値・条件を1つずつテストすることはできません。このような場合に、境界値分析・同値クラス分割を用いることで、テストすべき条件や値を大幅に減らすことができます。

  • 境界値分析とは
    期待される出力結果に、変化が生じる境目を境界値と言い、 その境界値を分析してテストすること。

    • 境界値は不具合が発生しやすい部分です。 境界値分析を使用することにより、最小の工数で効率よく不具合を発見することが可能です。
  • 同値分析とは
    同じ出力結果となる入力値の集合を同値クラスと言い、その同値クラスを区分すること。 各同値クラスから代表する値を確認すれば、その同値クラス全体をテストしたことになる、という考え方です。これによりテスト工数を縮小できます。

以下の仕様を例に簡単に説明します。整数の他に平仮名・漢字・英字・記号・負の値など、全ての値をチェックしようとする全数テストでは、とんでもないケース数になります。

  • ポイント計算画面
    • ① 買物金額1〜999円では ポイント無し
    • ② 買物金額1000〜9999円では ポイントが3%
    • ③ 買物金額10000円以上では ポイントが5%
    • ④ すべて小数点以下は切り捨て
    • ⑤ 入力は文字列(最大7文字)
    • ⑥ 入力が0以下や数字以外の場合は 「エラー」と表示

同値分析

同じ動作になる入力値のグループ (=同値クラス)を作成して、 各グループごとに1つの代表値でテストします。

No 同値クラス 代表値
1 1〜999円(ポイント0) 500
2 1000〜9999円(ポイント3%) 5000
3 10000円以上(ポイント5%) 50000
4 0以下または数字以外(エラー) あああ

No1の1~999円の間では、期待される結果のポイントが全て0であるので、こ1~999の値は同じグループになり、それを同値クラスとします。同値クラス内の値は等価として扱えるため、テストする値は一つのみで十分であり、その値を代表値と呼びます。

この4ケースをテストすれば十分とするのが「同値分割」です。ただし、これは仕様によって変化します。期待される結果と入力値の関係によるため適切かどうかは都度検討が必要です。ここでは基本的な考え方として説明します。

境界値分析

同値クラスの境界値付近にはバグが集中します。この境界に属する値でテストを行うのが「境界値分析」です。境界値を間違えたり、判定条件を間違えやすいからです。ただし、これは数値などの様に順序付けが可能な値のみでクラスが構成されている場合のみに適用できる方法になります。

No 同値クラス 境界値
1 1〜999円(ポイント0) 1, 999
2 1000〜9999円(ポイント3%) 1000, 9999
3 10000円以上(ポイント5%) 100000, 9999999
4 0以下または数字以外(エラー) 0, -9999999, あああ

この9ケースをテストすれば 十分とするのが「境界値分析」