NISTによる組み合わせテストに関する包括的な文書
米国立標準技術研究所(National Institute of Standards and Technology, NIST)は、民間と政府機関の共同で標準化された規格の開発と評価に直接関与している組織です。NISTが公開している文書に Combinatorial and pairwise testing tutorial があります。
この文書のエグゼクティブ・サマリーには次のように書かれています。
2003年にNISTは、ソフトウェア開発予算の50%から80%をテストが占めており、年間595億ドルのコストがかかっていると推定した広く引用されている報告書を公表しました。すべての可能な入力および実行パスをテストするには、多くの人数と長い時間を要するため莫大な費用がかかり、現実的には不可能です。重要度がそれほど高くないソフトウェアでは、予算の制約から実施できるテストの量が制限され、しばしばシステム障害やセキュリティ上の弱点につながるリスクを増加させています。
組み合わせテストは、コストを削減し、多くのアプリケーションにおいてテストの効率を高めることができる方法です。このテスト方式の鍵となる重要な洞察は、すべての障害がすべてのパラメータによるものではなく、ほとんどの障害は比較的少数のパラメータ間の相互作用によって引き起こされるということです。NISTなどが集めた経験的なデータでは、相互作用している(6またはより少ない)少数の変数が引き金となってソフトウェア障害が起きることを示唆しています。このことはパラメータの組み合わせテストが非常に効果的な障害検出を提供するかもしれないことを示唆するため、この発見はテストにとって重要な意味合いを持ちます。Pairwise(2-wayの組み合わせ)テストは、低コストで効率的に良い結果を得ることができるためにしばしば用いられますが、システムバグの10%~40%以上を見逃してしまうことがあり、そのためミッションクリティカルなソフトウェアのためには十分ではありません。2-wayを超える組み合わせテストは、主に4-wayから6-wayのようなより高いレベルの相互作用に適したアルゴリズムの不足のために制限されています。しかし、新しいアルゴリズムはPairwiseを超える組み合わせテストを工業用途向けに実用化しました。
この文書では、組み合わせテストを現実世界のソフトウェアに使用することについての自己完結的なチュートリアルを提供します。それは重要な概念および方法を導入し、組み合わせテストのテストケースを生成する(NISTウェブサイトcsrc.nist.gov/ACTSに関して自由に入手可能な)ソフトウェアツールの使用を説明し、テスト入力の各セットごとに期待される結果を決定するために、ソフトウェアの形式モデルを使用するような先進的な話題について議論します。各トピックには、コストおよび実際的な考慮についてのセクションがあり、資源や資金調達に影響を与えるかもしれないトレードオフと制限事項について説明します。資料は、コンピュータ科学や工学の学生にアクセス可能であり、各トピックをより深く考察した論文への参照の広範囲なセットが含まれています。
このサマリにあるように、この文書ではさまざまな組み合わせテストのトピックに、NISTが開発した組み合わせテストツールであるACTSを適用しています。ACTSは無償で公開されており、希望する人は誰でも自由に使用することができます。ACTSについては、別に改めて取り上げることにします。
この文書の主な内容は次の通りです。
1. はじめに
2. 組み合わせテスト技法
3. 構成テスト
4. 入力パラメータテスト
5. シーケンスカバレッジ配列
6. 組み合わせカバレッジの測定
7. 組み合わせテストとランダムテスト
8. アサーションベースドテストオラクル
9. モデルベースドテストオラクル
10. 障害の原因特定
この文書のユニークな点のひとつに、各章でそれぞれの手法を導入する場合のコストと実践する場合の注意事項が明記されている点です。型通りの説明に終わるのではなく、実際に導入しようとした場合の問題点について考察されており、参考になるでしょう。
各章にある「まとめ」の概要は次の通りです。
組み合わせテスト技法
経験的データはソフトウェアの障害が比較的少数のパラメータの相互作用によって引き起こされていることを示唆しており、通常ひとつのパラメータまたはふたつのパラメータのペアが障害の原因ではあるが、割合は少ないが3-way、4-wayおよびより高次の相互作用によって引き起こされる障害もあります。適切な相互作用の強さ(2から通常は6まで)を持ったテストを行なうことで高度な保証を得ることができます。必要とされる t-way のテストケース数は、vt log n に比例し、v は値の数、n はパラメータの数です。組み合わせテスト技法は、構成または入力パラメータに適用され、その両方を含む場合もあります。また各テストケースごとに異なる結果となる場合に、期待する結果(テストオラクル)を決定する方法が重要です。
構成テスト
構成テストは最も一般的な組み合わせテストであり、5つ以上の設定可能な属性がある場合は、効率的な組み合わせテストが可能であり、構成テストでは設定可能な属性は通常少数な値であるので組み合わせテストにとっては理想的です。また制約を考慮したテストケース生成が重要です。
入力パラメータテスト
リソースによっては最高で 5-way または 6-way の組み合わせテストを行なうことが可能であり、同時に同値分割による適切な抽象化を行なう必要があります。カバレッジの完全さはアプリケーションのリソースとクリティカルさに依存します。
シーケンスカバレッジ配列
何種類かのイベントの発生順序に依存する障害の問題を扱っています。シーケンスカバレッジ配列は、相互運用性テストでの問題を解決するためにNISTによって開発された組み合わせ手法の新しいアプリケーションであり、イベントのすべての t-way の発生シーケンスを確認する一連のテストです。t 個のイベントのすべての発生順序の組み合わせがテストされます。
このテストにおいても制約の問題は重要であり、NISTが開発したツールでは制約を指定することができます。
組み合わせカバレッジ
組み合わせテストにおいては選択された t のレベルで100%になりますが、t+1 あるいは t+2 のカバレッジを測定したいと思うかもしれませんが、これを測定することで、異なるアルゴリズムによって生成された t-way を網羅する配列を選択するのに役立てることができます。
多くのケースではテストセットのカバレッジを高めるために追加のテストケースを生成することが可能かもしれません。
組み合わせテストとランダムテスト
既存の研究において、ランダムテストと組み合わせテストとで障害検出効果に違いがあることは示されていません。高度に最適化されたt-way網羅配列は同等サイズのランダムテストよりもt+1、t+2そしてより高い相互作用のテストを含みます。組み合わせテストがランダムテストより一様によいことを報告された分析が示さない一方で、2つのテスト・アプローチを適用するコストが同じである場合、組み合わせテストを選択することを支持します。
多重障害を検出する可能性は、単独障害を検出する可能性が c = パーセントであるとき、独立した障害の数を m とすると、mc となり、急激に減少します。
アサーションベースドテストオラクル
アサーションは、オラクル(期待する結果)の問題に対処するために使用する最も簡単かつ効果的なアプローチの一つです。アサーションとは、プログラムの前提として満たされるべき条件を記述し、実行時にそれが満たされていない場合にエラーや例外を発生させたり、メッセージを表示して処理を中断したりする機能です。
十分に強力なアサーションが埋め込まれている場合、コードはセルフチェックの性質を持つことになります。セルフチェックコードで、自動化による何千ものテストによってより多くの障害が検出される可能性を向上させ、ほとんどの場合に低コストで実行することができます。
モデルベースドテストオラクル
オラクルの問題はいかなるテスト方法論においても解決されなければななりません。多数のテストケースが生成される徹底的なテストにとっては特に重要です。テスト入力ごとに期待される結果を決定するひとつのアプローチは、シミュレートすることができるか、入力ごとに出力を分析することができるモデルを使うことです。モデル検査は、モデルのために指定された特性が満足されない場合、反例を生成することができるためオラクル問題を解決することができます。
この章で報告した方法は、コスト効果の高い方法であり、各テストの期待する結果と、完全な組合せのテストスイートを生成するために使用することができます。
障害の原因特定
ソース・コードが利用可能な場合、失敗の原因を確認する、最良の方法は従来のデバッグ技術を使用することです。純粋なブラックボックステストで、ソース・コードを参照できない場合は、本章で議論されたヒューリスティックス手法は助けになるかもしれません。
通常、障害の原因には複数の組み合わせがあります。したがって、正確な原因を特定するために追加のテストが必要かもしれません。
この文書で議論されている話題は内容が深く、かつ豊富な事例をもとにしています。NISTのサイトによれば、この文書は2010年10月に公開されて以降、8ヶ月間で10,000回ダウンロードされたそうです。組み合わせテストに関心のある方は一読しておく価値のある文書だと思います。
Combinatorial and pairwise testing tutorial は次のサイトからダウンロードすることができます。