「基礎から学ぶソフトウェア・テスト」ネタ(その3)
106ページにデシジョンテーブルを用いたテストケースの挙げ方が載っています。
おそらくページ数の関係だと思いますが、説明がはしょられているところがあります。私の方で補足しておきましょう。
まずは、仕様から。
この仕様からテストケースを挙げるのに、デシジョンテーブルを使って説明されています。
最後にテストケースとなる組合せが書かれています。
本文を読みますと、いきなりこの組合せがでてくるように感じられるかもしれません。実は本文の説明の中には2つ観点が入っているのですが、それを明確に分けておらず一緒くたにして書かれているため、初心者の人が読むと混乱してしまう恐れがあります。
2つの観点とは
(1)条件と同値分割の話
(2)優先して選択するテストケースの話
それぞれ分けて説明することにします。
◆条件と同値分割
条件には真偽だけを考えればよい場合と、同値分割も考慮して考えなければならない場合があります。本文にも書かれていますが、年齢が6歳以上18歳以下という条件があったとき、6歳未満と18歳より超える年齢を考慮します。
同値分割を考慮しなくてはいけないとき、デシジョンテーブルには2つの書き方があります。
1つめは、条件の中に追加していれるというものです。
条件
------------------------------
年齢が6歳未満
年齢が6歳以上18歳以下
年齢が18歳超
というように条件を追加するわけです。ただし、この条件は or の関係にありますので、この3つの条件のうち、いずれかが真の場合は他の条件は真になりません。そこだけは注意してください。なお、松尾谷徹先生のCFDではこの考え方を採用されています。
2つめは、本文に書かれているやり方です。同値分割を別の場所で行い、その結果をデシジョンテーブルに割り付けるという考え方です。
この割り付けるやり方を採用する場合には、一般にはこの後で述べるテストケースを絞り込んでから割り付けます。
◆テストケースの絞り込み
この話はデシジョンテーブル(1)であきやまさんからコメントをいただいています。
さて、本文には
としか書かれておらず、なぜこれを選んだかの記述がありません。この補足をしましょう。
年齢:T,T,T,F,F
埼玉:T,T,F,T,F
学生:T,F,T,T,F
本文に合わせますと左からNo1,No2,No4,No5,No12のケースになります。
No1とNo12は分かりますね。すべて真かすべて偽をテストしています。
残りは何をテストしているのでしょうか。残りはそれぞれの条件を1つだけ偽にしているのです。学生証だけ偽、あとは全部真。埼玉在住だけ偽、年齢だけ偽となっているのです。
優先順位を意識するとき、このように考えます。
◆同値分割の割り付け
先ほども書きましたが、同値に分割した結果次のようになりました。
①:年齢が6歳未満
②:年齢が6歳以上18歳以下
③:年齢が18歳超
偽は①と③の2つあります。これを先ほどのデシジョンテーブルに割り付けます。
年齢:T,T,T,③,①
埼玉:T,T,F,T,F
学生:T,F,T,T,F
これが本文の説明になります。ただし、私がテストケースを書く場合、もうひとつケースを追加してこうすると思います。
年齢:T,T,T,③,①,③
埼玉:T,T,F,T,T,F
学生:T,F,T,T,T,F
すべて偽になるケースに6歳未満を入れて確認済みとするのには抵抗があります。見解の相違と言えるでしょう。
(7/24 追記)
最後の列にある全てが偽のケース
年齢:③
埼玉:F
学生:F
この組合せはいりません。全てがFのケースは意味を持たないため、優先度を考えるならば、落としてもよいケースになります。
あきやまさんからご指摘がありました。ありがとうございます。
(追記終わり)
これで説明は以上です。久しぶりに長いエントリを書いてしまいました。なおこの説明で分からない場合は、コメントに質問してください。私で答えられない場合は、テストマスター達に教えを請いますので。
106ページにデシジョンテーブルを用いたテストケースの挙げ方が載っています。
おそらくページ数の関係だと思いますが、説明がはしょられているところがあります。私の方で補足しておきましょう。
まずは、仕様から。
年齢が6歳以上18以下、現住所が埼玉県、学生証の提示ありの場合に、チケット代金を学生金額とする
この仕様からテストケースを挙げるのに、デシジョンテーブルを使って説明されています。
最後にテストケースとなる組合せが書かれています。
年齢:T,T,T,F(19以上),F(5以下)
埼玉:T,T,F,T,F
学生:T,F,T,T,F
本文を読みますと、いきなりこの組合せがでてくるように感じられるかもしれません。実は本文の説明の中には2つ観点が入っているのですが、それを明確に分けておらず一緒くたにして書かれているため、初心者の人が読むと混乱してしまう恐れがあります。
2つの観点とは
(1)条件と同値分割の話
(2)優先して選択するテストケースの話
それぞれ分けて説明することにします。
◆条件と同値分割
条件には真偽だけを考えればよい場合と、同値分割も考慮して考えなければならない場合があります。本文にも書かれていますが、年齢が6歳以上18歳以下という条件があったとき、6歳未満と18歳より超える年齢を考慮します。
同値分割を考慮しなくてはいけないとき、デシジョンテーブルには2つの書き方があります。
1つめは、条件の中に追加していれるというものです。
条件
------------------------------
年齢が6歳未満
年齢が6歳以上18歳以下
年齢が18歳超
というように条件を追加するわけです。ただし、この条件は or の関係にありますので、この3つの条件のうち、いずれかが真の場合は他の条件は真になりません。そこだけは注意してください。なお、松尾谷徹先生のCFDではこの考え方を採用されています。
2つめは、本文に書かれているやり方です。同値分割を別の場所で行い、その結果をデシジョンテーブルに割り付けるという考え方です。
この割り付けるやり方を採用する場合には、一般にはこの後で述べるテストケースを絞り込んでから割り付けます。
◆テストケースの絞り込み
この話はデシジョンテーブル(1)であきやまさんからコメントをいただいています。
さて、本文には
特に依存関係が無い場合は、No1,2,4,5,12の5つのテストを行えば良いでしょう。
としか書かれておらず、なぜこれを選んだかの記述がありません。この補足をしましょう。
年齢:T,T,T,F,F
埼玉:T,T,F,T,F
学生:T,F,T,T,F
本文に合わせますと左からNo1,No2,No4,No5,No12のケースになります。
No1とNo12は分かりますね。すべて真かすべて偽をテストしています。
残りは何をテストしているのでしょうか。残りはそれぞれの条件を1つだけ偽にしているのです。学生証だけ偽、あとは全部真。埼玉在住だけ偽、年齢だけ偽となっているのです。
優先順位を意識するとき、このように考えます。
◆同値分割の割り付け
先ほども書きましたが、同値に分割した結果次のようになりました。
①:年齢が6歳未満
②:年齢が6歳以上18歳以下
③:年齢が18歳超
偽は①と③の2つあります。これを先ほどのデシジョンテーブルに割り付けます。
年齢:T,T,T,③,①
埼玉:T,T,F,T,F
学生:T,F,T,T,F
これが本文の説明になります。ただし、私がテストケースを書く場合、もうひとつケースを追加してこうすると思います。
年齢:T,T,T,③,①,③
埼玉:T,T,F,T,T,F
学生:T,F,T,T,T,F
すべて偽になるケースに6歳未満を入れて確認済みとするのには抵抗があります。見解の相違と言えるでしょう。
(7/24 追記)
最後の列にある全てが偽のケース
年齢:③
埼玉:F
学生:F
この組合せはいりません。全てがFのケースは意味を持たないため、優先度を考えるならば、落としてもよいケースになります。
あきやまさんからご指摘がありました。ありがとうございます。
(追記終わり)
これで説明は以上です。久しぶりに長いエントリを書いてしまいました。なおこの説明で分からない場合は、コメントに質問してください。私で答えられない場合は、テストマスター達に教えを請いますので。
たとえば,プリミティブの場合とオブジェクトの場合でも同値分割のパターンが違います。
また,プリミティブでもbooleanとintでは違うし,オブジェクトでもEntity系とContainer系では違いますよね。
この辺を説明しなければ新人も納得してくれないと思うのですが,どのように解決しておられますか?
ご質問の件、私の理解が至らないために誤読しているのかもしれませんが、デシジョンテーブルというよりも、同値分割についてのご質問ではないでしょうか?
同値分割の質問と仮定しますと、
どの工程のテストで同値分割を使用するかによって、回答が異なります。
私の経験で恐縮ですが、単体テストレベルですと、変数の型を意識する場合もあります。
結合テストレベルですと、変数の型を意識しないことの方が多いような気がします。まぁ、この辺は結合のレベルによっても異なります。
ここまで書いてみて、ご質問の意図と離れているような気がしてきました。申し訳ありません。
普通にやっていますが....