直交表を利用した組み合わせテスト http://www.ark-web.jp/sandbox/wiki/249.html
組み合わせテストに利用できる直交表というものがあります。
参考文献の直交表の解説を読んで理解したことを紹介します。
動画 †
http://www.screencast.com/t/rberXwakv3i
直交表とは? †
直交表は2次元の整数の配列表で、任意の2列を選択するとすべての数値の組み合わせがその2列で表されるというものです。
例えば、参考文献にも例示されている次の配列表をみてみます。
1 | 2 | 3 | 4 | |
1 | 1 | 1 | 1 | 1 |
2 | 1 | 2 | 2 | 2 |
3 | 1 | 3 | 3 | 3 |
4 | 2 | 1 | 2 | 3 |
5 | 2 | 2 | 3 | 1 |
6 | 2 | 3 | 1 | 2 |
7 | 3 | 1 | 3 | 2 |
8 | 3 | 2 | 1 | 3 |
9 | 3 | 3 | 2 | 1 |
この配列表は9行4列で値として1~3のどれかであることが見て取れます。
この配列表から任意の2列を選んでみてください。たとえば、列1と列3を選んで抜き出してみると、下表のようになります。
1 | 3 | |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 2 |
5 | 2 | 3 |
6 | 2 | 1 |
7 | 3 | 3 |
8 | 3 | 1 |
9 | 3 | 2 |
すると、各行を見ていくと、(1,1)、(1,2)、(1,3)、(2,2)、(2,3)、(2,1)、(3,3)、(3,1)、(3,2)と1~3の値から2個選択した場合の全ての組み合わせが表現されるのがわかると思います。これはどの任意の2列の組み合わせでもおきます(実際に試してみてください)。
こうした特徴を持つ配列表が直交表と呼ばれるものです。
直交表の何がうれしいのか? †
例で示した値が1~3で4列の全体の値の組み合わせを考えてみると(3,3,3,3)といった組み合わせも有効です。すると全体の組み合わせ数は 3 × 3 × 3 × 3 = 81通りになります。一方、例の直交表によると4列中の任意の2列間の組み合わせは9行 = 9通りで表現できます。
これはどういうことかというと、全体で81通りある内のわずか9通りのテストケースによって任意の2列間同士の組み合わせを100%網羅できるということです。
テストを行う多くの状況においては、作成して実行すべきテストケースの数がとにかく多すぎる。その中から「良い」サブセットを選択するには、どうしたらよいだろうか。その答えが直交表なのである。多数の変数があり、それらの各変数が定義されている状態を取るときにはいつでも、問題を直交表にマッピングすることができる。(体系的ソフトウェアテスト入門, Rick D.Craig, Stefan P.Jaskiel p132)
全ての組み合わせを律儀にテストしようとすると要素(列)と値の範囲が増えるにしたがって無限大にまでテストケースが増えていってしまいます。限られたリソースの中でこれを達成するのは著しく困難、または不可能です。そこで、直交表を利用することで、全体の組み合わせの中から特に重要なサブセットを抜き出していこう、ということです。
要注意なのは、直交表はあくまでサブセットであり、全組み合わせを網羅するものではないということです。例でいえば、81 - 9 = 72通りの組み合わせは考慮されないため、考慮されなかった組み合わせでバグが検出されるリスクはあります。しかし、任意の2列間での全組み合わせは9通りでカバーできる。これが直交表の強みです。
実例 †
次の状況を考えてみます。
種々のOS上で稼動する様々なWebサーバ上で稼動するオープンソースソフトウェアがある。そのオープンソースソフトウェアは複数のバージョンをサポートしている。そして、このシステムは様々なブラウザでアクセスされうる。
この状況で、Webブラウザ、オープンソースソフトウェアがサポートするバージョン、Webサーバ、OSが取りえる値を以下としてみます。
・Webブラウザ(IE6.0, FireFox2.0, Opera9.2) ・オープンソースソフトウェアがサポートするバージョン(1.0, 1.0b, 1.1) ・Webサーバ(IIS, Apache, lighttpd) ・OS(Windows Server, Linux, Solaris)
すると、これらの全組み合わせは 81通り(3 × 3 × 3 × 3)です。
81通り全てをテストできれば理想的ですが、経験上必要ないと思える組み合わせもあるでしょうし、何よりリソースが無いことが多いでしょう。そこで、この問題を例で示した直交表にマッピングしてみます。
なお、表では各列毎に
- Webブラウザ
- IE6.0 = 1, FireFox2.0 = 2, Opera9.2 = 3
- バージョン
- 1.0 = 1, 1.0b = 2, 1.1 = 3
- Webサーバ
- IIS = 1, Apache = 2, lighttpd = 3
- OS
- Windows Server = 1, Linux = 2, Solaris = 3
として値を対応させ配置しています。対応関係がわかりやすいように括弧内に元の値も入れています。
テストケースNo | Webブラウザ | バージョン | Webサーバ | OS |
1 | IE6.0(1) | 1.0(1) | IIS(1) | Windows Server(1) |
2 | IE6.0(1) | 1.0b(2) | Apache(2) | Linux(2) |
3 | IE6.0(1) | 1.1(3) | lighttpd(3) | Solaris(3) |
4 | FireFox2.0(2) | 1.0(1) | Apache(2) | Solaris(3) |
5 | FireFox2.0(2) | 1.0b(2) | lighttpd(3) | Windows Server(1) |
6 | FireFox2.0(2) | 1.1(3) | IIS(1) | Linux(2) |
7 | Opera9.2(3) | 1.0(1) | lighttpd(3) | Linux(2) |
8 | Opera9.2(3) | 1.0b(2) | IIS(1) | Solaris(3) |
9 | Opera9.2(3) | 1.1(3) | Apache(2) | Windows Server(1) |
では、テストケース1~9を実行することで何が達成されるのかを見てみます。
- 各バージョン、各Webサーバ、各OSを用いて、各Webブラウザがテストされている
- 各ブラウザ、各Webサーバ、各OSを用いて、各バージョンがテストされている
- 各ブラウザ、各バージョン、各OSを用いて、各Webサーバがテストされている
- 各ブラウザ、各バージョン、各Webサーバを用いて、各OSがテストされている
全ての要素の全ての値の組み合わせはテストされていませんが、固有の組み合わせはすべてテストされています。例えば、IE6.0は全バージョン、全Webサーバ、全OSとの組み合わせをテストされています。
参考文献によれば、「互換性に関する欠陥の殆どは組み合わせに基づく」とのことで、これも考え合わせると、組み合わせに関するテスト(互換性や環境、インタフェース接続など)において直交表はとても有用だと考えられると思います。
また、テストそのものの組み合わせ(対象モジュール、テストレベル(単体テスト、結合テスト、システムテスト))にも応用できると思うので、テスト計画においても利用可能だと思います。
課題 †
直交表の基礎は理解したと思うのですが、まだ
- 直交表の作り方
- 他のパターンの直交表
- 直交表の具体的利用例
- 直交表の欠点と代替手法(HAYST法なるものがあるらしい)
などについてわからないことだらけなので、勉強してお知らせしていきたいと思います。
参考文献 †
- 体系的ソフトウェアテスト入門 p132-134