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