单元测试设计
# 单元测试设计
核心命题:TDD 不是信仰,是工具——写测试的真正价值是"迫使你写出可测试的设计"。
# 01. 测试金字塔
/\
/E2E\ 少量,验证关键流程
/------\
/集成测试\ 中等,验证组件协同
/----------\
/ 单元测试 \ 大量,验证单个函数/类
/--------------\
# 02. AAA 模式
Arrange → 准备数据、Mock依赖
Act → 执行被测方法
Assert → 验证结果
一个测试只测一个行为。不写"万能测试"。
# 03. Mock vs Stub
| 概念 | 含义 | 用例 |
|---|---|---|
| Stub | 替代真实对象,返回固定值 | 日期、随机数 |
| Mock | 模拟对象,验证是否调用 | 验证"发送了邮件" |
| Fake | 轻量替代实现 | 内存数据库替代 MySQL |
| Spy | 记录调用信息 | 验证"调用了 N 次" |
原则:只 Mock 外部依赖(网络、DB、文件),不 Mock 自己的代码。
# 04. 覆盖率不是全部
- 100% 覆盖率 ≠ 没有 Bug
- 关键路径 > 覆盖率数字
- 好的测试 = 改了实现但测试不崩(测试的是行为不是实现)
# 05. 跨语言测试框架
| 语言 | 框架 | Mock |
|---|---|---|
| Java | JUnit5 | Mockito |
| Go | testing | testify/mock |
| Python | pytest | unittest.mock |
| JS/TS | Jest | 内置 |
# 06. 一句话总结
写测试不是为了覆盖率,是为了重构时有底气。不改代码行为的重构+测试=安全网。
上次更新: 2026/06/28, 17:55:19