单元测试
1. 什么是单元测试
单元测试是软件开发中的一种测试方法,用于验证程序中的最小功能单元(通常是方法)是否按照预期工作。
它的目的是在开发过程中尽早发现和修复代码中的错误,并确保每个单独的功能单元在被集成到整个系统之前都能正常运行。
它的优点:
- 提高代码质量和可靠性。
- 自动化测试,提高测试效率和准确性。
- 提供文档和示例,方便他人理解和使用功能单元。
- 支持代码重构和维护,保证修改不会引入新的错误。
- 促进团队合作和知识共享。
- 改善代码设计,提高模块化和低耦合性。
- 可以不污染连接的数据库,也就是可以不对数据库进行任何改变的情况下,测试功能。
2. Spring Boot 的单元测试
在创建 Spring Boot
项目的时候会自动添加 spring-boot-test
测试框架:
如果没有的话,也可以手动添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2.1 步骤
假设我们有一个名为"UserService"的服务类,负责用户相关的操作。它依赖一个名为"UserMapper"的接口来访问数据库,并提供一些业务逻辑方法。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
//通过 id 来获取 数据
public UserEntity getUserById(Integer id){
return userMapper.getUserById(id);
}
}
现在对etUserById
方法进行单元测试:
生成的初级状态:
@SpringBootTest
class UserServiceTest {
@Test
void getUserById() {
}
}
补全代码(把getUserById
当作main
方法写)
@SpringBootTest
class UserServiceTest {
@Autowired
UserService userService;
@Test
void getUserById() {
UserEntity user = userService.getUserById(1);
//打印
System.out.println(user);
}
}
运行后就会打印结果(我这里已经配置好MySQL环境了)。
可以使用断言方法:
下面是一些断言方法的汇总:
断言方法 | 描述 |
---|---|
assertEquals(expected, actual) | 验证两个值是否相等 |
assertNotEquals(expected, actual) | 验证两个值是否不相等 |
assertTrue(condition) | 验证条件是否为真 |
assertFalse(condition) | 验证条件是否为假 |
assertNull(actual) | 验证值是否为 null |
assertNotNull(actual) | 验证值是否不为 null |
assertSame(expected, actual) | 验证两个对象引用是否相同 |
assertNotSame(expected, actual) | 验证两个对象引用是否不相同 |
assertArrayEquals(expected, actual) | 验证两个数组是否相等 |
assertThrows(exceptionClass, executable) | 验证指定操作是否引发了特定类型的异常 |
fail() | 强制测试失败 |
@SpringBootTest
class UserServiceTest {
@Autowired
UserService userService;
@Test
void getUserById() {
UserEntity user = userService.getUserById(1);
//打印
System.out.println(user);
//使用断言:判断 user 是否 不为 null 不为 null 的时候才通过
Assertions.assertNotNull(user);
}
}