JavaRush /Курси /Модуль 3. Java Professional /Параметризовані тести у Junit

Параметризовані тести у Junit

Модуль 3. Java Professional
Рівень 3 , Лекція 4
Відкрита

1. Анотація @ParameterizedTest

Іноді просто хочеться викликати тест кілька разів із різними параметрами: різні значення, різні вхідні параметри, різні імена користувачів. JUnit прагне спростити тобі життя, тому на цей випадок у нього є така річ як параметризовані тести.

Для використання параметризованих тестів треба додати ще одну залежність до твого pom.xml:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.8.2</version>
    <scope>test</scope>
</dependency>

Після цього можемо розглянути приклад:


@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethod(int argument) {
    //test code
}

@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

Кожен тестовий метод викликається по 3 рази і при кожному виклику до нього передається черговий параметр. Значення встановлюються за допомогою іншої анотації – @ ValueSource. Але про неї треба розповісти докладніше.

2. Анотація @ValueSource

Анотація @ValueSource чудово підходить для роботи з примітивами та літералами. Просто перерахуй значення параметра через кому, і тест викличеться по одному разу для кожного значення.


@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
    //test code
}

Але є і мінус – ця анотація не підтримує null, отже потрібно буде використовувати спеціальний костиль – @ NullSource. Виглядає це так:


@ParameterizedTest
@NullSource
void testMethodNullSource(Integer argument) {
    assertTrue(argument == null);
}

3. Анотація @EnumSource

Також є спеціальна анотація @EnumSource, яка передає до методу всі значення певного Enum. Її застосування виглядає так:


enum Direction {
    EAST, WEST, NORTH, SOUTH
}

@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
    assertNotNull(d);
}

4. Анотація @MethodSource

А яким чином передавати об'єкти як параметри? Особливо якщо вони мають складний алгоритм побудови. Для цього можна просто вказати спеціальний допоміжний метод, який повертатиме список (Stream) з таких значень.

Приклад:


@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
    assertNotNull(argument);
}

static Stream<String> argsProviderFactory() {
    return Stream.of("один", "два",  "три");
}

5. Параметризовані тести з кількома аргументами

А якщо в метод хочеться передати кілька параметрів? Для цього є дуже класна анотація @CSVSource. Вона дозволяє перерахувати значення параметрів методу просто через кому.

Приклад:


@ParameterizedTest
@CsvSource({
    "alex, 30, Програміст, Працює",
    "brian, 35, Тестувальник, Працює",
	"charles, 40, Менеджер, Перевіряє"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
	//код методу
}
Коментарі (2)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Денис Рівень 111 Expert
22 вересня 2023
@CSVSource і @ValueSource. Яка різниця між ними?
Артем Рівень 64 Expert
27 грудня 2023
Анотація @ValueSource підставляє значення до тесту з одним аргументом, коли @CsvSource підставляє значення до тесту з декількома аргументами