Параметризованные тесты с @CsvSource и @MethodSource
Запускайте один и тот же тест с несколькими наборами входных данных, используя @ParameterizedTest, @CsvSource и @MethodSource.
«Параметризованные тесты с @CsvSource и @MethodSource» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Зачем нужны параметризованные тесты?
Запуск одной и той же логики теста с несколькими наборами входных данных выявляет крайние случаи без копирования методов теста. JUnit 5 изначально поддерживает параметризованные тесты с помощью @ParameterizedTest.
@ValueSource: Простые тесты с одним значением
@ValueSource предоставляет один параметр заданного типа. Тест запускается один раз для каждого значения.
@ParameterizedTest
@ValueSource(strings = {"", " ", "\t"})
void blank_strings_are_rejected(String input) {
assertThrows(IllegalArgumentException.class, () -> validator.validate(input));
}@CsvSource: Несколько параметров непосредственно в тесте
@CsvSource предоставляет строки значений, разделенных запятыми. Каждая строка — отдельный запуск теста. Используйте одинарные кавычки, чтобы экранировать запятые в строковых значениях.
@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 для разделителей из нескольких символов или если данные содержат запятые. Используйте nullValues, чтобы сопоставить специальную строку со значением null.
@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>. Каждый вызов Arguments.of() — это отдельный запуск теста. Используйте этот вариант для сложных объектов.
@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: Проверка всех значений перечисления
@EnumSource запускает тест один раз для каждой константы перечисления. Используйте 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 и пустой строкой. Объедините @ValueSource с помощью @NullSource и @EmptySource или используйте объединенную аннотацию @NullAndEmptySource.
@ParameterizedTest
@NullAndEmptySource
void null_and_empty_are_invalid(String input) {
assertFalse(validator.isValid(input));
}Пользовательские отображаемые имена
Используйте name в @ParameterizedTest, чтобы задать формат отображаемого имени теста. Доступные подстановки: {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 для сложных объектов, @EnumSource для всех значений перечисления и @NullAndEmptySource для крайних случаев со значениями null и пустыми строками. Пользовательские имена с помощью name= улучшают читаемость тестов.
Часто задаваемые вопросы
Урок «Параметризованные тесты с @CsvSource и @MethodSource» бесплатный?
Да — полный текст урока «Параметризованные тесты с @CsvSource и @MethodSource» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Параметризованные тесты с @CsvSource и @MethodSource»?
Запускайте один и тот же тест с несколькими наборами входных данных, используя @ParameterizedTest, @CsvSource и @MethodSource. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Параметризованные тесты с @CsvSource и @MethodSource»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Параметризованные тесты с @CsvSource и @MethodSource
- Mockito: продвинутые возможности — перехватчики аргументов и шпионы
- Срезы тестирования Spring Boot: @WebMvcTest и @DataJpaTest
- Testcontainers: интеграционные тесты с реальной базой данных