第202回: 「ソフトウェアテストしようぜ」18 GIHOZ(5. デシジョンテーブルテスト中編)
◀前の記事へ 次の記事へ▶
≡ はじめに
前回は、「デシジョンテーブルテスト」の簡単化の3つの方法のうち、実行不可と、テスト不可について説明しました。復習を兼ねて、3つの方法を再掲します。
今回は、「網羅基準を全組合せからMC/DCに変えることで、デシジョンテーブルを小さくする」話について書きます。
≡ 結果に関連性のない条件
私がおすすめしている「網羅基準を全組合せからMC/DCに変えることで、デシジョンテーブルを小さくする」方法は、JSTQB ALTAの「結果に関連性のない条件の値を「-」(関係なし)で表記することによって、デシジョンテーブルを簡単化する」方法に近いので、まずは「結果に関連性のない条件の値を『-』(関係なし)で表記する」方法について具体例を示しながら説明します。
今回の例題の仕様は以下の通りです。
あー、スリーアウト。
私は完璧に対象外だ。(笑)
さて、デシジョンテーブルをつくってみます。
上記のデシジョンテーブルをみると、年齢の条件がN(条件に当てはまらない)なら、他の条件がどうであれ、舞妓不可であることがわかります。
そこで、結果に関連性のない条件の値を「-」(関係なし)に置き換えます。
上記は、年齢の条件がクリアしなかった場合(Nのとき)には、身長の条件や性別が女性という条件は結果に関連性がないことを示しています。5~8列は全て同じ内容なので1列を残してあとは削除します。
このデシジョンテーブルをよく眺めていると、年齢の条件がYで身長条件がNの3列と4列については、性別が女性という条件がYでもNでも結果が変わらないことが分かります。そこで3列と4列に対して、女性行のセルのYとNを「-」で置き換えます。
置き換えてみると、3列と4列は同じ内容となったので、3列を残して4列は削除します。(4列のほうを残しても同じことです)
こちらで、「結果に関連性のない条件の値を「-」(関係なし)で表記することによって、デシジョンテーブルを簡単化する」方法で、デシジョンテーブルの簡単化ができました。
続いて、「モヤっとポイント」について説明します。
まず、もとのデシジョンテーブルを再掲します。
最初の説明では、年齢(N)から始めましたので、今度は、身長(N)から始めてみます。
身長がNの列に着目すると、どれも結果が同じです。そこで、他の条件を「-」に置き換えてみます。
3, 4, 7, 8列が同じになりました。同じ列(同じテストケース)を何度もテストする必要はありませんので、列を1つ残してあとは削除します。
よくみると、5列と6列は、女性がYであってもNであっても結果は同じです。
同じ列ができたので簡単化します。
ここで、年齢からはじめたものと比較してみます。
1列目と2列目は全く同じですが、3列目と4列目は「-」が入っている位置が違います。
例えば、右側のデシジョンテーブルをみると、3列目の年齢は「-」です。
さて、ここで、「-」はYでもNでも構いませんので、「N」を入れてみます。
もし、条件が上から順番に処理されるのなら、右側のデシジョンテーブルでは、ルール3で年齢で不合格になったら身長(N)のチェックは行われません。身長がNの値を持つ列は第3列のみですので、身長がNだったときの結果を確認する列がありません。
どうやら、「結果に関連性のない条件の値を『-』(関係なし)で表記することによって、デシジョンテーブルを簡単化する方法」をおこなうときには、条件が処理される順番を考慮する必要がありそうです。
≡ 処理の順番について
まず、条件の処理の順番を考慮しないとどうなるかについて確認します。
デシジョンテーブルの簡単化のときに条件側に入力した「-」は「関係なし」の意味ですから、任意の有効な値(この場合ならYとNのどちらでも)セットすることができます。
そこで、上記のデシジョンテーブルでは最初のデシジョンテーブルの条件の「-」を「N」に置き換えてみました。
さて、ここで、開発者が、女性→年齢→身長の順番でチェックするようにプログラムコードを書いたとします。
デシジョンテーブルを実行順に並び替えてみます。
1列目のテストでは、女性(Y)、年齢(Y)、身長(Y)のテストがおこなわれます。2列目以降のテストでは女性がNなので、他の条件はチェックされず「舞妓不可」の結果を出します。したがって、年齢と身長については、列1のテスト、すなわち、値がYのテストしかされません。
もしも、プログラマーがつくったプログラムが元のデシジョンテーブルの行の順番と同じ条件の順(年齢→身長→女性の順)で処理をしていたら、以下の表のように、列の2では女性がNの条件を列の3では、身長がNの条件をテストしています。
このことからデシジョンテーブルを「結果に影響しない条件の組み合わせをテストする列」を削除する方法で簡単化するときには、「処理の順序」通りに条件行を並べてから、下の行から上に向かって順番に簡単化する必要があります。
「-」でデシジョンテーブルを簡単化する方法をまとめます。
≡ 処理の順序が分からない場合
デシジョンテーブルの簡単化をするときに、ソースコードをテスト設計者がみることができない状況や、開発者とのコンタクトができない状況があります。また、そもそも、ソースコードが存在しない要件リストに対して早期にテスト設計することがあります。
さらに、心配性な人は、「実装の順番なんていつ変わるかわからない」と考えるかもしれません。
その場合は、今回であれば、「-」を「N」ではなく「Y」に置き換えます。
そうすると、順番を並び替えても、
のようになり、Nの上には必ずYが連続してありますので、各条件のYとNが評価されます。
ちょっとした手品のようですが、2列目では女性がN、3列目では身長がN、5列目では年齢がNのときに舞妓不可となるテストが出来ています。(書くまでもないかもしれませんが1列目では女性がY、身長がY、年齢がYのそれぞれが結果に影響を与えています)
このように、各条件のYとNというCondition(条件)と結果を決めるDecision(判定)をともに満たすので、これを改良条件判定テスト、略してMC/DCと呼びます。改良条件判定テストについてISTQBの用語集では以下のように定義しています。(ソースコードの制御フローパステストで使われることが多いため、ホワイトボックステスト技法に分類されているのかもしれません。説明してきたようにブラックボックステストでも使用するのですが)
さて、MC/DCカバレッジを満たすように「-」をYまたはNに変更する方法ですが、条件がANDで結ばれているときには上で書いたようにYに置き換え、条件がORで結ばれているときにはNに置き換えるのが基本です。
ANDとORが混在する複雑な場合は、手作業だと誤りが生じますので原因結果グラフを用います。
原因結果グラフについては、GEGTestを使うと便利です。原因結果グラフとCEGTestの使い方の解説は、拙著『ソフトウェアテスト技法ドリル【第2版】』に書きました。
≡ 練習問題
2回に渡って、デシジョンテーブルの簡単化について説明しました。
わかったかどうかモヤモヤしている人がいるかもしれません。そこで、練習問題を用意しました。
解いてみてみて。
解いたらTwitterで@akiyama924に簡単化の前後のデシジョンテーブルやコメントをメンションしていただけると次回のGIHOZの回で使えるので非常に助かります。🙇♂️
もちろんGIHOZを使っても構いません。手書きでもいいです。
≡ おわりに
今回は、「デシジョンテーブルテスト」の簡単化の3つ目として、「網羅基準を全組合せからMC/DCに変えることで、デシジョンテーブルを小さくする」方法について書きました。
処理の順番の情報が得られれば、MC/DCでなくても、条件を処理の順番に並べるだけで、それぞれの条件のYとNがテストされます。したがって、原因結果グラフが苦手な方は処理の順番に合わせて、デシジョンテーブルを作ると良いでしょう。
ところで、処理の順番を変えることで、ロジックがシンプルになることがあります。前回書いた「うるう年の判定」についても、4→100→400の順番で判定処理を書くよりも、400→100→4の順番で処理する方が楽です。(400だったら「うるう年」をリターンして関数を抜け、、、と書けばよいからです)
そこで、デシジョンテーブルテストの作成が上達したらデシジョンテーブルを開発者と一緒になって考えるのもよいでしょう。
その際には、デシジョンテーブルをつくる前にデシジョンツリーで検討する方が良いです。デシジョンツリーについては、『ソフトウェアテスト技法練習帳』の第2章が参考になります。
Jorgensenも“how good testing can improve programming.”と書いていました。
次回は、いよいよGIHOZの「デシジョンテーブルテスト」ツールを使い、GIHOZのテストをつくります。
◀前の記事へ 次の記事へ▶
この記事が気に入ったらサポートをしてみませんか?