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

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

ドメイン分析テストとデシジョンテーブルの違い

 前回の記事の元ネタとなったHideo Oideさんのつぶやきから、「結局のところ、ドメイン分析テストとデシジョンテーブルテストの違いって何よ」という議論が生まれています。
 この記事では、この議論に対するわたしの見解を整理してみます。よい解釈かどうかはわかりません。

www.kzsuzuki.com

TL:DR

  • デシジョンテーブルは、パラメータの値の組み合わせ論理を検証する。
  • ドメイン分析テストは、パラメータに定義された境界での動作を検証する。
  • デシジョンテーブルの各条件で、代表値として境界値を選べる場合は、デシジョンテーブルテストのテストケースがドメインテストでカバーされる。
    • これは同値分割法と境界値分析の関係と同じ。

 すみません、3個目まだちょっと確信なし。 

全体像

 まず、「似ている」「近い」と感じられる技法の位置づけを提示しましょう。
 パラメータとその値に関する技法を、目的ごと、そしてパラメータが単一か複数かで分類しています。

目的 単一パラメータ 複数パラメータ
パラメータの範囲を分割する 同値分割法 同値分割法
パラメータの境界の動作を評価する 境界値分析 ドメイン分析テスト
パラメータの値の組み合わせ
論理(有則)を評価する
n/a デシジョンテーブル
原因結果グラフ
原因流れ図
パラメータの値の組み合わせ
論理(無則)を評価する
n/a ペアワイズテスト
直交表テスト

 目的ごとに説明してみます。

パラメータの範囲を分割する

 同値分割法は、他のテスト技法のベースとなる技法です。
 その役割は2つあります。

  1. あるパラメータ(群)の領域を分割する
  2. 分割された領域から、具体的な値を代表値として選ぶ

 これによって、パラメータの広大な空間のテストを、現実的な数の値で網羅することができます。

パラメータの境界の動作を評価する

 識別されたパラメータの境界が、想定通りに動作するかを確認するための技法です。

 1つのパラメータに対して行っていた境界値分析を、複数のパラメータに対して行えるように拡張したのがドメイン分析テストということができます。
 が、「ドメイン分析テストにおいてパラメータが1つしかない特殊な場合が、境界値分析である」 という捉え方もできるでしょう。

 ドメイン分析を行うと、各変数をどう組み合わせるかというデシジョンテーブルに似た表、Binderのドメインテストマトリクス*1が出てきます。このため、ドメイン分析テストは「値の組み合わせのテスト」のようにも見えるのですが、そうではありません。

 ドメインテストマトリクスを見るとわかるように、あるパラメータ*2は境界値を狙いつつ、他のパラメータについては「検証に影響を与えない無難な値」であるInを選びます。組み合わせではなく、特定のパラメータの境界を確認するのが、ドメイン分析テストです。

パラメータの値の組み合わせ論理を評価する

 ドメイン(あるいは同値パーティション)として区切られた領域の値の組み合わせを評価する技法です。組み合わせ論理が仕様として定義されていればいわゆる「有則」であり、デシジョンテーブルはそれをテストするための技法です。

 パラメータが1つしかない場合は「組み合わせ」はありませんので、対応する技法はありません。
 あるいは、同値分割法の役割2「具体的な値を代表値として選ぶ」がこれに対応するという解釈も可能だと思います。この考えを最初の表に反映すると、こうなります。

目的 単一パラメータ 複数パラメータ
パラメータの範囲を分割する 同値分割法 同値分割法
パラメータの境界の動作を評価する 境界値分析 ドメイン分析テスト
パラメータの値の組み合わせ論理(有則)を評価する 同値分割テスト デシジョンテーブル
原因結果グラフ
原因流れ図
パラメータの値の組み合わせ論理(無則)を評価する 同値分割テスト ペアワイズテスト
直交表テスト

 ここで同値分割法は「ある領域を、同値パーティションに分割すること」自体を、同値分割テストは「分割された同値パーティションから値を選んでテストすること」を意味します。

同値分割テストと境界値分析

 兄弟のように扱われるこの2つですが、そもそも目的が違う技法というのがわたしの解釈です。
 実はASTERセミナー標準テキストにも、それがしれっと書いてあります。

テストケースを合理的に少なくするための技法
 ・同値分割法
 ・組み合わせテスト

多くの欠陥が見つかるようにするための技法
 ・境界値分析
 ・エラー推測
 ・探索的テスト

