141 lines
3.8 KiB
Markdown
141 lines
3.8 KiB
Markdown
# 单元测试运行结果示例
|
|
|
|
## 测试执行命令
|
|
```bash
|
|
mvn test
|
|
```
|
|
|
|
## 测试结果概览
|
|
```
|
|
[INFO] -------------------------------------------------------
|
|
[INFO] T E S T S
|
|
[INFO] -------------------------------------------------------
|
|
[INFO] Running com.example.usertest.service.UserServiceTest
|
|
[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.892 s - in com.example.usertest.service.UserServiceTest
|
|
[INFO]
|
|
[INFO] Results:
|
|
[INFO]
|
|
[INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0
|
|
[INFO]
|
|
[INFO] ------------------------------------------------------------------------
|
|
[INFO] BUILD SUCCESS
|
|
[INFO] ------------------------------------------------------------------------
|
|
```
|
|
|
|
## 详细测试报告
|
|
|
|
### 用户注册测试 (11个测试)
|
|
✅ 成功注册新用户
|
|
✅ 用户名已存在时注册失败
|
|
✅ 邮箱已存在时注册失败
|
|
✅ 空请求注册失败
|
|
✅ 用户名为空时注册失败
|
|
✅ 用户名太短时注册失败
|
|
✅ 用户名包含非法字符时注册失败
|
|
✅ 密码太短时注册失败
|
|
✅ 密码没有数字时注册失败
|
|
✅ 密码没有字母时注册失败
|
|
✅ 邮箱格式无效时注册失败
|
|
|
|
### 用户登录测试 (7个测试)
|
|
✅ 成功登录
|
|
✅ 用户不存在时登录失败
|
|
✅ 用户未激活时登录失败
|
|
✅ 密码错误时登录失败
|
|
✅ 空请求登录失败
|
|
✅ 用户名为空时登录失败
|
|
✅ 密码为空时登录失败
|
|
|
|
### 修改密码测试 (6个测试)
|
|
✅ 成功修改密码
|
|
✅ 用户不存在时修改密码失败
|
|
✅ 旧密码错误时修改失败
|
|
✅ 新旧密码相同时修改失败
|
|
✅ 空请求修改密码失败
|
|
✅ 新密码格式无效时修改失败
|
|
|
|
### 删除用户测试 (3个测试)
|
|
✅ 成功删除用户(软删除)
|
|
✅ 用户不存在时删除失败
|
|
✅ 无效的用户ID时删除失败
|
|
|
|
### 获取用户测试 (2个测试)
|
|
✅ 成功获取用户
|
|
✅ 用户不存在时获取失败
|
|
|
|
### 边界条件测试 (2个测试)
|
|
✅ 用户名长度边界测试
|
|
✅ 密码长度边界测试
|
|
|
|
### Mock验证测试 (3个测试)
|
|
✅ 验证方法调用次数
|
|
✅ 验证方法从未被调用
|
|
✅ 验证方法调用顺序
|
|
|
|
## 测试覆盖率
|
|
- 类覆盖率: 100%
|
|
- 方法覆盖率: 100%
|
|
- 行覆盖率: 95%
|
|
- 分支覆盖率: 90%
|
|
|
|
## 关键知识点总结
|
|
|
|
### 1. JUnit 5 注解
|
|
- `@Test`: 标记测试方法
|
|
- `@BeforeEach`: 每个测试方法执行前运行
|
|
- `@Nested`: 组织相关的测试用例
|
|
- `@DisplayName`: 为测试提供可读的名称
|
|
- `@ExtendWith`: 扩展测试功能
|
|
|
|
### 2. Mockito 使用
|
|
- `@Mock`: 创建模拟对象
|
|
- `@InjectMocks`: 注入模拟对象到被测试类
|
|
- `when().thenReturn()`: 定义模拟行为
|
|
- `verify()`: 验证方法调用
|
|
- `ArgumentCaptor`: 捕获方法参数
|
|
|
|
### 3. AssertJ 断言
|
|
- `assertThat()`: 流畅的断言API
|
|
- `assertThatThrownBy()`: 异常断言
|
|
- `isInstanceOf()`: 类型断言
|
|
- `hasMessage()`: 消息断言
|
|
|
|
### 4. 测试最佳实践
|
|
- **Given-When-Then模式**: 组织测试代码结构
|
|
- **单一职责**: 每个测试只验证一个场景
|
|
- **有意义的命名**: 测试方法名描述测试场景
|
|
- **完整的覆盖**: 包含正常和异常场景
|
|
- **隔离性**: 每个测试独立运行
|
|
- **可重复性**: 测试结果稳定可靠
|
|
|
|
### 5. Mock对象验证技巧
|
|
- 验证方法调用次数
|
|
- 验证方法参数
|
|
- 验证调用顺序
|
|
- 验证未调用的方法
|
|
|
|
## 运行测试的其他方式
|
|
|
|
### IDE中运行
|
|
- IntelliJ IDEA: 右键点击测试类或方法,选择"Run"
|
|
- Eclipse: 右键点击测试类,选择"Run As" → "JUnit Test"
|
|
|
|
### 运行特定测试
|
|
```bash
|
|
# 运行特定测试类
|
|
mvn test -Dtest=UserServiceTest
|
|
|
|
# 运行特定测试方法
|
|
mvn test -Dtest=UserServiceTest#registerUser_Success
|
|
|
|
# 运行匹配模式的测试
|
|
mvn test -Dtest=*ServiceTest
|
|
```
|
|
|
|
### 生成测试报告
|
|
```bash
|
|
# 生成HTML格式的测试报告
|
|
mvn surefire-report:report
|
|
```
|
|
|
|
测试报告将生成在 `target/site/surefire-report.html` |