一、单元测试是什么
单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证的过程就叫单元测试。
对Spring项目中代码逻辑进行单个单元测试的过程,验证是否符合预期工作,并确保它们能正确地集成和交互。
二、单元测试好处
(1)可控性:可以最小颗粒度的测试某个组件功能,减少外部依赖的影响。
(2)提高代码质量:通过单元测试可以在提测之前及早发现和修复潜在问题,提升代码的可靠性。
(3)便于集成测试:可通过多个组件的协同工作,验证整个系统的功能和性能。
三、断言
断言(assertions):用来对测试需要满足的条件进行验证。就是你调用的方法断言了什么,结果就得是什么,否则就报错说你这个跟要求不一样。如果断言失败,则后面的代码都不会执行。
(1)简单断言:用来对单个值进行简单的验证。
方法 | 说明 |
assertEquals | 判断两个对象或两个原始类型是否相等 |
assertNotEquals | 判断两个对象或两个原始类型是否不相等 |
assertSame | 判断两个对象引用是否指向同一个对象 |
assertNotSame | 判断两个对象引用是否指向不同的对象 |
assertTrue | 判断给定的布尔值是否为 true |
assertFalse | 判断给定的布尔值是否为 false |
assertNull | 判断给定的对象引用是否为 null |
assertNotNull | 判断给定的对象用是否不为 null |
(2)数组断言:通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等。
第一个参数是期望值,第二个参数是实际值,第三个参数是异常报文
@DisplayName("测试数组断言") @Test void testArrayAssertions(){ Assertions.assertArrayEquals( new String[]{"suncat","123456789"}, new String[]{"suncat","123456789"}, "数组不一样" ); }
(3)组合断言:assertAll 方法接受多个 org.junit.jupiter.api.Executable 函数式接口的实例作为要验证的断言,可以通过 lambda 表达式很容易的提供这些断言。
@DisplayName("组合断言") @Test void testAssertAll(){ Assertions.assertAll( "测试组合判断", ()->Assertions.assertEquals("suncat","suncat"), ()->Assertions.assertTrue(true) ); }
(4)异常断言:JUnit5提供了一种断言方式Assertions.assertThrows() ,配合函数式编程就可以进行使用。
@DisplayName("测试断言异常") @Test void testException(){ Assertions.assertThrows( RuntimeException.class, ()->System.out.println(10/0) ); }
(5)超时断言:Junit5还提供了Assertions.assertTimeout() 为测试方法设置了超时时间。
@DisplayName("超时断言") @Test void testTimeout(){ Assertions.assertTimeout( Duration.ofMillis(1000), ()->Thread.sleep(2000) ); }
四、单元测试使用实例
1、启动Spring Boot全部环境
模拟启动整个Spring项目,会加载其允许所需要的所有环境,包括web层及其他服务。启动起来会很慢,往往会加载一些与本单元测试无关紧要的框架。适用于单元测试Controller接口控制层与Service业务逻辑层。
Spring Boot 项目创建时会默认单元测试框架 spring-boot-test,而这个单元测试框架主要是依靠另⼀ 个著名的测试框架 JUnit 实现的,打开 pom.xml 就可以看到,以下信息是 Spring Boot 项目创建是自动添加的:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
在test.java目录下增加测试class文件
测试文件中增加
@SpringJUnitConfig(classes=XXXApplication.class)//指定要测试的Spring应用程序类 @SpringBootTest
其中XXXApplication为Spring项目的启动类
添加对应的测试方法,写对应的单元测试执行逻辑,最后依据结果进行断言。
需要注意一下,如果不想单元测试执行过程中污染数据库中的数据,可以添加@Transactional 注解来执行事务操作,单元测试执行后回滚事务
2、只加载数据环境
利用Mybatis Plus的注解,只加载特定数据库模块,其中数据库使用项目中的数据库。启动快,无关模块不需要加载。适用于单元测试DAO层代码,校验sql写得是否合理。
在pom.xml中添加Mybatis-Plus-Test依赖,不过需要注意的是mybatis-plus的版本必须在3.4.0以上
<!--导入Mybatis-Plus-Test依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter-test</artifactId> <version>${mybatis-plus.version}</version> </dependency>
创建mybatis单元测试类
添加MybatisPlusTest相关注解
@MybatisPlusTest @AutoConfigureTestDatabase(replace=AutoConfigureTestDatabase.Replace.NONE)
添加对应的单元测试mybatis操作方法
执行测试方法,可以看到启动时间还是比较短的,而且也执行对应的sql,返回我们想要的数据。
备注:
有时候我们本地编译的时候,编译的同时会执行我们的单元测试。如果我们只想编译项目,
不想它执行我们的单元测试,我们可以在mvn指令框内输入下述指令之一即可。
指令一:
mvn clean install -DskipTests
指令二:
mvn clean install -Dmaven.test.skip=true
在idea软件右侧菜单栏点击Maven菜单,点击命令行,输入命令。