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

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

ドメイン分析テスト周りの用語の整理メモ

 Twitter上で不定期に議論になる、ドメイン分析テストにおけるOn/Off、In/Outなどについての整理メモ*1です。
 同値分割、境界値分析、ドメイン分析についての概要を知っていることを前提としています。

用語の定義

 『ソフトウェアテスト技法ドリル』でも『はじめて学ぶソフトウェアテスト技法』でも、On/Off、In/Outはドメイン分析テストで導入される概念です。

ソフトウェアテスト技法ドリル―テスト設計の考え方と実際

ソフトウェアテスト技法ドリル―テスト設計の考え方と実際

 ドメイン分析テストでは、あるパラメタの境界値に対し、別のパラメタの「あたりさわりのない値」を組み合わせていきます。これをクリアに整理するために、境界値分析ではなくドメイン分析テストで説明しているのではないかと思います。

On/Off、In/Out

 ドリル本では以下のように定義しています。文章からの抜粋です。

  • On 注目している境界値
  • Off Onポイントに対して境界値分析をしたときに見つかる隣接したもう一つの境界値
  • In ドメインの内側(On/Off以外)
  • Out ドメインの外側(On/Off以外)

 ドメインの内側か外側かというのは排他であり、OnとOffも排他なので、この4つの概念はMECEです。

ドメイン開/閉の定義

 ドメインの開閉は以下のように区別されます。リー・コープランドさんの『はじめて学ぶソフトウェアテスト技法』を参考にしています。

はじめて学ぶソフトウェアのテスト技法

はじめて学ぶソフトウェアのテスト技法

  • ドメイン境界が「=」「≧」「≦」で表現される場合、そのドメインは「閉じて」いる。
  • ドメイン境界が「>」「<」で表現される場合、そのドメインは「開いて」いる。

 ではそれぞれ、絵と一緒に見ていきます。

ドメインが「自然数n≧10」である場合

 これ以降の絵の黒丸●と白丸〇は、有効同値・無効同値の意味ではなく、明示した数字を含む(●)か含まない(〇)かの意味です。

01

 ドメインの定義に使われている「10」がOnになります。境界の逆側すぐそばにある「9」がOffになります。
 ドメインの内側にあるもののうち、On/Offを除く11以上の自然数がInになります。
 ドメインの外側にあるもののうち、On/Offを除く8以下の自然数がOutになります。

ドメインが「自然数n>10」である場合

02

 ドメインの定義に使われている「10」がOnになります。On自体はドメインの内側にないことに注意が必要です。
 境界の逆側すぐそばにある「11」がOffになります。
 ドメインの内側にあるもののうち、On/Offを除く12以上の自然数がInになります。
 ドメインの外側にあるもののうち、On/Offを除く9以下の自然数がOutになります。

ドメインが「自然数n=10」である場合

03

 ドメインの定義に使われている「10」がOnになります。
 この場合、隣り合うドメインは、10の右と左の両側にあるので、境界の逆側すぐそばにある「9」と「11」がOffになります。
 ドメインの内側にある10がInになりそうですが、Onに該当する値はInから除かれるので、この場合Inはありません。
 ドメインの外側にあるもののうちOn/Offを除く、8以下の自然数と12以上の自然数がOutになります。

各要素の関係

 On/Off/In/Out、ドメインの開閉、ドメインの内外で、単純には組み合わせが16パターンありそうですが、以下の制約があるために実際には8パターンしか現れません。

  1. 開いている ∧ On ⇒ 当該ドメイン外*2
  2. 開いている ∧ Off ⇒ 当該ドメイン内
  3. 閉じている ∧ On ⇒ 当該ドメイン内
  4. 閉じている ∧ Off ⇒ 当該ドメイン外
  5. In ⇒ ドメイン内
  6. Out ⇒ ドメイン外

 Boris Beizerさんはこの2個目と4個目を、「COOOOI (Closed Off Outside, Open Off Inside)」と称しているそうです。

ドメインの内外と、クラスの有効無効

 さて、ここまで「有効同値クラス」「無効同値クラス」という言葉を使っていません。最初の例がもし、「10以上の自然数のみを受け入れる」というものであれば、9以下の自然数は無効クラスになります。よってドメイン内は有効同値クラスに相当し、ドメイン外は無効同値クラスに相当することになります。

 一方、「10歳以上は有料とする」という仕様を対象にするテストであれば、10以上も9以下も有効同値クラスです。この閉じた境界仕様で「9歳」はOffにあたりますが、無効同値クラスではありません。
 ドメインの内外と、クラス有効無効を混同しないというのも注意点の1つかなと思います。

コープランドさんの定義

 さて、コープランド本も確認しておきましょう。

はじめて学ぶソフトウェアのテスト技法

はじめて学ぶソフトウェアのテスト技法

 On/Off、In/Outは以下のように定義されています。

  • Onポイント 境界上の値
  • Offポイント 境界上になく境界に隣接する値
  • Inポイント すべての境界条件を満たすが境界上にはない値
  • Outポイント いずれの境界条件も満たさない値

 ドリル本と、Offの定義が違うように見えませんか?

  • Off Onポイントに対して境界値分析をしたときに見つかる隣接したもう一つの境界値

 ドリル本では、Offを「もう一つの境界値」としている。コープランド本では、Offを「境界上にない」としている。
 この違いはどこから生まれるのかいろいろ考えたのですが、「境界」に対するイメージの違いなのかなと解釈しています。

 ドリル本だと、境界はこの斜線部分の両端です。物理的なパーティションと同じように厚みがあり、その表面がそれぞれ「境界」です。

04

 コープランド本だと、境界はあくまで「10」上の、厚みのないものです。よってOffは境界上にないことになります。

05

 この例ではnを自然数としていますが、値が連続値の場合はどうなるでしょう。パーティションの厚さはどんどん薄くなり、最終的には、そして数学的にはゼロになりそうです。

 ソフトウェアの場合はどうでしょう。
 精度が無限に高いということはなく、どこかの桁で止まることになります。パーティションは有限の厚さ(ドリル本でいう「d」にあたる)を持つことになります。と考えると、イメージとしてはドリル本の定義の方がしっくりくるように思います。

 同値分割に関する湯本さんの記事に、以下のようなお話がありました。

境界値に仕切り板は1枚なはずですが、同値クラスの箱で考えると隣接する複数の仕切り板があるように考えられてしまいます。けど、そんなことテストケースの洗い出しで考えられないです。仕様からちゃんと境界値、つまりOnPointを分析しなければならないのはそう言う理由だと思います。

 この「複数の仕切り板」というのが、「有限の厚みをもつ壁の両端」に当たるのではないかなあと思います。

*1:この記事は、以下のスレッドなどで秋山さんや辰巳さん に教えていただいたことを自分なりに表現したものです。いつもありがとうございます。

*2:ドリル本では「隣接ドメイン内」と呼んでいます。