1 JUnit5介绍
1.1 JUnit5简介
JUnit5作为最新版本的JUnit框架,与之前版本的Junit框架有很大的不同,由三个不同子项目的几个不同模块组成。
JUnit5 = JUnit Platform+JUnit Jupiter+JUnit Vintage。
JUnit Platform: 是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。
JUnit Jupiter: 提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部包含了一个测试引擎,用于在Junit Platform上运行。
JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。
SpringBoot 2.4 以上版本移除了默认对JUnit Vintage的依赖。如果需要兼容junit4需要自行引入以下依赖
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
使用:(1)引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
(2)在测试类上标注@SpringBootTest,在测试方法上标注@Test
@SpringBootTest
class TestDemo {
@Test
void test1() {
}
}
1.2 JUnit5常用注解
@DisplayName注解:为测试类或测试方法设置展示名称
@DisplayName("测试类")
@SpringBootTest
class MainApplicationTests {
@DisplayName("测试方法")
@Test
void contextLoads() {
System.out.println(1);
}
}
@BeforeEach注解:每个方法执行之前执行
@AfterEach注解:每个方法执行之后执行
@BeforeEach
void beforeTest() {
System.out.println("测试就要开始");
}
@AfterEach
void afterTest() {
System.out.println("测试要结束");
}
@DisplayName("测试方法")
@Test
void contextLoads() {
System.out.println(1);
}
@BeforeAll注解:所有方法执行之前执行
@AfterAll注解:所有方法执行之后执行
这两个注解的修饰的方法要用static修饰
@Disable注解:表示测试类或测试方法不执行
@Timeout注解:设置测试方法的执行时间,超过这个时间抛出异常
@Test
@Timeout(value = 5, unit = TimeUnit.DAYS)
void contextLoads() {
System.out.println(1);
}
@RepeatedTest注解:指定方法重复测试的次数
@ExtendWith注解:为测试类或测试方法提供扩展类引用
1.3 断言
断言是测试方法中的核心部分,用来对测试需要满足的条件进行验证。
简单来说,断言是检查业务逻辑返回的数据是否合理,使用断言后,所有的测试运行结束后会有一个详细的测试报告。
注意:当一个断言失败后,从该断言开始后面的所有代码都不会执行。
JUnit 5 内置的断言可以分成如下类别:
简单断言
用来对单个值进行简单的验证
数组断言
@Test
void arrayTest() {
assertArrayEquals(new int[]{1,2},new int[]{});
}
组合断言
组合断言是利用assertAll 方法组合多个断言,assertAll 方法接受多个 org.junit.jupiter.api.Executable 函数式接口的实例作为要验证的断言,当所有断言都满足的情况下才会通过,否则会返回出错的断言,
@Test
public void all() {
assertAll("Math",
() -> assertEquals(2, 1 + 1),
() -> assertTrue(1 > 0)
);
}
异常断言
当结果不抛出指定的异常时则断言失败
@Test
void exceptionTest() {
assertThrows(ArithmeticException.class,()->{int i = 10/0;},"数学运算错误");
}
超时断言
当超出定义的超时时间就会返回断言
快速失败
通过fail方法直接使测试失败
1.4 前置条件
JUnit 5 中的前置条件(又叫假设)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要,会直接跳过该方法。
@Test
void testAssumption() {
Assumptions.assumeTrue(true,"结果不是true");
}
1.5 嵌套测试
嵌套测试即测试类中还有测试类。
在嵌套测试情况下,外层的test不能驱动内层的Before(After)All(Each)方法,但是内层的test可以驱动外层的Before(After)All(Each)方法。
1.6 参数化测试
参数化测试是Junit5重要的新特性,它使得不同的参数多次运行测试成为了可能,为单元测试带来许多便利。
@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型
@NullSource: 为测试方法提供一个null的入参
@EnumSource: 为测试方法提供一个枚举入参
@CsvFileSource: 读取指定CSV文件内容作为参数化测试入参
@MethodSource: 读取指定方法的返回值作为参数化测试入参(注意方法的返回需要是一个流)
@ParameterizedTest//表明该测试方法是一个参数化测试
@ValueSource(ints = {1,2,3,4,5})
void testParameterized(int i) {
System.out.println(i);
}
static Stream<String> strings() {
return Stream.of("apple","banana");
}
@ParameterizedTest//表明该测试方法是一个参数化测试
@MethodSource("strings")
void testParameterized(String i) {
System.out.println(i);
}
2 指标监控
springboot actuator:未来每一个微服务在云上部署后,都需要对其进行监控、追踪、审计等,springboot抽取了actuato场景,使得每个微服务快速引用即可获得生产级别的应用监控、审计等功能。
使用:(1)引入actuator场景启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
(2)使用配置文件开启想要的端点
springboot有两种监控模式:JMX——默认暴露所有的endpoints(监控端点);
web——除了health和info,其他endpoints都没暴露,如果想要暴露,需要在application.yml中手动开启
management:
web:
exposure:
include: '*' # 以web的方式暴露所有的端点
(3)访问localhost:8080/actuator/端点名,来查看对应的端点