- 対象: 初学者
-
TL;DR: 境界(端)にバグは集まる。
min-1, min, min+1, max-1, max, max+1
をまず押さえよう。列挙型は同値分割でOK。
境界値分析とは?
入力の有効範囲と無効範囲の“境目”に焦点を当て、境目付近だけを少ないケースで効率よくテストする手法です。通常は同値分割とセットで使います。
基本の3ステップ
-
入力条件と範囲を明文化
例: 年齢は 18〜65(両端含む)、パスワード長は 8〜20(両端含む)。 -
境目を特定(含む/含まないを必ず確認)
連続範囲なら以下の6点を優先:
min-1, min, min+1, max-1, max, max+1
-
最小ケースで回す → 必要に応じて組み合わせ
まずは各入力を単独で境界テスト。複数入力は後でペアワイズ等を追加。
最小セット例(連続範囲)
仕様 | 範囲の意味 | テスト値セット |
---|---|---|
年齢 18〜65(含む) | 18 ≤ age ≤ 65 |
17, 18, 19, 64, 65, 66 |
PW長 8〜20(含む) | 8 ≤ len ≤ 20 |
7, 8, 9, 19, 20, 21 |
予約日 今日+1〜+30(含む) | +1 ≤ d ≤ +30 |
今日, +1, +2, +29, +30, +31 |
列挙型(例: 色 = 赤/青/緑)には“連続した境界”がないため、同値分割で各グループ代表値を1つずつ選べば十分。
よくある落とし穴
-
<
と≤
の取り違え(両端を「含む/含まない」を仕様で明記) -
空/Null、空白、極端値(
0
, 最大桁, 文字数0 など)を見落とす - 数値型/丸め/オーバーフロー(int/float、桁あふれ、指数表記)
- 日付・時刻の境界(日付変更、月末、うるう年、タイムゾーン)
- UIは通ってもAPI/DB層で弾かれる/通ってしまう不整合
チェックリスト(コピペ運用推奨)
- 入力の範囲と含む/含まないを明文化した
-
min-1, min, min+1, max-1, max, max+1
をすべて選んだ - 空/Null/空白/極端値(0、最大桁、最長長さ 等)を含めた
- 型/丸め/オーバーフローの観点を含めた
- 日付・時刻/タイムゾーンの切り替わりを含めた
- 複数入力はまず単独 → 必要なら組み合わせ(ペアワイズ等)
テストケース表テンプレ(Markdown)
### 仕様:年齢は18〜65(両端含む)
| No | 入力(age) | 期待結果 | 根拠/備考 |
|---:|---:|---|---|
| 1 | 17 | エラー | min-1 |
| 2 | 18 | 成功 | min |
| 3 | 19 | 成功 | min+1 |
| 4 | 64 | 成功 | max-1 |
| 5 | 65 | 成功 | max |
| 6 | 66 | エラー | max+1 |
日付・時刻の“典型境界”スニペット
- 日付: 前日23:59:59、当日00:00:00、月末/翌月初、うるう日(2/29)
- 時刻: 59→00の繰り上がり、夏時間/冬時間開始・終了点
- 期間: 開始=終了(ゼロ長)、開始>終了(異常)、上限ちょうど、上限+1日
まとめ
- 境界にバグは集まる。まずは 6点セット(
min±1, max±1
含む)で最小コスト最大効果。 - 列挙型は同値分割、連続範囲は境界値分析。役割を混ぜないのがコツ。
- チェックリストを使って漏れを定常的に防止しましょう。