onemuri.space

組み合わせテスト

テストの設計方法について

本記事では

  • テストケースの作り方がわからない
  • テストケースの数を減らしたい
  • テストの妥当性を証明したい

というようなニーズに応えられるように、テストの作成手法の一つである組み合わせテストについて説明します

組み合わせテストはソフトウェアテストの一つで、複数の条件を組み合わせてテストする手法です

最近では 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 法)さえやればバグが出ないというわけではないことに注意してください
  • バグを出さないために全てのテストケースの組み合わせをすれば良いかもしれませんが、テストは開発工数とのバランスが重要です
  • わかった気にならず、一回でいいので自分の開発にて試してみてください

参考

【この 1 冊でよくわかる】ソフトウェアテストの教科書―品質を決定づけるテスト工程の基本と実践

自己紹介用画像

Riki Akagi

2019年からDeNAで働いています。GCP(CloudSQL・GAE・Cloud Function etc)とGoでAPI開発に勤んでいます。睡眠やエンジニアリングに関することに興味を持って過ごしているのでその情報を皆さんに共有していけたらなと思っています。

自己紹介の詳細