# 单元测试

> 来源: Java开发手册（嵩山版）— 三、单元测试

## 【强制】规则

### 1. AIR 原则

- **A**: Automatic（自动化）
- **I**: Independent（独立性）
- **R**: Repeatable（可重复）

### 2. 全自动执行

非交互式的。必须使用 `assert` 验证，不准用 `System.out` 人肉验证。

### 3. 测试独立性

测试用例之间决不能互相调用，也不能依赖执行次序。

### 4. 不受外界环境影响

对外部环境（网络、服务、中间件等）有依赖时，用 DI 注入本地/ Mock 实现。

### 5. 测试粒度小

至多是类级别，一般是方法级别。

### 6. 核心增量代码确保测试通过

新增代码及时补充单元测试。

### 7. 测试代码在 src/test/java

不允许写在业务代码目录下。

## 【推荐】规则

### 8. 覆盖率目标

- 语句覆盖率 ≥ 70%
- 核心模块语句覆盖率和分支覆盖率 100%

### 9. BCDE 原则

| 字母 | 含义 |
|------|------|
| B | Border: 边界值测试 |
| C | Correct: 正确输入得到预期结果 |
| D | Design: 与设计文档结合 |
| E | Error: 强制错误输入得到预期结果 |

### 10. 数据库测试数据准备

用程序插入或导入数据来准备数据，不假设数据库里数据已存在。

### 11. 自动回滚机制

或使用明确的前后缀标识（如 `UNIT_TEST_`）标识测试数据。

### 12. 重构不可测代码

使代码变得可测，避免书写不规范测试代码。

### 13. 设计评审确定范围

开发和测试一起确定单元测试范围。

### 14. 提测前完成

不建议项目发布后补充。

### 【参考】

### 15. 业务代码避免

- 构造方法中做过多事情
- 过多全局变量和静态方法
- 过多外部依赖
- 过多条件语句（建议卫语句/策略模式/状态模式重构）

### 16. 对单元测试的误解

- "那是测试同学干的事情" — 本文内容与开发强相关
- "单元测试代码是多余的" — 系统功能与各单元部件测试强相关
- "单元测试不需要维护" — 半年后几乎废弃
- "与线上故障无关" — 好的单元测试能规避线上故障
