Автор оригинала: Pankaj Kumar.
Параметризованные тесты JUnit позволяют нам запускать метод тестирования несколько раз с разными аргументами. JUnit 5 предоставляет множество способов передачи параметров в метод тестирования.
Параметризованные тесты JUnit
Нам нужна дополнительная зависимость для использования параметризованных тестов в наших тестовых случаях.
org.junit.jupiter junit-jupiter-params 5.2.0 test
Мы должны использовать @ParameterizedTest
с методом тестирования вместо общей @Test
аннотации.
Мы также должны предоставить источник, который будет генерировать аргументы для метода. Существует множество типов источников, которые мы можем определить и использовать в наших параметризованных методах тестирования.
Параметризованный тест JUnit с @ValueSource
Это самая простая форма параметризованного теста, мы можем использовать @ValueSource
для передачи массива аргументов. Мы можем передавать массив примитивных типов данных, массив строк или массив классов, используя аннотацию источника значений.
@ParameterizedTest @ValueSource(ints = { 1, 2, 3 }) void test_ValueSource(int i) { System.out.println(i); } @ParameterizedTest @ValueSource(strings = { "1", "2", "3" }) void test_ValueSource_String(String s) { assertTrue(Integer.parseInt(s) < 5); }
JUnit @ПараметризоваНный тест с @EnumSource
@EnumSource
позволяет нам передавать перечисления в наши методы тестирования.
@ParameterizedTest @EnumSource(ElementType.class) void test_EnumSource(ElementType et) { System.out.println(et); }
Если нам нужны только определенные значения из перечисления, мы можем сделать это с помощью параметра Имя источника перечисления.
@ParameterizedTest @EnumSource(value = ElementType.class, names = { "TYPE", "METHOD", "FIELD" }) void test_EnumSource_Extended(ElementType et) { assertTrue(EnumSet.of(ElementType.FIELD, ElementType.TYPE, ElementType.METHOD).contains(et)); }
JUnit @ПараметризоваНный тест с @MethodSource
Мы можем использовать @MethodSource
для указания заводского метода для тестовых аргументов. Этот метод может присутствовать в том же классе или в любом другом классе. Заводской метод должен быть статическим и возвращать поток, Итератор, Итерируемый или массив элементов.
@ParameterizedTest @MethodSource("ms") void test_MethodSource(String s) { assertNotNull(s); } static Streamms() { return Stream.of("A", "B"); }
Мы также можем использовать источник метода для передачи нескольких параметров методу тестирования. В этом случае нам придется использовать Аргументы
API. Давайте определим отдельный класс с исходным кодом заводского метода.
package com.journaldev.parameterizedtests; import java.util.stream.Stream; import org.junit.jupiter.params.provider.Arguments; public class MethodSources { public static StreammsMP() { return Stream.of(Arguments.of(1, "A"), Arguments.of(2, "B"), Arguments.of(3, "C")); } }
Соответствующий параметризованный метод тестирования JUnit будет определен как:
@ParameterizedTest @MethodSource("com.journaldev.parameterizedtests.MethodSources#msMP") void test_MethodSource_MultipleParams(int i, String s) { assertTrue(4 > i); assertTrue(Arrays.asList("A", "B", "C").contains(s)); }
Источник метода JUnit очень похож на аннотацию TestNG dataProvider.
JUnit @ПараметризоваНный тест с @CsvSource
Мы также можем передавать значения CSV в метод тестирования. Мы можем указать разделитель для нескольких аргументов в методе тестирования.
@ParameterizedTest @CsvSource(delimiter='|', value= {"1|'A'","2|B"}) void test_CsvSource(int i, String s) { assertTrue(3 > i); assertTrue(Arrays.asList("A", "B", "C").contains(s)); }
Параметризованный тест JUnit с CSV-файлом
Мы можем использовать @CsvFileSource
аннотацию для передачи CSV-данных из файла в параметризованный метод тестирования. Мы можем пропустить строки заголовка и также определить наш пользовательский разделитель.
Допустим, у нас есть код страны.csv
файл, определенный как:
Country,TelephoneCode USA,1 India,91
Вот метод тестирования, в котором данные CSV-файла будут использоваться для сопоставления аргументов.
@ParameterizedTest @CsvFileSource(resources = "/country_code.csv", numLinesToSkip = 1) void test_CsvFileSource(String country, int code) { assertNotNull(country); assertTrue(0 < code); }
Параметризованные тесты JUnit с объектами
До сих пор мы использовали примитивы и строки в наших примерах, но в реальной жизни нам чаще всего приходится передавать объекты. Мы можем использовать @MethodSource
для достижения этой функциональности.
Допустим, у нас есть класс книг, определенный как:
class Book { private String title; // standard getter setters public Book(String t) { this.title = t; } @Override public String toString() { return title; } }
Теперь мы можем передать объект книги в наши методы тестирования, используя приведенный ниже заводской метод.
static Book[] mpBooks() { return new Book[] {new Book("Harry Potter"), new Book("Five Point Someone")}; } @ParameterizedTest @MethodSource("mpBooks") void test_MethodSource_Objects(Book b) { assertNotNull(b.getTitle()); }
Обратите внимание, что на этот раз я возвращаю массив книг, ранее я возвращал поток элементов.
Проверка Аргументов Параметризованных тестов JUnit
Если вы запускаете тестовые случаи через Eclipse, вы можете проверить аргументы метода, чтобы убедиться, что в параметризованные тесты передаются правильные значения.
Методы тестирования JUnit Преобразование аргументов
JUnit обеспечивает встроенную поддержку многих преобразователей типов. Некоторые из них являются объектами типа int-long, строка-логическое значение и наоборот, строка-перечисление, объекты даты и времени. Приведенный ниже код также будет работать, и JUnit автоматически вызовет наш конструктор класса Book для преобразования строковых значений в объект Book.
@ParameterizedTest @ValueSource(strings = {"Harry Potter", "Hamlet"}) void test_ValueSource_Objects(Book b) { assertNotNull(b.getTitle()); }
Однако это может привести к ошибкам при выполнении тестовых случаев, если изменится конструктор класса нашей книги. Лучше использовать исходный код метода и предоставить наш собственный механизм создания объекта.
Резюме
Параметризованные тесты JUnit были крайне необходимой функцией, и приятно видеть так много вариантов предоставления аргументов для наших методов тестирования.