0Pricing
Java Academy · Урок

Параметризованные тесты с @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 — локальная установка не требуется.

Все уроки этого курса

  1. Параметризованные тесты с @CsvSource и @MethodSource
  2. Mockito: продвинутые возможности — перехватчики аргументов и шпионы
  3. Срезы тестирования Spring Boot: @WebMvcTest и @DataJpaTest
  4. Testcontainers: интеграционные тесты с реальной базой данных
← Назад к Java Academy