@CsvSourceと@MethodSourceによるパラメータ化テスト
@ParameterizedTest、@CsvSource、@MethodSourceを使い、複数の入力セットで同じテストを実行します。
「@CsvSourceと@MethodSourceによるパラメータ化テスト」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
パラメータ化テストを使う理由
同じテストロジックを複数の入力セットで実行すると、テストメソッドをコピーして増やさずにエッジケースを見つけられます。JUnit 5 は @ParameterizedTest によるパラメータ化テストを標準でサポートしています。
@ValueSource: 単一値の簡単なテスト
@ValueSource は、指定した型のパラメーターを 1 つ提供します。値ごとに 1 回ずつテストが実行されます。
@ParameterizedTest
@ValueSource(strings = {"", " ", "\t"})
void blank_strings_are_rejected(String input) {
assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}@CsvSource: 複数パラメーターのインライン指定
@CsvSource は、カンマ区切りの値で構成された行を提供します。各行が 1 回のテスト実行になります。文字列の値に含まれるカンマをエスケープするには、シングルクォートを使用します。
@ParameterizedTest
@CsvSource({
"Alice, 30, true",
"Bob, 17, false",
"Carol, 0, false"
})
void test_adult_check(String name, int age, boolean expectedAdult) {
User user = new User(name, age);
assertEquals(expectedAdult, user.isAdult());
}@CsvSource と delimiterString
複数文字の区切り文字を使用する場合や、データにカンマが含まれる場合は delimiterString を使用します。特別な文字列を null に変換するには nullValues を使用します。
@ParameterizedTest
@CsvSource(value = {
"Alice | 30 | ADMIN",
"Bob | 25 | USER"
}, delimiterString = "|")
void test_roles(String name, int age, String role) { ... }@CsvFileSource: 外部データファイル
クラスパス上の CSV ファイルからテストデータを読み込みます。テストコードが大量のデータで複雑になる場合に便利です。
@ParameterizedTest
@CsvFileSource(resources = "/test-data/users.csv", numLinesToSkip = 1)
void test_from_file(String name, int age, boolean expected) {
assertEquals(expected, service.isEligible(name, age));
}@MethodSource: 複雑なパラメーター
@MethodSource は、Stream<Arguments> を返す static ファクトリメソッドを呼び出します。各 Arguments.of() が 1 回のテスト実行になります。複雑なオブジェクトに使用します。
@ParameterizedTest
@MethodSource("provideOrders")
void test_total_calculation(Order order, BigDecimal expected) {
assertEquals(expected, orderService.calculateTotal(order));
}
static Stream<Arguments> provideOrders() {
return Stream.of(
Arguments.of(new Order(List.of(item(10), item(20))), BigDecimal.valueOf(30)),
Arguments.of(new Order(List.of()), BigDecimal.ZERO)
);
}@EnumSource: すべての enum 値のテスト
@EnumSource は、enum の各定数に対して 1 回ずつテストを実行します。特定の値を含めたり除外したりするには、mode と names を使用します。
@ParameterizedTest
@EnumSource(value = UserStatus.class, mode = EnumSource.Mode.EXCLUDE, names = "DELETED")
void test_active_statuses(UserStatus status) {
assertTrue(notificationService.shouldNotify(status));
}@NullAndEmptySource
null と空文字列の入力をテストするための省略記法です。@NullSource と @EmptySource を @ValueSource と組み合わせるか、統合された @NullAndEmptySource を使用します。
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}カスタム表示名
@ParameterizedTest の name を使用して、テストの表示名を整形します。プレースホルダーには {index}、{0}、{1}、{arguments} があります。
@ParameterizedTest(name = "age={1} should be adult={2}")
@CsvSource({"Alice, 30, true", "Bob, 17, false"})
void test_adult(String name, int age, boolean expected) { ... }@ArgumentsSource によるソースの組み合わせ
ArgumentsProvider を実装すると、引数の生成方法を完全にカスタマイズできます。データベース、ファイル、API などから動的にデータを取得する場合に使用します。
public class UserArgumentsProvider implements ArgumentsProvider {
public Stream<? extends Arguments> provideArguments(ExtensionContext ctx) {
return Stream.of(
Arguments.of(new User("Alice", 30)),
Arguments.of(new User("Bob", 17))
);
}
}
@ParameterizedTest
@ArgumentsSource(UserArgumentsProvider.class)
void test_user(User user) { ... }境界値のパラメータ化テスト
min-1、min、max、max+1 などの境界条件を体系的にテストします。パラメータ化テストを使うと、境界値の網羅性を読みやすく、保守しやすい形で確保できます。
@ParameterizedTest
@CsvSource({"0, false", "1, true", "100, true", "101, false"})
void test_range_boundaries(int value, boolean expected) {
assertEquals(expected, validator.isInRange(value, 1, 100));
}クイックチェック
各テスト実行の引数を返す @MethodSource の戻り値の型は何ですか?
まとめ
インラインの表形式データには @CsvSource、複雑なオブジェクトには @MethodSource、すべての enum 値には @EnumSource、null や空文字列のエッジケースには @NullAndEmptySource を使用します。name= によるカスタム名で、テストの可読性が向上します。
よくある質問
「@CsvSourceと@MethodSourceによるパラメータ化テスト」レッスンは無料ですか?
はい。「@CsvSourceと@MethodSourceによるパラメータ化テスト」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「@CsvSourceと@MethodSourceによるパラメータ化テスト」で何を学びますか?
@ParameterizedTest、@CsvSource、@MethodSourceを使い、複数の入力セットで同じテストを実行します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「@CsvSourceと@MethodSourceによるパラメータ化テスト」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- @CsvSourceと@MethodSourceによるパラメータ化テスト
- Mockito応用:ArgumentCaptorとスパイ
- Spring Bootテストスライス:@WebMvcTestと@DataJpaTest
- Testcontainers:実データベースによる統合テスト