はじめに
前回の記事では、実務で初めてテストケース作成を任された際に出会った用語として、
- 同値分割
- 境界値分析
- 最大値
- 最小値
- NULL
- 閾値
を紹介しました。
当時の私は、
「テストケースって全部の値を確認するの?」
と思っていました。
例えば年齢入力欄があった場合、
- 18歳
- 19歳
- 20歳
- 21歳
と全て確認していたら、テストケースは膨大な数になってしまいます。
そこで登場するのが、
- 同値分割
- 境界値分析
という考え方です。
今回は実際のコード例を使いながら、初心者向けに解説していきます。
今回の例
会員登録機能を考えてみます。
仕様は以下です。
年齢は18歳以上65歳以下の場合のみ登録可能
コードで表すと次のようになります。
public boolean canRegister(int age) {
return age >= 18 && age <= 65;
}
この機能をテストするとします。
まず全部テストするとどうなる?
もし全パターン確認するなら、
0歳
1歳
2歳
...
64歳
65歳
66歳
...
100歳
のように大量のテストケースが必要になります。
しかし、
18歳〜65歳の範囲であれば、どの値を入力しても結果は同じです。
そこで同値分割を使います。
同値分割とは?
同値分割とは、
同じ結果になる値をグループ化し、その中から代表値を選ぶ考え方
です。
今回の仕様を整理すると、
| 年齢 | 結果 |
|---|---|
| 18歳未満 | エラー |
| 18歳〜65歳 | 正常 |
| 66歳以上 | エラー |
となります。
つまり、
- 18歳未満グループ
- 18歳〜65歳グループ
- 66歳以上グループ
の3つに分けられます。
同値分割後のテストケース
| No | 入力値 | 期待結果 |
|---|---|---|
| 1 | 10 | エラー |
| 2 | 30 | 正常 |
| 3 | 70 | エラー |
たった3件になりました。
これが同値分割です。
しかし、これだけでは不十分
実は実務では、この3件だけではテスト不足です。
なぜなら、不具合は境界付近で発生しやすいからです。
例えば開発者が誤って、
return age > 18 && age <= 65;
と実装していたらどうでしょうか。
本来登録できるはずの18歳が登録できなくなります。
しかし、
30歳しかテストしていなければ気付けません。
そこで境界値分析を行います。
境界値分析とは?
境界値分析とは、
正常と異常が切り替わる境界を重点的に確認する考え方
です。
今回の境界は、
- 18歳
- 65歳
です。
そのため、
- 境界の1つ前
- 境界そのもの
- 境界の1つ後
を確認します。
境界値分析のテストケース
18歳付近
| 入力値 | 期待結果 |
|---|---|
| 17 | エラー |
| 18 | 正常 |
| 19 | 正常 |
65歳付近
| 入力値 | 期待結果 |
|---|---|
| 64 | 正常 |
| 65 | 正常 |
| 66 | エラー |
これが境界値分析です。
最大値・最小値との関係
実務では、
「最大値」
「最小値」
という言葉もよく出てきます。
今回の例では、
- 最小値:18
- 最大値:65
です。
つまり、
| 項目 | 値 |
|---|---|
| 最小値 | 18 |
| 最大値 | 65 |
になります。
実際には、
最小値や最大値は境界値分析の一部として扱われることが多いです。
最終的なテストケース
ここまでの内容をまとめると、
| No | 観点 | 入力値 | 期待結果 |
|---|---|---|---|
| 1 | 同値分割(異常) | 10 | エラー |
| 2 | 同値分割(正常) | 30 | 正常 |
| 3 | 同値分割(異常) | 70 | エラー |
| 4 | 境界値 | 17 | エラー |
| 5 | 境界値(最小値) | 18 | 正常 |
| 6 | 境界値 | 19 | 正常 |
| 7 | 境界値 | 64 | 正常 |
| 8 | 境界値(最大値) | 65 | 正常 |
| 9 | 境界値 | 66 | エラー |
全部の年齢を確認する代わりに、9件で重要なポイントを網羅できました。
私が最初に勘違いしていたこと
実務に入る前の私は、
「テストとは、とにかくたくさんの値を入力すること」
だと思っていました。
しかし実際は逆でした。
大切なのは、
むやみに件数を増やすことではなく、不具合が見つかりやすいポイントを選ぶこと
です。
同値分割と境界値分析は、そのための代表的な考え方でした。
おわりに
今回は、
- 同値分割
- 境界値分析
- 最大値
- 最小値
について学びました。
これらを使うことで、膨大なテストケースを効率的に整理できます。
次回は、
「NULLと空文字は何が違うのか?」
をテーマに、
実務でよく出会う入力チェックや閾値の考え方について解説したいと思います。
