直交表を利用した組み合わせテスト(2) http://www.ark-web.jp/sandbox/wiki/254.html
直交表を利用した組み合わせテストで課題としていた件に関して調査結果をまとめる。
そもそも直交表をつかったテストのポリシーとは? †
ソフトウェアテストは、簡単にいうと「お客様の要求が実現されているかを確認するプロセス」のことです。お客様の要求というと漠然としたものと思われがちですが、現実世界では、システムへのインプットに表れます。ここで、インプットに着目し、操作はいくつあり、その実施順番は何通りあり・・・・・・・と考え出すと、とたんにテスト項目は無限大になり発散してしまいます。そうではなく、お客様の要求、平易な言葉で言い直せば「したいこと=結果」に着目して、そこからテスト項目を作成していくようにするのです。(...)このようにして「結果」に着目してそこからテスト設計を行うとテスト項目数を大幅に減らすことができるのですが、その一方で、まったく予期していない使われ方をした場合の問題に対しては「結果」の想定ができていないためにテスト漏れが発生することになります。そこで、これらのテスト手法に加えて、全体を網羅的にカバーする組み合わせテストが必要になってきます。(文中の省略は筆者による)
つまり、直交表による組み合わせテストは
- 結果に注目したテスト手法(ブラックボックステストの原因結果グラフ法やCFD(Case Flow Diagram)法)によってテスト項目数を減らしているという状況の上で
- 想定していない「結果」に対する漏れを防ぐための組み合わせテストに利用する手法
という位置づけのようです。
直交表を使った組み合わせテストの方針 †
ソフトウェア・テスト PRESS Vol.2 によると、
Webサーバ、Webブラウザにおいては、3機能(≒因子)以上の組み合わせで25~30%のバグが見つかっている(4機能以上の組み合わせで発生するバグは5~9%)。MozilaやApacheの開発においては多人数がバラバラに開発したものをインテグレートしているため組み合わせに対する統一した仕様が不足しているのかもしれません。
とのことで、Webアプリケーションもこれがあてはまるかもしれない。ので、3機能間での組み合わせテストをする必要がアプリケーションによってはある。しかし、3機能間すべての組み合わせテストを行う方針にすると、直交表でテストする場合の数十倍のテスト項目が必要になる。
そこで、
- 直交表で2機能間の問題をまずおさえる
- 3機能間以上の問題は、仕様書に明記されている箇所、開発者へのヒアリングやバグリストから検出した怪しい箇所、リスクの高い箇所などに絞って局所的に実行
というのが効率的だそう。
直交表によるテスト設計の流れ †
- 因子・水準の決定
- 因子の選び方
- 水準の選び方
- 直交表の作成
- 直交表サイズの決定と選択
- 選択した直交表の多水準直交表への変形
- 因子・水準の割り付け
- 禁則の回避
- 完成した直交表のチェック
因子・水準の決定 †
因子・水準の決定はテスト品質を決める重要なフェーズ。最も神経を集中して、知恵を集める必要がある。
因子・水準とは? †
因子とはテスト対象となるパラメータ、要素のこと。
水準とは因子に許可される値の数のことで、例えば、性別であれば男、女の2種の値なので2水準。じゃんけんであればグー、チョキ、パーの3種の値なので3水準となる。
因子の選び方 †
一般に直交表においては、因子が増えても、増えるテスト項目数は「その因子が持っている水準の数程度」となる。
テスト総数 = 因子Aの水準数 + 因子Bの水準数 + 因子Cの水準数 + ・・・
因子を絞り込めばテスト数はさらに少なくてすむけど・・・?
- バグを持った因子がテスト対象から漏れていれば、テストされずにバグが逃れてしまう
- 【因子の選択は絞り込むのではなく、なるべく多くの関連因子を洗い出す方向で考えるべき】
テスト対象の機能のみに着目せず、次のことも因子に検討する。
- 機能利用者についての因子(一般ユーザ、熟練ユーザ、管理者、開発者)
- タイミング(実行直後、実行後3分間放置してから)
- 負荷条件(単一接続、10ユーザ、100ユーザ)
水準の選び方 †
次の手順で選ぶ
- 全部の水準をリストアップする
- リストアップした水準を同値分割、境界値分析を使ってグルーピングする
重要な注意事項
- 全部の水準をリストアップすることが重要
- 水準には異常値は決していれないようにする。異常値を入れるとそのテスト項目が必ずNGになって、他の水準間の組み合わせテストの結果を得ることができないため
異常値のテストは
- まず異常値がシステムに入り込まない設計や操作性にすること
- 入力チェックが行われ、異常値が入力された場合はalertを表示するなど適切な動きが組み込まれていること
の2点の確認が必要。これが満たされていれば、【異常値を入れた場合の正しい状態】が定義できるので、直交表に組み込み可能。
直交表の作成 †
直交表の種類 †
直交表には2水準系、3水準系、混合系などがあり、それぞれに代表的なものがある。
※ 直交表には全部で26種類しかないらしい(作れそうだけど・・??)
Ln(n=自然数)はn行からなる直交表を意味します。
代表的な直交表の種類は
- 2水準系
L4、L8、L16、L32、L64、L128
- 3水準系
L9、L27
- 混合系
L18
参考:参考:統計に関するミニ知識所初級編
L4、L8、L16、L32、L64、L128、L256といった2の倍数で直交表の列数が増えていくのが2水準系直交表、L9、L27、L81、L243のように3の倍数で増えていくのが3水準系直交表、これらを組み合わせて作ったL18、L36といった直交表を混合系直交表という。
直交表サイズの決定と選択 †
ソフトウェアテストでは通常2水準系を利用する。理由は
- 2水準の因子を多く持っていてOn/Offを表現しやすい
- 4水準以上の因子も持っている
- 多水準直交表への変形が可能
サイズの決定はテストしたい機能が保有する因子・水準の数から決定する。
サイズの見積もり方法には
- 2因子間網羅率度100%からの見積もり
- 自由度からの見積もり
の2種がある。
- 2因子間網羅率度100%からの見積もり
- 保有する水準数が一番大きな因子と次に大きな因子の水準数を掛け合わせる。もし、水準が2のべき乗でない場合は、2のべき乗に繰り上げて計算する。例えば、用紙サイズ(6種類)、用紙方向(2)、両面(2)、拡大縮小(4)、カラーモード(3)なら8(6)×4=32個のテストが必要ということになる。あまりに大きな水準を持つ因子がある場合にこの見積もりを使うと巨大な直交表が選択されてしまう。その場合は抽象化によって因子の水準を小さくする(抽象化については後述)。
- 自由度からの見積もり
- 突出した大きな因子がなく、2~3水準しかない場合に使う(この場合、どんなに因子が増えてもサイズが変わらないことになるから)。
因子Aの自由度=因子Aの水準数 - 1
で、この場合、直交表のサイズは自由度の総和 + 1 = Σ(各因子の水準数 - 1) + 1
になる。2因子間網羅率100%の例で考えると、(6-1) + (2-1) + (2-1) + (4-1) + (3-1) + 1 = 5 + 1 + 1 + 3 + 2 + 1 = 13
ここから2水準系直交表で最も近いL16を選択する。
例のように、二つの見積もり方法は違う結果を出すことがある。多くの場合、2因子間100%からの見積もり>自由度からの見積もりという関係になる。
選択した直交表の多水準直交表への変形 †
2水準系直交表のままでは2つの値(2水準)の因子しか割り付けられないので、多水準が入る列を持つ直交表(多水準直交表)に変形する。
変形は以下の手順で行う。
- 必要な水準数を調べる
- 必要な水準数の自由度を算出する
- 自由度数分の列を合体させる
例えば、4水準が欲しい場合、4水準の自由度は 4 - 1 = 3なので、3列を合体させることで実現できる。L8直交表でやってみると次のようになる。
L8直交表 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
3 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
4 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
5 | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
6 | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
7 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
8 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
↓
変形後L8直交表 | 123 | 4 | 5 | 6 | 7 |
1 | 000 | 0 | 0 | 0 | 0 |
2 | 000 | 1 | 1 | 1 | 1 |
3 | 011 | 0 | 0 | 1 | 1 |
4 | 011 | 1 | 1 | 0 | 0 |
5 | 101 | 0 | 1 | 0 | 1 |
6 | 101 | 1 | 0 | 1 | 0 |
7 | 110 | 0 | 1 | 1 | 0 |
8 | 110 | 1 | 0 | 0 | 1 |
1~3列を合体させた列が(000,011,101,110)の4水準になる。
また、
- 水準「000」に対して4~7列それぞれの0/1の組み合わせが存在していること
- 他の水準「011」、「101」、「110」に関しても上記は成り立っていること
がわかる。つまり、2因子間網羅度が100%になっている。
ただし、各直交表毎に合体させられる列は決まっている。
次回の内容(予定) †
- 多水準直交表への変形において合体可能な列の特定方法
- 因子・水準の割り付け
- 禁則の回避