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

JUnit 5 Динамические тесты – @TestFactory, DynamicTest

Динамические тесты JUnit, Заводская аннотация тестов Unit 5, пример динамического теста JUnit Jupiter, Динамические тесты JUnit 5 против параметризованного теста, код JUnit DynamicTest.

Автор оригинала: Pankaj Kumar.

Аннотацию JUnit @TestFactory в сочетании с Динамическим тестом можно использовать для создания метода фабрики тестов.

Динамические тесты JUnit

Методы JUnit @TestFactory не должны быть частными или статическими. Эти методы должны возвращать Поток , Коллекцию , Итерируемые или Итератор экземпляров Динамического узла|/.

Любой поток , возвращаемый @TestFactory, будет правильно закрыт вызовом stream.close () , что позволит безопасно использовать такой ресурс, как Files.lines() в качестве исходного источника потока.

Динамический тест является одной из реализаций Динамического узла . Обратите внимание, что динамические тесты отличаются от @тестовых случаев, поскольку методы обратного вызова, такие как @beforeach и @afterEach, не выполняются для динамических тестов.

Пример JUnit @TestFactory DynamicTest

Давайте рассмотрим простой пример использования @TestFactory и динамического теста для создания тестовой фабрики динамических тестов.

package com.journaldev.dynamictests;

import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.DynamicTest.dynamicTest;

import java.util.Arrays;
import java.util.Collection;

import org.junit.jupiter.api.DynamicTest;
import org.junit.jupiter.api.TestFactory;
import org.junit.jupiter.api.function.Executable;

public class JUnit5DynamicTests {

	@TestFactory
    Collection dynamicTests() {
        return Arrays.asList(
            dynamicTest("simple dynamic test", () -> assertTrue(true)),
            dynamicTest("My Executable Class", new MyExecutable()),
            dynamicTest("Exception Executable", () -> {throw new Exception("Exception Example");}),
            dynamicTest("simple dynamic test-2", () -> assertTrue(true))
        );
    }
	
}

class MyExecutable implements Executable {

	@Override
	public void execute() throws Throwable {
		System.out.println("Hello World!");
	}

}

На рисунке ниже показан результат выполнения теста JUnit.

Приведенный выше пример очень прост, давайте создадим динамические тесты для пользовательского метода класса. Допустим, у нас есть служебный класс, определенный как:

public class MyUtils {

	public static int add(int x, int y) {
		return x+y;
	}
}

Вот метод заводского тестирования для вышеуказанной функции.

@TestFactory
Stream dynamicTestsExample() {
	List input1List = Arrays.asList(1,2,3);
	List input2List = Arrays.asList(10,20,30);
	
	List dynamicTests = new ArrayList<>();
	
	for(int i=0; i < input1List.size(); i++) {
		int x = input1List.get(i);
		int y = input2List.get(i);
		DynamicTest dynamicTest = dynamicTest("Dynamic Test for MyUtils.add("+x+","+y+")", () ->{assertEquals(x+y,MyUtils.add(x,y));});
		dynamicTests.add(dynamicTest);
	}
	
	return dynamicTests.stream();
}

На рисунке ниже показан результат выполнения вышеуказанного метода тестирования.

Обратите внимание, что наш метод добавления прост, поэтому в assertEquals() мы используем входные переменные для получения ожидаемого результата. Если это сложный метод, мы можем определить список ожидаемых результатов и использовать его в утверждениях. Мы также можем определить пользовательский исполняемый класс, если хотим иметь сложную логику тестирования.

Резюме

Функциональность динамических тестов JUnit 5 может быть достигнута с помощью параметризованных тестов . Кроме того, параметризованные тесты следуют стандартному жизненному циклу тестов JUnit, и для них выполняются методы @beforeach и @afterEach. В то время как жизненный цикл динамических тестов совершенно другой, и у них нет доступа к методам @beforeach и @afterEach.