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类。

