ソフトウェアの品質を学びまくる2.0

ソフトウェアの品質、テストなどについて学んだことを記録するブログです。

『練習帳』の問題を解きながら、デシジョンテーブルと組み合わせテストの位置づけについて考える

old pair

 『ソフトウェアテスト技法 練習帳』の第4章「組合せテスト」*1を解き終えました。

 仕様の文章内に因子と水準が明示されているケースだけでなく、ラルフチャートを用いた因子・水準の洗い出しや、既存の仕様からの差分に着目したテスト設計などの応用にも手を伸ばしています。
 またPictMasterの使い方についても、制約条件・エイリアス・サブモデル・原型シートの機能を使えるように問題が設計されており、とてもバランスの取れた章だと思います。

 ということで、また「わたしはこう考えた」のコーナーです。

問題の内容

 問題4.5は、健康診断申し込みシステムです。
 性別、年齢に加えて、任意で追加できる検診項目(眼底検診、メタボ検診、婦人科検診、脳検診)を選んで「申込」するというもので、以下の制約があります。

  • メタボ検診と婦人科検診は、年齢が35歳以上の人のみ選択できる
  • 脳検診は、年齢が45歳以上の人のみ選択できる
  • 婦人科検診は女性のみ選択できる

 問題としては、「2因子間網羅のテストを行う」なのですが、この仕様を見て最初に頭に浮かんだテスト技法は、組み合わせテストではなく決定表でした。各因子がとる水準の組み合わせによって、システムの挙動が変わるためです。

デシジョンテーブルと組み合わせテストの目的

 デシジョンテーブルを書くと、こんな感じでしょうか。*2

f:id:kz_suzuki:20200613184527p:plain
デシジョンテーブル

 ところでこのデシジョンテーブルは、何を確認するためのテストなのでしょうか。
 それは、「プログラムの実行結果が、因子の組み合わせに依存する」仕様の確認です。
 たとえば「年齢」が同じ40歳であっても、婦人科検診を選択可能かは「性別」に依存します。この組み合わせならこれを選べる、あの組み合わせならあれを選べない、と組み合わせを確認していくのが、デシジョンテーブルでのテストです。いわゆる「有則のテスト」ですね。

 一方この問題で取り扱っている組み合わせテストは、「プログラムの実行結果が、因子の組み合わせに依存しない」仕様の確認です。 
 男性でも女性でも、20歳でも30歳でも40歳でも50歳でも、性別と年齢の具体的な値の組み合わせに関係なく、同じように「眼底検診」を選べる、ということを確認していくのが、組み合わせテストです。いわゆる「無則のテスト」です。

 ただしこの問題では、組み合わせることのできない制約(または「禁則」)があります。組み合わせ生成時に、これらの制約に相当するパターンが現れないようにしています。
 決定表で赤字のXになっている部分が、禁則に相当します。組み合わせに現れない(ようにしている)ため、個別に確認することを忘れないようにしなければなりません。

デシジョンテーブルと組み合わせテストのケースの比較

 上の決定表と同じように因子・水準と制約を設定して*3オールペアの組み合わせを生成すると、以下のようになります。

f:id:kz_suzuki:20200613212121p:plain
2因子網羅

 デシジョンテーブルにおける因子の全組み合わせ30パターン、うち許容される20パターン(〇)に比べても、2因子網羅は12ケースと絞り込まれていることがわかります。ただこれくらいなら、デシジョンテーブルに基づいて全組み合わせを確認してもよさそうですね。

 問題は、各因子の水準が多い場合です。
 練習帳では、「年齢」因子に、7つの水準を使っています。今後「任意追加項目」因子の水準も増えることを考えると、組み合わせテストによるテストケース削減が威力を発揮します。
 ただもちろんこれは、デシジョンテーブルの〇部分がすべて同じふるまいをする(つまり因子の組み合わせに依存しない)場合の話です。組み合わせによってふるまいが変わる場合は、それぞれの組み合わせをデシジョンテーブルで確認する必要があります。

ついでに、水準の選び方について

 こちらでも言及したのですが、制約に基づいて「年齢」因子を「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

のように選ぶべきではないのかなと。この辺はみなさんのご意見を伺いたいところ。

 以下、秋山さんご意見です。いつもありがとうございます。

*1:わたしは「組合せ」「組み合せ」「組合わせ」ではなく、「組み合わせ」派です。

*2:デシジョンテーブルの形式が少し変かもしれない。「申込」ボタン押下時に挙動が判明するのであれば、検診項目も条件部の方に入るのが正しい。性別と年齢を選択した時点で「任意追加項目」で選択可能な値が変化するのであれば、この表でもいいかな。

*3:『練習帳』より因子が粗いです。