入力範囲の境界付近の値を重点的にテストする技法。
限界値分析(境界値分析)とは、入力範囲の「ふち(境界)」付近の値を重点的にテストする技法です。仕様だけからテストを設計するブラックボックステストの一種で、同値分割と並んでよく使われます。
身近な例で考えると、遊園地の身長制限に似ています。「身長120cm以上で乗れる」という乗り物は、119cm・120cm・121cm のように境目の前後で「乗れる/乗れない」が変わります。トラブルが起きやすいのはまさにこの境目なので、そこを念入りに確認するわけです。
上のツールで▶ボタンを押すと、「1〜100を有効とする入力」の下限・上限の境界を見つけ、その前後の「0・1・100・101」をテスト値に選ぶ流れを確認できます。
バグは範囲の真ん中ではなく、境界(ふち)に集中して発生します。理由は、プログラムを書くときに境界の扱いを間違えやすいからです。代表的な間違いは次の2つです。
・不等号の取り違え:「<(未満)」と「<=(以下)」を書き間違える
・1つずれ(オフバイワン):「100まで」を「99まで」や「101まで」と1つずらしてしまう
上のコードのように、不等号を1つ間違えるとちょうど境界の値「1」だけが誤った扱いになります。真ん中の「50」をいくら試してもこのバグは見つかりません。だからこそ境界のすぐ内側・すぐ外側の値を狙ってテストするのが効果的なのです。
限界値分析は単独でも使えますが、同値分割(=入力を同じ結果のグループに分け代表値でテストする技法)とセットで使うのが定番です。役割が補い合うからです。
| 項目 | 同値分割 | 限界値分析 |
|---|---|---|
| 狙う場所 | 各クラスの代表(中央) | クラスの境界(ふち) |
| 役割 | 広くもれなくカバー | 危険な境目を重点防御 |
| 例の値 | -5・50・110 | 0・1・100・101 |
同値分割で「どこに境界があるか」を見つけ、その境界の前後を限界値分析で狙う、という流れが基本です。同値分割が入力全体を広くカバーし、限界値分析が一番危険な境目を守る。この2つを組み合わせることで、少ないテスト数で見落としの少ない検証ができます。上のツールでは、同値分割の代表値とは別に、境界4点を狙う様子を確認できます。
プログラムで「範囲の条件」を書くとき、境界の扱いを1文字間違えやすいという事実があります。これが境界にバグが集中する理由です。
たとえば「1以上100以下を有効にする」という仕様をプログラムに書くとき、次のような間違いがよく起きます。
・「<(未満)」と「<=(以下)」の取り違え:1 <= x と書くべきところを 1 < x と書いてしまうと、ちょうど x = 1 のときだけ誤って無効扱いになる
・1つずれ(オフバイワン):「100まで」のつもりで x < 100(100未満)と書いてしまい、 x = 100 が無効になる
このような間違いは範囲の「まん中の値(例: 50)」を試しても絶対に見つかりません。50 を入れればどちらの書き方でも「有効」と返ってくるからです。だからこそ境界の前後(0・1・100・101)を必ず試すのが限界値分析の考え方です。
| 場所 | テスト値 | 何を確かめるか |
|---|---|---|
| 下限の1つ外(無効) | 0 | 有効範囲より小さい入力がエラーになるか |
| 下限ぴったり(有効) | 1 | 一番小さい有効値が正しく受け入れられるか |
| 上限ぴったり(有効) | 100 | 一番大きい有効値が正しく受け入れられるか |
| 上限の1つ外(無効) | 101 | 有効範囲より大きい入力がエラーになるか |
限界値分析では、境界のすぐ内側と外側の合計4点を選ぶのが基本パターンです。「1〜100が有効」なら、下限まわりで 0・1、上限まわりで 100・101 の4つです。これにより、「境界より小さいとエラーになるか」「境界ぴったりは有効か」「境界の1つ外は無効か」の3パターンをすべて確認できます。
上のインタラクティブツールを▶で動かすと、この4点が順番に選ばれる様子を確認できます。境界の前後を試すことで、まん中だけをテストするよりも少ない回数で多くの種類のバグを発見できます。