デシジョンテーブルの圧縮でバグの見逃しが発生するとはどういうことか?
圧縮したデシジョンテーブルを使ってテストを行なうことの危険性については以前に説明しました。その時あげた例はあまり一般的ではなかったので、今回はより一般的に起きやすい例をあげてみることにします。今回取り上げる例はある博覧会の入場料を決定する仕様です。
ある博覧会の入場料を決定する仕様は次のように定められています。
1.平日以外は2000円
2.平日は1600円
3.18歳未満は1400円
4.優待券を持参している人は1800円
5.優待券を持参している18歳未満は1200円
6.複数の条件に一致する場合は安い料金を適用する
この博覧会の入場料を決定するデシジョンテーブルを作成することにします。
仕様から料金ごとのルールは次の通りとなります。
(1) 2000円
平日でなくかつ18歳以上でかつ優待券を持参していない。
(2) 1800円
平日でなくかつ18歳以上でかつ優待券を持参している。
(3) 1600円
平日でかつ18歳以上。
(4) 1400円
18歳未満でかつ優待券を持参していない。
(5) 1200円
18歳未満でかつ優待券を持参している。
このルールをもとにして直接次のデシジョンテーブルが作成できます。
これで圧縮したデシジョンテーブルと圧縮していないデシジョンテーブルの2つが得られました。
ここでこの仕様をソフトウェアとして実装する場合を考えてみましょう。この仕様の実装方法は1つとは限りません。少なくとも4種類はあります。ここではこの仕様の実装例として次の3つのフローチャートを示します。
これらのソフトウェアを表1の圧縮したデシジョンテーブルでテストすると、最初のソフトウェアではテスト漏れは起こりません。5つのルールでソフトウェアのすべてのルートを網羅しているからです。しかし、真ん中と最後のソフトウェアではテスト漏れが起きます。圧縮したデシジョンテーブルではルールが5つしかないのに、真ん中のソフトウェアでは6つ、最後のソフトウェアでは7つのルートがあり、網羅されないルートが出てくるからです。一方、圧縮していないデシジョンテーブルではどのソフトウェアでもテスト漏れは起きず、すべてのルートが網羅されます。
デシジョンテーブルを使ってテストを行なう場合、ブラックボックステストにおけるテスト対象のソフトウェアがどのように実装されているかを事前に把握することはできません。したがってデシジョンテーブルを圧縮してテストを行なうということは、常にテスト漏れの危険がつきまとうということを肝に銘じておく必要があります。
テスト技法を解説した書籍やネット上の解説では、そのほとんどがデシジョンテーブルを圧縮することが当然のように書かれています。デシジョンテーブルを圧縮することがいかに危険なことであるか。このことは強調してもしすぎるということはありません。
ごく一部の書籍やネット上の解説ですが、デシジョンテーブルの圧縮では「処理順が重要なので開発側との協力が必要」などと書かれているものがあります。おそらく言いたいのは「デシジョンテーブルを圧縮する場合は、テスト対象のソフトウェアのプログラム構造に合わせてテスト漏れが起きないような形で圧縮しなければならない」ということだろうと思われます。そもそもデシジョンテーブルテストはブラックボックスのテスト技法だったはずです。それなのにこれでは圧縮したデシジョンテーブルでのテストは制御パステストと同様なホワイトボックスのテスト技法ということになります。
ある博覧会の入場料を決定する仕様は次のように定められています。
1.平日以外は2000円
2.平日は1600円
3.18歳未満は1400円
4.優待券を持参している人は1800円
5.優待券を持参している18歳未満は1200円
6.複数の条件に一致する場合は安い料金を適用する
この博覧会の入場料を決定するデシジョンテーブルを作成することにします。
仕様から料金ごとのルールは次の通りとなります。
(1) 2000円
平日でなくかつ18歳以上でかつ優待券を持参していない。
(2) 1800円
平日でなくかつ18歳以上でかつ優待券を持参している。
(3) 1600円
平日でかつ18歳以上。
(4) 1400円
18歳未満でかつ優待券を持参していない。
(5) 1200円
18歳未満でかつ優待券を持参している。
このルールをもとにして直接次のデシジョンテーブルが作成できます。
これで圧縮したデシジョンテーブルと圧縮していないデシジョンテーブルの2つが得られました。
ここでこの仕様をソフトウェアとして実装する場合を考えてみましょう。この仕様の実装方法は1つとは限りません。少なくとも4種類はあります。ここではこの仕様の実装例として次の3つのフローチャートを示します。
これらのソフトウェアを表1の圧縮したデシジョンテーブルでテストすると、最初のソフトウェアではテスト漏れは起こりません。5つのルールでソフトウェアのすべてのルートを網羅しているからです。しかし、真ん中と最後のソフトウェアではテスト漏れが起きます。圧縮したデシジョンテーブルではルールが5つしかないのに、真ん中のソフトウェアでは6つ、最後のソフトウェアでは7つのルートがあり、網羅されないルートが出てくるからです。一方、圧縮していないデシジョンテーブルではどのソフトウェアでもテスト漏れは起きず、すべてのルートが網羅されます。
デシジョンテーブルを使ってテストを行なう場合、ブラックボックステストにおけるテスト対象のソフトウェアがどのように実装されているかを事前に把握することはできません。したがってデシジョンテーブルを圧縮してテストを行なうということは、常にテスト漏れの危険がつきまとうということを肝に銘じておく必要があります。
テスト技法を解説した書籍やネット上の解説では、そのほとんどがデシジョンテーブルを圧縮することが当然のように書かれています。デシジョンテーブルを圧縮することがいかに危険なことであるか。このことは強調してもしすぎるということはありません。
ごく一部の書籍やネット上の解説ですが、デシジョンテーブルの圧縮では「処理順が重要なので開発側との協力が必要」などと書かれているものがあります。おそらく言いたいのは「デシジョンテーブルを圧縮する場合は、テスト対象のソフトウェアのプログラム構造に合わせてテスト漏れが起きないような形で圧縮しなければならない」ということだろうと思われます。そもそもデシジョンテーブルテストはブラックボックスのテスト技法だったはずです。それなのにこれでは圧縮したデシジョンテーブルでのテストは制御パステストと同様なホワイトボックスのテスト技法ということになります。