テストの設計方法について
本記事では
- テストケースの作り方がわからない
- テストケースの数を減らしたい
- テストの妥当性を証明したい
というようなニーズに応えられるように、テストの作成手法の一つである組み合わせテストについて説明します
組み合わせテストはソフトウェアテストの一つで、複数の条件を組み合わせてテストする手法です
最近では TDD が議論され、テスト主導の開発手法も提唱されているほどソフトウェア開発においてテストは当たり前になりつつあります
テストケースの作り方を知らずにテストを書こうとしても正直感覚で作ってしまいますよね
本記事ではテストの組み合わせ数を減らして最小限のテストケースを作成する方法として組み合わせテストを説明します
間違えないで欲しいのは、本記事で紹介した内容を実行すればテストは十分になるわけではなく、現実的に必要最小限ぐらいのテストケースの数になるような手法の紹介であるという点です
組み合わせテストって何がいいの
web 開発に限らず最近の開発はとても複雑になる傾向があります リッチなコンテンツが当たり前になりつつある世界になってきていて、それに伴った複雑な状態や設定が存在しています
なんでも良いのですが、今回はゲームを例にして考えてみましょう ゲーム A のキャラクターは「進化」「覚醒」「装備」「衣装」「装飾品」によって外見が変わるという仕様だとしましょう
進化: 第一、第二
覚醒: 超化、究極化
装備: 剣、杖、槍、弓
衣装: マント、鎧、ローブ、ドレス
装飾品: 指輪、首飾り、リボン、リストバンド
現実のゲームではもっと多いでしょうが、以上のような種類だとしましょう
この場合、全ての組み合わせ数は 256通り(2 × 2 × 4 × 4 × 4)
になります
これらの通り全てをテストするのは現実的ではないですね
しかも現実には装備や衣装や装飾品は数え切れないほどありますよね、一つ増えるたびに組み合わせがどんどん増加し 組み合わせ爆発
を起こしてしまいます
こういった場合のテストケースの数を出来るだけ減らし、かつ出来るだけ欠陥の数を減らすための手法が組み合わせテストで紹介するキーワードは 2因子間網羅
です
2 因子間網羅
2 因子間網羅には 因子
、水準
という言葉が出てきます
先ほどのゲームの衣装の組み合わせの例で話しましょう
進化: 第一、第二
覚醒: 超化、究極化
装備: 剣、杖、槍、弓
衣装: マント、鎧、ローブ、ドレス
装飾品: 指輪、首飾り、リボン、リストバンド
この場合、進化・覚醒・装備・衣装・装飾品は 因子
にあたり、究極化・剣・鎧・首飾りは 水準
にあたります
2 因子間網羅というのは言葉どおりですが、2つの因子の間の組み合わせを全て網羅
することです
なぜ、2 つの因子の間の組み合わせを全て網羅するのかというと、D.Richard Huhn さんが論文Software Fault Interactions and Implications for Software Testing
にて 2 因子間で生じる欠陥が全欠陥の大多数をしめる結果になっているからです
もちろん因子の数を増やせば網羅できる欠陥の数も増えますが、3 因子以上にするとテストケースが一気に増えるため、工数と結果のバランスを見るみたいです
組み合わせテスト手法
本記事では 2 因子間網羅を満たした組み合わせを作成する手法として All-Pairs(Pairwise) 法
を紹介します
数学的な証明はしません(そもそも自身がわからないですし)
理解せずともテストケースの作成は可能です
All-Pairs(Pairwise) 法
All-Pairs 法はツールがあるのでそれを使ってみましょう
mac の場合はpict
というツールをインストールします
brew install pict
因子と水準をテキストに落とし込みます
touch parameters.txt
parameters.txt の中身は以下のようにしてください(簡単化のため装飾品を削除しました)
進化: 第一, 第二
覚醒: 超化, 究極化
装備: 剣, 杖, 槍, 弓
衣装: マント, 鎧, ローブ, ドレス
コピーしたら以下のコマンドを実行してみてください
pict parameters.txt
このような結果になると思います
進化 覚醒 装備 衣装
第一 超化 槍 マント
第一 究極化 剣 ローブ
第二 超化 剣 鎧
第二 超化 弓 ローブ
第二 究極化 杖 マント
第二 超化 剣 ドレス
第二 究極化 剣 マント
第二 究極化 槍 鎧
第一 究極化 槍 ドレス
第一 究極化 槍 ローブ
第一 究極化 弓 マント
第一 超化 杖 ドレス
第二 超化 弓 ドレス
第一 超化 弓 鎧
第二 究極化 杖 鎧
第一 究極化 杖 ローブ
組み合わせの数は 16
になっていますね
それでは 2 つの因子の間に着目して進めていきましょう
例えば 進化
と装備
についてみてみましょう
進化: 第一、第二
装備: 剣, 杖, 槍, 弓
だったので、8 つのパターン(2 × 4)があると良さそうです
上のテキストから組み合わせを探せましたか?
「第一」と「装備(剣, 杖, 槍, 弓)」の組み合わせは網羅されていますね(重複には ★ をつけていません)
進化 覚醒 装備 衣装
第一 超化 槍 マント ★
第一 究極化 剣 ローブ ★
第二 超化 剣 鎧
第二 超化 弓 ローブ
第二 究極化 杖 マント
第二 超化 剣 ドレス
第二 究極化 剣 マント
第二 究極化 槍 鎧
第一 究極化 槍 ドレス
第一 究極化 槍 ローブ
第一 究極化 弓 マント ★
第一 超化 杖 ドレス ★
第二 超化 弓 ドレス
第一 超化 弓 鎧
第二 究極化 杖 鎧
第一 究極化 杖 ローブ
では、「第二」と「装備(剣, 杖, 槍, 弓)」の組み合わせについてはどうでしょうか
進化 覚醒 装備 衣装
第一 超化 槍 マント
第一 究極化 剣 ローブ
第二 超化 剣 鎧 ★
第二 超化 弓 ローブ ★
第二 究極化 杖 マント ★
第二 超化 剣 ドレス
第二 究極化 剣 マント
第二 究極化 槍 鎧 ★
第一 究極化 槍 ドレス
第一 究極化 槍 ローブ
第一 究極化 弓 マント
第一 超化 杖 ドレス
第二 超化 弓 ドレス
第一 超化 弓 鎧
第二 究極化 杖 鎧
第一 究極化 杖 ローブ
網羅されていますね、
他の因子間でも確認してみてください
2 因子間網羅になっていることがわかると思います
愚直に全網羅で組み合わせ数を計算した場合は 256
だったので圧倒的にテストケースが減りましたね
まとめ
- 今回紹介した組み合わせテスト(All-Pairs 法)さえやればバグが出ないというわけではないことに注意してください
- バグを出さないために全てのテストケースの組み合わせをすれば良いかもしれませんが、テストは開発工数とのバランスが重要です
- わかった気にならず、一回でいいので自分の開発にて試してみてください