Автор оригинала: 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 CollectiondynamicTests() { 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 StreamdynamicTestsExample() { 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.