ソフトウェアテストにおいて、効率的にバグを見つけていくことは非常に重要になります。なぜなら、ほとんどの場合リソースの関係ですべてのテストを実施するのは非常に難しいからです。では、どのような方法を用いてテスト数の調整をすればよいでしょうか?
そのようなときに役立つのが、テスト技法の境界値分析です。しかし、同値分割法と考え方が似ているのでなかなか理解できないという方もいらっしゃると思います。境界値分析と同値分割法の違いを説明しつつ、特に境界値分析に焦点を当てて解説をしていきます。
境界値分析と同値分割法の考え方
境界値分析と同値分割法を理解していただくために、まずは”同値パーティション”の考え方を説明します。同値パーティションとは「同じ出力結果になる値のグループ」のことです。以下の例を使って一緒に考えていきましょう。
- 1~20までの正の整数が入力可能で、それ以外の数値は入力不可。
このシステムを数直線で表すとこのようになります。
1~20は”入力可能”という同じ出力結果を持つ値の集合なので、同値パーティションと定義できます。逆に0以下または21以上は”入力不可”という同じ出力結果を持つ値の集合なので、無効同値パーティションと定義できます。(ここでの”無効”はシステムにとっての無効を指します)「同値分割法」というテスト技法では各パーティションから代表値を1つ以上テストすることで、出力結果が違うすべてのパーティションを最低1つは確認したという保証ができます。
今回であれば、無効同値パーティションから”30”・有効同値パーティションから”15”というような値をテストすることができるでしょう。しかし、実際には離れた無効同値パーティションを1つに括らず、パーティションの塊ごとに代表値を出す場合が多いです。「境界値分析」はこの同値パーティションの考え方を用いるという点では、同値分割法と同じなのですが、「出力結果に変化が起こる境界値をテストする」ということが前提となります。境界値とは①異なる同値パーティションになる境界となる値 ②その隣にある値のペアのことです。
今回のケースであれば、下記の4つの境界値となります。
- 無効同値パーティションから同値パーティションの最初の境目になる「0と1」
- 同値パーティションの最大値から無効同値パーティションの境目になる「20と21」
すべての値をテストする場合、21以上の数字が無限にある以上膨大なテスト数になります。しかし同値分割法や境界値分析を使用するとバグを狙いながら効率よくテスト数を削減できます。
同値分割法と境界値分析を比較すると以下のようになります。
- 同値分割法では各パーティションの代表値を適当に選ぶので、境界値である必要はない
→境界値分析では必ず”境界値”をテストする - テストする値の数は境界値分析の方が多くなる傾向にある
今回の例では同値分割法を用いると最低2つまたは3つの値、境界値分析では4つの値では、境界値分析の使いどころはどこでしょうか?
テストの専門家が体系化した3つのメニューから構成された
ソフトウェアテストの教育サービス
ソフトウェア品質教育サービス「バルカレ」のご紹介
境界値分析の使いどころなんで境界値なの?
使いどころを知っていただくために、なぜ境界値を狙っていくのかを説明いたします。今までの文章にもありましたが、「以上」「以下」「まで」などの表現は同値パーティションの境界を示していますが、これらの言葉は誤って解釈される場面が多くあります。例えば、開発前に「18歳以下は未成年、それ以上は成年とする」という要件がありました。しかし、コーディングする人が「17歳までは未成年、18歳以降は成年」と誤って解釈しプログラムを作ったとします。
それぞれの内容を数直線で書いてみると、このようになります。
言葉の解釈の齟齬により赤い〇で囲った境界値が変わってしまいます。もしこの仕様を同値分割法でテストした場合、10や20などの境界値以外の値を選ぶとバグに気づくことができません。しかし、境界値分析でテストすると18の値でバグを検出できます。つまり今回のように出力結果に違いが出る場合に境界値分析の利用ができます。
例えば、ECサイトでの販売期間や商品の購入制限などさまざまです。
例B)ECサイト 購入制限に関するシステム
購入可能数は1~100まで、それ以外の数を入力時にはエラー表示
→境界値は「0,1,100,101」なのでその値をテストする
ここまでの説明で「やったー、テスト数をらくらく削減できる!」と思ったかもしれませんが、ちょっと待ってください!
テスト数は削減できればできるほどよい?
これまでは同値分割や境界値分析で、効率的なテスト削減についても焦点を当てました。しかし”削減する”という行為が必ず良いというわけではありません。なぜなら、削減するとその分バグを検出できる可能性は低くなるからです。例えば、先ほどの購入可能数を定義しているプログラムが1~100の出力結果を個別で設定している場合、すべての数が境界値になります。つまりバグがある場所はランダムに存在しています。
一般的にバグがある箇所には偏りがあるといわれていますが、ある数か所だけですべてのバグを見つけられるわけではありません。したがって、できる限り多くのバグを取り除くためにはそれ相応のテスト数が必要になります。
では、どのようなシステムにテスト数を多く見積もるべきなのでしょうか?それは「不具合があるとリスクが非常に大きくなるシステム」です。以下の図で例を示します。
このようなシステムの場合にはたった1つのバグでも致命的な損害を引き起こす可能性があります。いずれの場合も企業にとっては大損害になり、利用した人が巻き込まれる可能性が非常に高いものです。このようなシステムではできる限り多くのバグを検出する必要があるので、全数またはそれに近いテストをすることが大事になります。ここでテスト数を削減してしまうと、大きいリスクが残ったままになってしまいます。
以上の具体例だけではなく「複雑」なシステム・「新規」のシステムも多くのバグが含まれているので注意が必要です。各システムにおけるリスクや重要度を踏まえながらテスト数を調整し、重大なバグは取りこぼさないようにしましょう。
まとめ
「境界値分析とは?同値分割との違い」をテーマにして、ご説明してまいりました。テスト技法を活用することによってリソースとのバランスを取りながら効率的にテストを行うことができます。しかし、各技法の違いや目的を理解しておかないと本来の力を発揮することができません。テスト対象のシステムの重要度を踏まえながら、適切なテスト技法を用いて、品質の高い製品づくりを目指してみてはいかがでしょうか?
当サイトでは、テスト技法を学びたい方、アジャイル開発やマイグレーションのテスト手法について知りたい方、テストアウトソーシングサービスに興味のある方へ、ダウンロード資料を多数ご用意しております。ぜひダウンロードいただき、資料をご活用ください。