テストについて学ぼう! ~第3話 同値分割法と境界値分析の組み合わせ~

第3話 同値分割法と境界値分析の組み合わせ

みなさん、こんにちは。鎌倉です。第1話で「同値分割法」、第2話では「境界値分析」をご紹介しました。今回は、ふたつの手法を組み合わせて使う方法をご紹介します。

組み合わせ可能な条件

まずは同値分割法と境界値分析を組み合わせて使うことができる条件について説明します。 条件は「同値クラスの条件を不等式の形で表現できること」なのですが、どこかで見たことのあるような条件ですよね。 そうです! 境界値分析が利用できる条件と同じなのです。

同値分割法では、同値クラスを分類する際のルールに制限はありません。 同値クラスの入力値は連続した数値である必要もなく、「東北地方の県」のように大小関係がないデータも扱えます。

これに対し、境界値分析は「年齢≧20」のように同値クラスの条件が不等式の形になっていないと扱えません。 ですから、境界値分析の方に合わせてあげる必要があるのですね。

組み合わせのメリット

同値分割法と境界値分析を組み合わせるメリットは、各同値クラスの境界値での挙動だけでなく、中間の値での挙動もテストできることです。

例えば入場料計算の処理が「6歳未満は0円、6歳以上12歳未満は100円、12歳以上は200円」という仕様だった場合、プログラムでは不等号を使って判定処理を記述します。 このとき不等号の扱いを誤ると、境界値分析のテストには合格するのに境界値以外の値で誤動作するリスクがあるのです。 上の「誤ったコードの例」では、「12歳以上」の判定処理で不等号が逆向きです。この状態で同値クラスを数直線上に表現すると、次の図のようになります。 12歳以上の正しい同値クラスは破線部分ですが、赤い線の部分が12歳以上と判定されます。 12歳未満の入場料は上のif文で処理されるため、200円と判定される年齢は12歳のみです。13歳以上の場合には入場料が設定されません。 もし同値分割法を併用して15歳のような年齢でテストを行っていれば欠陥(バグ)を発見できます。

テストケースを設計してみよう

例題

あなたは、定形郵便料金を表示するシステムのテストケースを検討しています。 仕様は次の通りです。

【システムの仕様】
封書をはかりに載せると重量を 0.1g 単位で測定される。
次のルールで判定を行い、テキストを表示する。
①重量 ≦ 0.0g の場合、「待機中」を表示
②0.0g < 重量 ≦ 25.0g の場合、「84 円」を表示
③25.0g < 重量 ≦ 50.0g の場合、「94 円」を表示
④重量 > 50.0g の場合、「定形外」を表示

同値分割法と境界値分析を組み合わせてテストする場合、いくつのテストケースが必要でしょうか。

同値クラスに分割

まずは入力値を同値クラスに分割しましょう。システムの仕様に書かれている①~④の不等式が、そのまま同値クラスの条件になりそうですね。 ②と③は定形郵便の条件に該当する有効同値クラス、①と④は無効同値クラスに該当します。

同値分割法の代表値を選定

次に同値分割法の代表値を選定しましょう。同値分割法では、各同値クラスから代表値を1つずつ選ぶ必要があるのでしたね。 それぞれの同値クラスを図で表現してみると、このようになります。

各枠内にある入力値はすべて同じ挙動になることが期待されますので、4つの同値クラスから1つずつ代表値を選びます。 ここでは、図にある数値の中から-1.0、12.5、37.5、100.0を代表値にしましょう。

代表値を選ぶ際の注意点ですが、0.1や50.0など同値クラスにギリギリ入る値とギリギリ入らない数値は選ばないようにしてください。 これらの数値は境界値分析でテストする境界値に該当しており、テストする入力値が重複しないようにする必要があるためです。

境界値分析の境界値を特定

第2話を思い出しながら、境界値分析を使って境界値を特定しましょう。 まずは仕様②に着目してみます。「84円」を表示する条件は0.0gを超えて25.0g以下の場合です。 ギリギリ範囲に入っている0.1と25.0、ギリギリ範囲に入っていない0.0と 25.1の4つを境界値としてテストする必要があります。

次は仕様③に着目します。「94円」を表示する条件は 25.0g を超えて 50.0g 以下の場合です。 ギリギリ範囲に入っている25.1と50.0、ギリギリ範囲に入っていない 25.0と50.1をテストする必要がありますよね。

ただし25.0と25.1は仕様②の分析で既に境界値としてピックアップされていますので、追加する必要のある境界値は 50.0と50.1の2つだけです。 境界値分析で特定された境界値は0.0、0.1、25.0、25.1、50.0、50.1の6つとなります。

テストケースに落とし込む

最後に、同値分割法で得られた代表値と境界値分析で得られた境界値をマージしましょう。 テストする必要がある入力値は-1.0、0.0、0.1、12.5、25.0、25.1、37.5、50.0、50.1、100.0です。 テストケースは下の表のようになります。

実践演習

さて、最後に演習をしてみましょう。基本情報処理技術者試験の問題をベースにしているので、腕試しのつもりでチャレンジしてください。

問題

(基本情報技術者試験 H28秋期 午前 問48 改題)
整数1~1,000を有効とする入力値が、1~500の場合は「不合格」の効果音を、501~1,000の場合は「合格」の効果音を再生する処理モジュールを、同値分割法と境界値分析によってテストする。 次の条件でテストするとき、テストデータの最小個数はいくつか。

【条件】
①有効同値クラス1つにつき、1つの値をテストデータとする。
 ただし、テストデータは境界値ではないものとする。
②有効同値クラス、無効同値クラスの全ての境界値をテストデータとする。

【選択肢】 ア:5個 イ:6個 ウ:7個 エ:8個

正解と解説

先ほどの郵便料金の例題とよく似ていますが、条件①を見ると「有効同値クラス1つにつき、1つの値をテストデータとする。」と書かれています。 つまり「無効同値クラスは同値分割法のテストを省略します」ということですね。 境界値分析の方については、有効同値クラスと無効同値クラスの両方をテストする必要があります。

問題の条件に従って、数直線上にテストデータをプロットしてみました。 条件①より、同値分割法のテストデータ(代表値)として、ここでは250と750を選びました。 同値クラス内の整数であれば100と900のような値でも構いません。

条件②による境界値分析のテストデータは、0、1、500、501、1000、1001の6つです。 あわせて8つのテストデータが必要なので、正解は「エ」でした。

まとめ

今回は、同値分割法と境界値分析を組み合わせて使う方法をご紹介しました。 押さえておくべきポイントは

  • 併用できる条件は「同値クラスの条件を不等式の形で表現できること」
  • 2つの技法を併用すると境界値だけでなく、中間の値での挙動もテストでき、テストの網羅性が向上する

といった点です。システム開発の現場でもテストに役立つと思いますので、ぜひ活用してみてください。

鎌倉
2010年入社、北海道札幌市出身。趣味はランニング。最近100kmリレー最速タイムのチャレンジに参加し、ギネス記録を達成したらしい。