Javaの単体テストで境界値を確認するには?条件分岐のテストケースを作る考え方

本記事は、Schooの「Java入門 中級【2026年版】」第3回「単体テストによるビジネスロジック検証」を学ぶ前後に、Javaの単体テストで境界値をどう考えるかを整理したい方向けの記事です。
JUnitの書き方を覚えても、「どの値をテストすればいいのか」が曖昧なままだと、肝心な条件の間違いを見逃すことがあります。この記事では、会員ランク判定を例に、境界値をテストケースに落とし込む流れを見ていきます。
Schoo コースページ:Java入門 中級【2026年版】
境界値とは条件が切り替わる値のこと
境界値とは、条件の結果が切り替わる値です。たとえば「5000円以上ならSILVER」という要件では、4999 と 5000 の間で結果が変わります。
このような分かれ目は、プログラムの条件式を間違えやすい場所です。>= と書くべきところを > と書いてしまうと、5000 ちょうどの結果が変わってしまいます。
日本語の要件からテストケースを作る
ここでは、次の要件を例にします。
購入金額が10000円以上ならGOLD、5000円以上ならSILVER、それ以外ならBRONZEを返す。購入金額が0円未満の場合は例外とする。
この要件を見たら、まず条件が切り替わる値を探します。今回の分かれ目は 0、5000、10000 です。
テストケース表に整理する
境界値をテストするときは、いきなりコードを書くよりも、入力値と期待する結果を表にします。
| 確認したいこと | 入力値 | 期待する結果 | JUnitで使う確認 |
|---|---|---|---|
| 0未満は受け付けない | -1 | 例外 | assertThrows |
| 5000未満はBRONZE | 4999 | BRONZE | assertEquals |
| 5000以上はSILVER | 5000 | SILVER | assertEquals |
| 10000未満はSILVER | 9999 | SILVER | assertEquals |
| 10000以上はGOLD | 10000 | GOLD | assertEquals |
この表では、4999 と 5000、9999 と 10000 を分けて確認しています。これにより、「以上」と「未満」の解釈がプログラム上で正しく表現されているかを確認できます。
テスト対象のコード例
会員ランクを判定するクラスは、たとえば次のように書けます。
class MemberRankModel {
String judgeRank(int amount) {
if (amount < 0) {
throw new IllegalArgumentException("購入金額は0円以上で指定してください。");
}
if (amount >= 10000) {
return "GOLD";
}
if (amount >= 5000) {
return "SILVER";
}
return "BRONZE";
}
}
このコードでは、先に 10000 以上を判定し、そのあと 5000 以上を判定しています。順番を逆にすると、10000 も先に 5000 以上として扱われてしまうためです。
JUnitコードにする
テストケース表をJUnitコードにすると、次のようになります。
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
class MemberRankModelTest {
@Test
void testJudgeRankReturnsBronzeWhenAmountIs4999() {
MemberRankModel model = new MemberRankModel();
String actual = model.judgeRank(4999);
assertEquals("BRONZE", actual);
}
@Test
void testJudgeRankReturnsSilverWhenAmountIs5000() {
MemberRankModel model = new MemberRankModel();
String actual = model.judgeRank(5000);
assertEquals("SILVER", actual);
}
@Test
void testJudgeRankReturnsSilverWhenAmountIs9999() {
MemberRankModel model = new MemberRankModel();
String actual = model.judgeRank(9999);
assertEquals("SILVER", actual);
}
@Test
void testJudgeRankReturnsGoldWhenAmountIs10000() {
MemberRankModel model = new MemberRankModel();
String actual = model.judgeRank(10000);
assertEquals("GOLD", actual);
}
@Test
void testJudgeRankThrowsExceptionWhenAmountIsNegative() {
MemberRankModel model = new MemberRankModel();
IllegalArgumentException exception = assertThrows(
IllegalArgumentException.class,
() -> model.judgeRank(-1)
);
assertEquals("購入金額は0円以上で指定してください。", exception.getMessage());
}
}
境界値のテストでは、値の選び方が重要です。3000 や 7000 だけを確認しても、5000 ちょうどの判定が正しいかは分かりません。
境界値を確認すると見つけやすいミス
境界値をテストすると、次のようなミスに気づきやすくなります。
>=と書くべきところを>と書いている<と<=の意味を取り違えている- 条件分岐の順番が間違っている
- 異常値を受け付けてしまっている
特に、金額、点数、年齢、在庫数、購入回数のような数値条件では、境界値の確認が重要です。
確認問題
次の仕様から、テストすべき境界値を考えてください。
点数が80点以上ならA、60点以上ならB、それ以外ならCを返す。点数が0未満または100を超える場合は例外とする。
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
まとめ
- 境界値は条件の結果が切り替わる値
- 「以上」「未満」「以下」「超える」が出てきたら境界値を確認する
- JUnitを書く前に、入力値と期待する結果を表にすると考えやすい
- 境界値の確認は、条件式の書き間違いや分岐順のミスを見つける助けになる