『ソフトウェアテスト技法 練習帳』の第4章「組合せテスト」*1を解き終えました。
仕様の文章内に因子と水準が明示されているケースだけでなく、ラルフチャートを用いた因子・水準の洗い出しや、既存の仕様からの差分に着目したテスト設計などの応用にも手を伸ばしています。
またPictMasterの使い方についても、制約条件・エイリアス・サブモデル・原型シートの機能を使えるように問題が設計されており、とてもバランスの取れた章だと思います。
ということで、また「わたしはこう考えた」のコーナーです。
問題の内容
問題4.5は、健康診断申し込みシステムです。
性別、年齢に加えて、任意で追加できる検診項目(眼底検診、メタボ検診、婦人科検診、脳検診)を選んで「申込」するというもので、以下の制約があります。
- メタボ検診と婦人科検診は、年齢が35歳以上の人のみ選択できる
- 脳検診は、年齢が45歳以上の人のみ選択できる
- 婦人科検診は女性のみ選択できる
問題としては、「2因子間網羅のテストを行う」なのですが、この仕様を見て最初に頭に浮かんだテスト技法は、組み合わせテストではなく決定表でした。各因子がとる水準の組み合わせによって、システムの挙動が変わるためです。
デシジョンテーブルと組み合わせテストの目的
デシジョンテーブルを書くと、こんな感じでしょうか。*2
ところでこのデシジョンテーブルは、何を確認するためのテストなのでしょうか。
それは、「プログラムの実行結果が、因子の組み合わせに依存する」仕様の確認です。
たとえば「年齢」が同じ40歳であっても、婦人科検診を選択可能かは「性別」に依存します。この組み合わせならこれを選べる、あの組み合わせならあれを選べない、と組み合わせを確認していくのが、デシジョンテーブルでのテストです。いわゆる「有則のテスト」ですね。
一方この問題で取り扱っている組み合わせテストは、「プログラムの実行結果が、因子の組み合わせに依存しない」仕様の確認です。
男性でも女性でも、20歳でも30歳でも40歳でも50歳でも、性別と年齢の具体的な値の組み合わせに関係なく、同じように「眼底検診」を選べる、ということを確認していくのが、組み合わせテストです。いわゆる「無則のテスト」です。
ただしこの問題では、組み合わせることのできない制約(または「禁則」)があります。組み合わせ生成時に、これらの制約に相当するパターンが現れないようにしています。
決定表で赤字のXになっている部分が、禁則に相当します。組み合わせに現れない(ようにしている)ため、個別に確認することを忘れないようにしなければなりません。
デシジョンテーブルと組み合わせテストのケースの比較
上の決定表と同じように因子・水準と制約を設定して*3オールペアの組み合わせを生成すると、以下のようになります。
デシジョンテーブルにおける因子の全組み合わせ30パターン、うち許容される20パターン(〇)に比べても、2因子網羅は12ケースと絞り込まれていることがわかります。ただこれくらいなら、デシジョンテーブルに基づいて全組み合わせを確認してもよさそうですね。
問題は、各因子の水準が多い場合です。
練習帳では、「年齢」因子に、7つの水準を使っています。今後「任意追加項目」因子の水準も増えることを考えると、組み合わせテストによるテストケース削減が威力を発揮します。
ただもちろんこれは、デシジョンテーブルの〇部分がすべて同じふるまいをする(つまり因子の組み合わせに依存しない)場合の話です。組み合わせによってふるまいが変わる場合は、それぞれの組み合わせをデシジョンテーブルで確認する必要があります。
ついでに、水準の選び方について
『ソフトウェアテスト技法練習帳』は4.5でひっかかったままだったんだ。「20~34、35~44、45~60」で同値分割するのは理解できたんだけれど、これを
— Kazu SUZUKI (@kz_suzuki) 2020年6月13日
20~33、34
35、36~43、44
45、46~60
に分けるのが納得いかず悶々。34は境界値として特別扱いするのに、20と60をそうしない理由は? 優先度が低い?
こちらでも言及したのですが、制約に基づいて「年齢」因子を「20~34、35~44、45~60」で同値分割するのはいいとして、水準として
- 20~33、34 (上限とそれ以外) → 代表値は 20、34
- 35、36~43、44 (上限と下限とそれ以外) → 代表値は 35、36、44
- 45、46~60 (下限とそれ以外) → 代表値は 45、46、60
を選んでいるのはどうも一貫性がなく、解せない点です。境界値を別の同値クラスとするのであれば、
- 20、21~33、34 (上限と下限とそれ以外) → 代表値は 20、30、34
- 35、36~43、44 (上限と下限とそれ以外) → 代表値は 35、40、44
- 45、46~59、60 (上限と下限とそれ以外) → 代表値は 45、50、60
のように選ぶべきではないのかなと。この辺はみなさんのご意見を伺いたいところ。
以下、秋山さんご意見です。いつもありがとうございます。
私は、前者の「45、46~59、60」として、「46~59」をエイリアスにするのが良いと思っています。
— あきやま🐾 🐾 (@akiyama924) 2020年6月13日
45と60は境界値で、46~59はどれでも良いと判断した範囲だからです。