一、Junit5使用
Junit5测试单元。https://junit.org/junit5/
1、JUnit5介绍
SpringBoot2.4以上的版本移除了Junit vintage依赖。即2.4以上的版本就不能再使用Junit4了,如果你硬是想用的话,那就要手动添加相关依赖了。
- 引依赖的话就是这个
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
之后我们就可以在测试类面用@Autowired,@Transactional标注测试方法,测试完后自动回滚。
2、使用Junit5常用注解
(1)@Test与@DisplayName
- maven项目保持如下一致
- @Test就不用多说了
@DisplayName显示测试的类或方法
(2)@BeforeEach与@AfterEach
(3)@AfterAll与@BeforeAll
package cn.mldn.bootdata;
import org.junit.jupiter.api.*;
@DisplayName("junit5测试类")
public class Junit5Test {
@DisplayName("测试name方法")
@Test
public void SayHello() {
System.out.println("sayhello");
}
@Test
@BeforeEach
public void testBeforeEach() {
System.out.println("before");
}
@Test
@AfterEach
public void testAfterEach() {
System.out.println("after");
}
@Test
@BeforeAll
public static void testBeforeAll() {
System.out.println("所有测试都要开始不了");
}
@Test
@AfterAll
public static void testAfterAll() {
System.out.println("所有测试已经介绍了");
}
}
两个ALl的方法必须带上static修饰,因为它会被所有的调用一次。
(4)@Disabled
禁用掉某一个方法(即这个方法不参与测试)
(5)@Timeout
- 超时时间(只要你方法执行超过多长时间了就认为是错误)
(6)@SpringBootTest
此时我们要注入是不能注入的,必须要加上@SpringBootTest才可以。
(7)@Repeated
- 重复测试(重复测试多少次)
3、单元测试-断言(assertions)机制
断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件验证,这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。Junit5内置的断言可以分成如下的几个类别,所有的测试结束后,会有一个详细的测试报告。
(1)使用断言
-
使用简单断言
当然它也存在一定的问题
-
组合断言(只有所有的断言成功才可以)
是一个函数式接口,可以使用Lambda表达式。 -
还有异常断言
报错了,但是它断言成功了。 -
快速失败
(2)前置处理(assumptions)
(3)嵌套测试
JUnit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。
@DisplayName("A stack")
class TestingAStackDemo {
Stack<Object> stack;
@Test
@DisplayName("is instantiated with new Stack()")
void isInstantiatedWithNew() {
new Stack<>();
}
@Nested
@DisplayName("when new")
class WhenNew {
@BeforeEach
void createNewStack() {
stack = new Stack<>();
}
@Test
@DisplayName("is empty")
void isEmpty() {
//true
assertTrue(stack.isEmpty());
}
@Test
@DisplayName("throws EmptyStackException when popped")
void throwsExceptionWhenPopped() {
//true
assertThrows(EmptyStackException.class, stack::pop);
}
@Test
@DisplayName("throws EmptyStackException when peeked")
void throwsExceptionWhenPeeked() {
//true
assertThrows(EmptyStackException.class, stack::peek);
}
@Nested
@DisplayName("after pushing an element")
class AfterPushing {
String anElement = "an element";
/**
* 内层的可以驱动外层的,而外层的不可以驱动内层的。
*/
@BeforeEach
void pushAnElement() {
//true
stack.push(anElement);
}
@Test
@DisplayName("it is no longer empty")
void isNotEmpty() {
assertFalse(stack.isEmpty());
}
@Test
@DisplayName("returns the element when popped and is empty")
void returnElementWhenPopped() {
//true
assertEquals(anElement, stack.pop());
assertTrue(stack.isEmpty());
}
@Test
@DisplayName("returns the element when peeked but remains not empty")
void returnElementWhenPeeked() {
//true
assertEquals(anElement, stack.peek());
assertFalse(stack.isEmpty());
}
}
}
}
4、参数测试
参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。
利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。
@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型
@NullSource: 表示为参数化测试提供一个null的入参
@EnumSource: 表示为参数化测试提供一个枚举入参
@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参
@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)
- 第一个测试
- 第二个测试
- 这个以后在开发时候也会常用来测试某一个业务逻辑,在这个几个参数进来后,是否执行正常。
二、指示监控-SpringBoot Actuator与Endpoint
1、SpringBootActuator
(1)介绍
未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能
- 在每一个微服务引入如下starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
学到微服务就知道的,很有用。
(2)版本区别
(3)如何使用
- 引入上面的starter
- 访问:http://localhost:8004/actuator
还可以查看它的宕机状态
一般情况下都是释放了health与info断点的,但是此时我的info居然访问不成功
大致原因就是SpringBoot并没有暴露info端点。具体的我们可以配置。
- 我们查看我们的当前项目的监控端点
我们不能看到的原因是通过JMX方式暴露的,我们需要把它通过HTTP方式暴露即可。
- 小总结
- 导入依赖
- 以web方式暴露
2、Actuator常用端点开启与禁用
最常用的Endpoint有如下三个
- Health:监控状况
- Metrics:运行时指标
- Loggers:日志记录
(1)Health Endpoint
- 比如查看我们项目的health
具体是什么不健康呢,可以去看看后台
我们可以排除它一下DataSource的相关内容的,然后注释掉相关引用即可。
- 我们还可以配置一下
里面所有的健康才健康,不然就是返回down。
(2)Metrics Endpoint
(3)开启与禁用功能
像这种management.endpoints.enabled-by-default=true 开启比较危险,有些敏感的不想暴露的话,可以开启一些。
- 我们关闭一下试一试
我们发现只能发现一个了(就算你用jconsole也不行)
- 可以像这种分别开启
3、定制监控信息
上面它自动的检测的有很多,只有当全部都是健康状态的时候才可以,然而有些时候我们需要自定义健康状态,那我们可以如何定义呢?
(1)分析一个健康检查
磁盘检查的里面new了一个DiskSpaceHealthIndicator的,点进去看看。
他们都是有这个up的方法调用,而他们都去实现了AbstractHealthIndicator的一个抽象类。那我们要定义的话,也可以去实现这个类来定义一个监控信息组件。而且多一嘴,我们定义的类必须是XXXHealthIndicator的定义方式。
(2)实现一个组件健康检查
-
启动测试
http://localhost:8004/actuator/health
-
除了我们health可以设置外,其他的info啊,beans等都可以配置。这里用info举栗,它要实现InfoContributor
-
看看metrics的自定义
http://localhost:8004/actuator/metrics/
当用http://localhost:8004/helloTest测试后
我们就可以这样定义指标信息。
(3)定制自己的端点
- 写自己的端点
启动测试
4、整合可视化界面
spring-boot-admin
(1)创建我们的admin
@SpringBootApplication
@EnableAdminServer
public class bootAdmin {
public static void main(String[] args) {
SpringApplication.run(bootAdmin.class,args);
}
}
(2)编写客户端
- 客户端引入
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-client</artifactId>
<version>2.5.6</version>
</dependency>
- 编写yaml
- 启动测试
- 但是我们发现是用计算机名字加端口号进行配置的,那应该使用ip进行配。
- 还可以设置名字
- 这里可以看具体指标