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

最終更新日

Schoo Java入門 中級 第3回 単体テストによるビジネスロジック検証

本記事は、Schooの「Java入門 中級【2026年版】」第3回「単体テストによるビジネスロジック検証」を学ぶ前後に、Javaの単体テストで境界値をどう考えるかを整理したい方向けの記事です。

JUnitの書き方を覚えても、「どの値をテストすればいいのか」が曖昧なままだと、肝心な条件の間違いを見逃すことがあります。この記事では、会員ランク判定を例に、境界値をテストケースに落とし込む流れを見ていきます。

Schoo コースページ:Java入門 中級【2026年版】

境界値とは条件が切り替わる値のこと

境界値とは、条件の結果が切り替わる値です。たとえば「5000円以上ならSILVER」という要件では、49995000 の間で結果が変わります。

このような分かれ目は、プログラムの条件式を間違えやすい場所です。>= と書くべきところを > と書いてしまうと、5000 ちょうどの結果が変わってしまいます。

図解:条件が切り替わる値をテストする
4999
5000未満
BRONZE
5000
SILVERに切り替わる
SILVER
9999
10000未満
SILVER
10000
GOLDに切り替わる
GOLD
-1
受け付けない値
例外
「以上」「未満」が出てくる仕様では、条件が切り替わる直前とちょうどの値を確認します。

日本語の要件からテストケースを作る

ここでは、次の要件を例にします。

購入金額が10000円以上ならGOLD、5000円以上ならSILVER、それ以外ならBRONZEを返す。購入金額が0円未満の場合は例外とする。

この要件を見たら、まず条件が切り替わる値を探します。今回の分かれ目は 0500010000 です。

図解:要件からテストコードまでの流れ
日本語の要件
5000以上ならSILVER。10000以上ならGOLD。0未満は例外。
テストケース表
入力値と期待する結果を並べる
JUnitコード
assertEquals(…)
assertThrows(…)
JUnitを書く前に、要件、入力値、期待結果の対応を整理すると、確認漏れに気づきやすくなります。

テストケース表に整理する

境界値をテストするときは、いきなりコードを書くよりも、入力値と期待する結果を表にします。

確認したいこと入力値期待する結果JUnitで使う確認
0未満は受け付けない-1例外assertThrows
5000未満はBRONZE4999BRONZEassertEquals
5000以上はSILVER5000SILVERassertEquals
10000未満はSILVER9999SILVERassertEquals
10000以上はGOLD10000GOLDassertEquals

この表では、49995000999910000 を分けて確認しています。これにより、「以上」と「未満」の解釈がプログラム上で正しく表現されているかを確認できます。

テスト対象のコード例

会員ランクを判定するクラスは、たとえば次のように書けます。

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());
    }
}

境界値のテストでは、値の選び方が重要です。30007000 だけを確認しても、5000 ちょうどの判定が正しいかは分かりません。

境界値を確認すると見つけやすいミス

境界値をテストすると、次のようなミスに気づきやすくなります。

  • >= と書くべきところを > と書いている
  • <<= の意味を取り違えている
  • 条件分岐の順番が間違っている
  • 異常値を受け付けてしまっている

特に、金額、点数、年齢、在庫数、購入回数のような数値条件では、境界値の確認が重要です。

確認問題

次の仕様から、テストすべき境界値を考えてください。

点数が80点以上ならA、60点以上ならB、それ以外ならCを返す。点数が0未満または100を超える場合は例外とする。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

まとめ

  • 境界値は条件の結果が切り替わる値
  • 「以上」「未満」「以下」「超える」が出てきたら境界値を確認する
  • JUnitを書く前に、入力値と期待する結果を表にすると考えやすい
  • 境界値の確認は、条件式の書き間違いや分岐順のミスを見つける助けになる

関連する記事

シェアする