入力空間を「同じ振る舞いをするはずのクラス」(同値クラス)に分割し、各クラスから代表値を 1 件ずつテストする技法。テストケース数を爆発させずに網羅性を担保する。
概要
「年齢」のように入力範囲が広いとき、 全ての値をテストするのは不可能 。しかし「振る舞いが同じ範囲」をクラスとして括れば、各クラスから 1 件ずつテストすれば十分とみなせる。これが同値分割の発想。
| 入力 | クラス分け |
|---|---|
| 年齢が 18 以上 65 以下なら有効 | 無効(17 以下)/ 有効(18-65)/ 無効(66 以上) |
| 商品名が 1〜100 文字 | 無効(0 文字)/ 有効(1-100)/ 無効(101 以上) |
| 注文金額が 0 円超 | 無効(0 以下)/ 有効(0 超) |
同値クラスの種類
| 種類 | 説明 | 例 |
|---|---|---|
| 有効同値クラス | 仕様上正しいとされる入力 | 年齢 = 30 |
| 無効同値クラス | 仕様上拒否される入力 | 年齢 = -1 / 200 / “abc” |
無効同値クラスも複数に分けて、各エラーパスを網羅する。
限界値分析と組み合わせる
同値分割だけでは 境界のバグ を検出できない(クラスの真ん中を 1 件テストするだけだから)。 限界値分析 と必ず組み合わせる。
同値分割: 無効(17 以下) / 有効(18-65) / 無効(66 以上)
↓
限界値分析: 17, 18, 19, 64, 65, 66 を確実にテスト
AI 駆動開発との関係
AI に「テスト書いて」と指示するだけでは、 ハッピーパス(有効クラスの中央値)ばかり 書きがち。次のように指示すると網羅性が上がる:
PriceCalculator.applyDiscount(amount) のテストを書いてください。
技法: 同値分割 + 限界値分析
有効クラス: 1 〜 1,000,000 円
無効クラス: 0 円以下 / 1,000,001 円以上 / 負数 / 小数 / null
各クラスから 1 件ずつ + 境界値(0, 1, 1000000, 1000001)を必ず含めて。
人間が 「同値クラスを設計し、AI に渡す」 ことで、AI が機械的に書いてもしっかり網羅される。
関連記事
- 開発手法ガイド:テスト技法編 — 同値分割の位置づけ
- 開発手法ガイド:TDD 編 — テスト網羅性チェックリスト