由于实践的是同一个类同一个方法多次执行的并发,因此上述配置中,类级多线程开关和方法级多线程开关都选择了"同一个线程",也就是说不需要并发执行多个类或者多个方法,请您根据自己的需求自行调整;
关于并发策略,这里选择的是动态调整,我这里是i5-8400处理器,拥有六核心六线程,稍后咱们看看执行效果与这个硬件配置是否有关系;
接下来编写测试代码,先写一个单线程执行的,可见@Execution的值为SAME_THREAD,限制了重复测试时在同一个线程内顺序执行:
package com.bolingcavalry.advanced.service.impl; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.*; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.boot.test.context.SpringBootTest; import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest @Slf4j @TestMethodOrder(MethodOrderer.OrderAnnotation.class) class ParallelExecutionTest { @Order(1) @Execution(ExecutionMode.SAME_THREAD) @DisplayName("单线程执行10次") @RepeatedTest(value = 10,) void sameThreadTest(TestInfo testInfo, RepetitionInfo repetitionInfo) { log.info("测试方法 [{}],当前第[{}]次,共[{}]次", testInfo.getTestMethod().get().getName(), repetitionInfo.getCurrentRepetition(), repetitionInfo.getTotalRepetitions()); } }执行结果如下,可见确实是单线程:
重复测试时并发执行的代码如下,@Execution的值为CONCURRENT:
@Order(2) @Execution(ExecutionMode.CONCURRENT) @DisplayName("多线程执行10次") @RepeatedTest(value = 10,) void concurrentTest(TestInfo testInfo, RepetitionInfo repetitionInfo) { log.info("测试方法 [{}],当前第[{}]次,共[{}]次", testInfo.getTestMethod().get().getName(), repetitionInfo.getCurrentRepetition(), repetitionInfo.getTotalRepetitions()); }执行结果如下,从红框1可见顺序已经乱了,从红框2可见十次测试方法是在五个线程中执行的:
11. 最后是参数化测试的演示,也可以设置为多线程并行执行: @Order(3) @Execution(ExecutionMode.CONCURRENT) @DisplayName("多个int型入参") @ParameterizedTest @ValueSource(ints = { 1,2,3,4,5,6,7,8,9,0 }) void intsTest(int candidate) { log.info("ints [{}]", candidate); }
执行结果如下图,可见也是5个线程并行执行的:
结束语至此,《JUnit5学习》系列已经全部完成,感谢您的耐心阅读,希望这个原创系列能够带给您一些有用的信息,为您的单元测试提供一些参考,如果发现文章有错误,期待您能指点一二;
你不孤单,欣宸原创一路相伴Java系列
Spring系列
Docker系列
kubernetes系列
数据库+中间件系列
DevOps系列
欢迎关注公众号:程序员欣宸微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos