JUnit5入门学习(三)

JUnit5入门学习(三)

接着看JUnit的写法。

测试接口与方法

在Java8中,接口里面可以定义default方法,并且有自己的默认实现,同理,在编写测试类的时候,我们可以把测试方法和生命周期方法定义在接口中或者抽象类中, @BeforeAll@AfterAll 出现在接口时,需要在测试类上声明@TestInstance(Lifecycle.PER_CLASS)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@TestInstance(Lifecycle.PER_CLASS)
interface TestLifecycleLogger {

static final Logger logger = Logger.getLogger(TestLifecycleLogger.class.getName());

@BeforeAll
default void beforeAllTests() {
logger.info("Before all tests");
}

@AfterAll
default void afterAllTests() {
logger.info("After all tests");
}

@BeforeEach
default void beforeEachTest(TestInfo testInfo) {
logger.info(() -> String.format("About to execute [%s]",
testInfo.getDisplayName()));
}

@AfterEach
default void afterEachTest(TestInfo testInfo) {
logger.info(() -> String.format("Finished executing [%s]",
testInfo.getDisplayName()));
}

}

更多完整的示例参考文档

带参数的测试

前面提到过JUnit5内置了几个对象的依赖注入,除了这种方式可以传人测试参数外,JUnit5提供了带参数的测试

1
2
3
4
5
@ParameterizedTest
@ValueSource(strings = { "racecar", "radar", "able was I ere I saw elba" })
void palindromes(String candidate) {
assertTrue(StringUtils.isPalindrome(candidate));
}

-w457

带参数的测试会执行多次,会为每个参数都测试一遍,怎么样?是不是很实用的功能

支持的参数种类有很多,这里就不一一说明,文档写的很详细

测试模版

我理解下来,这就是一个自定义的多参数化执行的测试

Demo

动态测试

动态测试的意思是在运行时生成的测试用例,听过 @TestFactory来声明这是一个动态测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@TestFactory
Stream<DynamicTest> generateRandomNumberOfTests() {

// Generates random positive integers between 0 and 100 until
// a number evenly divisible by 7 is encountered.
Iterator<Integer> inputGenerator = new Iterator<Integer>() {

Random random = new Random();
int current;

@Override
public boolean hasNext() {
current = random.nextInt(100);
return current % 7 != 0;
}

@Override
public Integer next() {
return current;
}
};

// Generates display names like: input:5, input:37, input:85, etc.
Function<Integer, String> displayNameGenerator = (input) -> "input:" + input;

// Executes tests based on the current input value.
ThrowingConsumer<Integer> testExecutor = (input) -> assertTrue(input % 7 != 0);

// Returns a stream of dynamic tests.
return DynamicTest.stream(inputGenerator, displayNameGenerator, testExecutor);
}

对于这一块我也还不是很懂,后面在看

并行执行

并行执行是通过参数配置来实现的,具体的配置方法后面再谈

1
2
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.mode.default = concurrent

总结

这一部分测试的写法相比之前常规的方式是不是好玩了一些?

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×