Рубрики
Без рубрики

Параметризованные тесты JUnit

Параметризованные тесты JUnit, Параметризованные тесты JUnit 5, параметры junit-jupiter, @ParameterizedTest, CsvFileSource, Аргументы, источник методов, код источника значений

Автор оригинала: 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 Stream ms() {
	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 Stream msMP() {
		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 были крайне необходимой функцией, и приятно видеть так много вариантов предоставления аргументов для наших методов тестирования.