3. 嵌套测试的演示代码如下: package com.bolingcavalry.advanced.service.impl; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest @Slf4j @DisplayName("嵌套测试演示") public class NestedTest { @Nested @DisplayName("查找服务相关的测试") class FindService { @Test void findByIdTest() {} @Test void findByNameTest() {} } @Nested @DisplayName("删除服务相关的测试") class DeleteService { @Test void deleteByIdTest() {} @Test void deleteByNameTest() {} } }
上述代码执行结果如下,可见从代码管理再到执行和结果展示,都被分组管理了:
动态测试(Dynamic Tests)之前咱们写的测试方法,主要是用@Test修饰,这些方法的特点就是在编译阶段就已经明确了,在运行阶段也已经固定;
JUnit5推出了另一种类型的测试方法:动态测试(Dynamic Tests),首先,测试方法是可以在运行期间被生产出来的,生产它们的地方,就是被@TestFactory修饰的方法,等到测试方法被生产出来后再像传统的测试方法那样被执行和结果展示;
下面是演示代码,testFactoryTest方法被@TestFactory修饰,返回值是Iterable类型,里面是多个DynamicTest实例,每个DynamicTest实例代表一个测试方法,因此,整个DynamicDemoTest类中有多少个测试方法,在编译阶段是不能确定的,只有在运行阶段执行了testFactoryTest方法后,才能根据返回值确定下来:
package com.bolingcavalry.advanced.service.impl; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.springframework.boot.test.context.SpringBootTest; import java.util.Arrays; import static org.junit.jupiter.api.DynamicTest.dynamicTest; @SpringBootTest @Slf4j class DynamicDemoTest { @TestFactory Iterable<org.junit.jupiter.api.DynamicTest> testFactoryTest() { DynamicTest firstTest = dynamicTest( "一号动态测试用例", () -> { log.info("一号用例,这里编写单元测试逻辑代码"); } ); DynamicTest secondTest = dynamicTest( "二号动态测试用例", () -> { log.info("二号用例,这里编写单元测试逻辑代码"); } ); return Arrays.asList(firstTest, secondTest); } }上述代码的执行结果如下,可见每个DynamicTest实例就相当于以前的一个@Test修饰的方法,会被执行和统计:
多线程并发执行(Parallel Execution)的介绍《JUnit5学习》系列的最后,咱们来看一个既容易理解又实用的特性:多线程并发执行(Parallel Execution)
JUnit5中的并发执行测试可以分为以下三种场景:
多个测试类,它们各自的测试方法同时执行;
一个测试类,里面的多个测试方法同时执行;
一个测试类,里面的一个测试方法,在重复测试(Repeated Tests)或者参数化测试(Parameterized Tests)的时候,这个测试方法被多个线程同时执行;
多线程并发执行(Parallel Execution)实战前面介绍了多线程并发执行有三种场景,文章篇幅所限就不逐个编码实战了,就选择第三种场景来实践吧,即:一个测试类里面的一个测试方法,在重复测试时多线程并发执行,至于其他两种场景如何设置,接下来的文中也会讲清楚,您自行实践即可;
首先是创建JUnit5的配置文件,如下图,在test文件夹上点击鼠标右键,在弹出的菜单选择"New"->"Directory":
弹出的窗口如下图,双击红框位置的"resources",即可新建resources目录:
在新增的resources目录中新建文件junit-platform.properties,内容如下,每个配置项都有详细的说明:
# 并行开关true/false junit.jupiter.execution.parallel.enabled=true # 方法级多线程开关 same_thread/concurrent junit.jupiter.execution.parallel.mode.default = same_thread # 类级多线程开关 same_thread/concurrent junit.jupiter.execution.parallel.mode.classes.default = same_thread # 并发策略有以下三种可选: # fixed:固定线程数,此时还要通过junit.jupiter.execution.parallel.config.fixed.parallelism指定线程数 # dynamic:表示根据处理器和核数计算线程数 # custom:自定义并发策略,通过这个配置来指定:junit.jupiter.execution.parallel.config.custom.class junit.jupiter.execution.parallel.config.strategy = fixed # 并发线程数,该配置项只有当并发策略为fixed的时候才有用 junit.jupiter.execution.parallel.config.fixed.parallelism = 5