springboot2——9 单元测试

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/端点名,来查看对应的端点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值