テスト対象を漏れなくテストするための技法
 ・制御フローテスト
 ・データフローテスト
 ・デシジョンテーブルテスト
 ・状態遷移テスト
 ・ユースケーステスト

 「同値パーティションの中から値を選ぶ」という手順自体は同じなのですが、目的は異なります
 同値分割テストの目的は「最少数の値で検証を済ませること」ですし、境界値分析の目的は「境界が正しく設定されているかを確認すること」です。

 ではなぜ兄弟っぽいのか。
 それは、同値分割テストの代表値として境界値を選ぶことで、両方の目的を一回で済ませられることがあるからです。目的の違うテストが、テストケースとしては1つになるため、「同値分割法の特殊版が境界値分析だ」みたいな印象になるのかなと思います。
 代表値として境界値が適切でなければ、同値分割テストの目的に使うべき値と境界値分析で使うべき値は別になるので、テストケースも異なるものになります*3

デシジョンテーブルテストとドメイン分析テスト

 繰り返しになりますが、デシジョンテーブルは複数のパラメータ同士の組み合わせたときの動作を検証するもので、ドメイン分析テストは定義された境界の動作を検証するものです。
 WACATEの資料の例を超はしょって、具体的にみてみましょう。

www.slideshare.net

仕様
1. 飲み物が、ソフトドリンクとアルコールの2種類、用意されている
2. ソフトドリンクとアルコール、合わせて最大7本までもらえる
3. ソフトドリンクは最大5本までもらえる
4. アルコールは最大4本までもらえる

ドメイン分析テスト

 ソフトドリンクの本数をx、アルコールの本数をyとします。定義された境界は以下の3つです。

  • x ≤ 5
  • y ≤ 4
  • x + y ≤ 7

 これをグラフにした絵をスライドから引用させてもらいます。

WACATE資料「わりとディープ? 同値分割⇔境界値分析」より

 式だけを見ると、x + y ≤ 7 は2つのパラメータを組み合わせているように見えますが、グラフを見ると他の境界と同じ、単なる1次式であることがよくわかります。むしろ他の2つの方が、軸に平行な特殊ケースと言ってもいいでしょう。
 これらの境界が正しく動作するかを検証するために、各式に対して境界のキワキワの値を選ぶ。それ以外の式については安全なInの値を選ぶ。これがドメイン分析です。

デシジョンテーブルテスト

 「3つの式がすべて真の時だけ、飲み物を受け取れる」という論理を確認するためのデシジョンテーブルを書いてみましょう*4

# 1 2 3 4
条件1 x ≤ 5 T: 4 T: 5 T: 1 T: 5
条件2 y ≤ 4 T: 3 T: 3 F: 5 T: 3
条件3 x + y ≤ 7 T: 7 F: 8 T: 6 F: 8
動作 もらえる? T: もらえる F: もらえない F: もらえない F: もらえない

 これらの値は、特に「境界」を意識していません。が、たとえばテストケース1は、条件1と条件2がInの値に、条件3はOnの値になっています。ドメイン分析テストで出てくる値の組み合わせと同一になるでしょう。

 ドメイン分析テストでは、それぞれの境界のOnとOffをすべて検証することになるので、デシジョンテーブルの論理も自動的にカバーされます。各パラメータについて選ぶ代表値が境界値でよければ、ドメイン分析テストによってパラメータ組み合わせ論理も包含されることになります。

おわりに

 記事を書く前は、ずいぶんオリジナリティのあることが書けそうだと思っていたのですが、書き終わってみるとどうも面白みのない(そして正しいかどうかも怪しい)内容になってしまいました。
 ご意見いただければ幸いです。

 せっかくなので、みなさんのツイートを引用しておきます。

 2つの技法は確認対象が異なるというご意見で、わたしの考えも同じです。
 秋山さんが「組み合わせ制約」と書いているものが、わたしのいう「パラメータの境界」に対応しますが、「組み合わせの制約」の方が広そう。

 ISTQB ALTAからドメイン分析テストがなくなったのは、「試験時間とトレーニング時間を変更したのが理由」・・・!? なんとまあ・・・。

参考資料

note.com

 結局のところ、湯本さんのこの記事の「さいごに」と、本質的には同じことを書いただけかもしれません。

togetter.com

 同値分割と境界値分析について深い議論のなされたまとめ。いまだに、何度も読み直します。

Stone Wall

*1:この後に引用するWACATEのスライドを参照してください。

*2:ここでは、単一パラメタ同士の組み合わせも、パラメータと捉えます

*3:『ソフトウェアテスト練習帳』では、境界値とともに別の代表値も確認するテストケースを解答例としています。

*4:2つ以上の条件が偽になるケースは省略。