springboot单元测试以及Actuator监控(总体第九篇)

一、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进行配。
    在这里插入图片描述
    在这里插入图片描述
  • 还可以设置名字
    在这里插入图片描述
    在这里插入图片描述
  • 这里可以看具体指标
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值