JUnit 5动态测试– @ TestFactory,DynamicTest
时间:2020-02-23 14:35:24 来源:igfitidea点击:
结合DynamicTest
的JUnit @TestFactory注释可用于创建测试工厂方法。
JUnit动态测试
JUnit @TestFactory方法不得为私有或者静态。
这些方法必须返回" DynamicNode"实例的Stream,Collection,Iterable或者Iterator。
@TestFactory返回的任何Stream都可以通过调用stream.close()来正确关闭,从而可以安全地使用Files.lines()这样的资源作为流的初始源。
" DynamicTest"是" DynamicNode"的实现之一。
请注意,动态测试与@Test情况不同,因为动态测试不会执行@BeforeEach和@AfterEach之类的回调方法。
JUnit @TestFactory DynamicTest示例
让我们看一个使用@TestFactory和DynamicTest创建动态测试的测试工厂的简单示例。
package com.theitroad.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<DynamicTest> 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<DynamicTest> dynamicTestsExample() { List<Integer> input1List = Arrays.asList(1,2,3); List<Integer> input2List = Arrays.asList(10,20,30); List<DynamicTest> 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(); }
下图显示了上述测试方法的执行输出。
注意,我们的add方法很简单,因此在assertEquals()
中,我们使用输入变量来得出预期的输出。
如果方法很复杂,我们可以为预期的输出定义一个List并将其用于断言中。
如果我们想要复杂的测试逻辑,我们还可以定义一个自定义的Executable类。