第4章:测试(Testing)
一、导读
1.1 本章学习目标
第4章讲解 Google 的测试策略——测试金字塔、测试规模、测试文化。
本章的核心学习目标包括:
- 理解测试金字塔
- 掌握不同规模测试的特点
- 学会建立测试文化
- 理解测试维护的重要性
1.2 为什么本章如此重要
没有测试的代码就是遗留代码。Google 有数百万个测试,每天运行数十亿次。测试是代码质量的基石。
1.3 核心问题引导
测试金字塔是什么?为什么它重要?
小型、中型、大型测试各有什么特点?
如何避免测试成为负担?
Google 的测试文化有什么独特之处?
二、核心概念详解
2.1 测试金字塔
Google 的测试金字塔:
/ 大型测试 \ ← 少量(10%)
/ (端到端) \ 慢、贵、脆弱
/───────────────\
/ 中型测试 \ ← 适量(20%)
/ (集成测试) \ 中等速度
/─────────────────────\
/ 小型测试 \ ← 大量(70%)
/ (单元测试) \ 快、便宜、稳定
/───────────────────────────\
原则:
- 底层多,顶层少
- 小型测试优先
- 大型测试只测试关键路径2.2 测试规模
小型测试(单元测试):
- 测试单个函数/类
- 不依赖外部资源
- 运行时间 < 1 秒
- 可以并行运行
- 数量最多
中型测试(集成测试):
- 测试多个组件的交互
- 可能使用真实的数据库
- 运行时间 < 1 分钟
- 数量适中
大型测试(端到端测试):
- 测试整个系统
- 使用真实的外部服务
- 运行时间 > 1 分钟
- 数量最少
- 只测试关键用户路径2.3 测试文化
Google 的测试文化:
1. 测试是工程师的责任
- 不是 QA 团队的责任
- 每个工程师写自己的测试
2. 测试覆盖率目标
- 不是 100%,而是"足够"
- 关注关键路径
- 关注容易出错的代码
3. 测试维护
- 测试是代码,也需要维护
- 重构时同步更新测试
- 删除过时的测试
4. 测试速度
- 小型测试必须快
- 测试运行时间影响开发效率
- 定期优化测试速度2.4 测试最佳实践
好的测试特征:
1. 可读性
- 测试名称描述行为
- 测试代码清晰
- 使用 Given-When-Then 结构
2. 独立性
- 测试之间不依赖
- 不依赖执行顺序
- 不依赖外部状态
3. 确定性
- 相同输入总是相同输出
- 不使用随机数据(或使用固定种子)
- 不依赖时间
4. 速度
- 单元测试 < 1 秒
- 整个测试套件 < 10 分钟三、实战案例
3.1 案例一:测试金字塔实践
java
// 小型测试:单元测试
@Test
void calculateTotal_withDiscount() {
Order order = new Order(List.of(
new OrderLine("item1", 100, 2),
new OrderLine("item2", 50, 1)
));
order.applyDiscount(0.1);
assertThat(order.getTotal()).isEqualTo(225.0);
}
// 中型测试:集成测试
@Test
void placeOrder_sendsConfirmation() {
// 使用测试数据库
OrderService service = new OrderService(testDb, mockEmail);
OrderId id = service.placeOrder(new PlaceOrderCommand(...));
Order order = testDb.findById(id);
assertThat(order.getStatus()).isEqualTo(CONFIRMED);
assertThat(mockEmail.getSentEmails()).hasSize(1);
}
// 大型测试:端到端测试
@Test
void fullOrderFlow() {
// 使用真实的 Web 服务器和数据库
WebClient client = new WebClient("http://localhost:8080");
// 登录
client.login("user", "pass");
// 下单
OrderResponse order = client.placeOrder(...);
// 验证
assertThat(order.getStatus()).isEqualTo("CONFIRMED");
}四、本章小结
测试金字塔:小型(70%)> 中型(20%)> 大型(10%)。
测试规模:小型快而多,大型慢而少。
测试文化:工程师负责、覆盖率足够、持续维护。
好的测试:可读、独立、确定、快速。
五、思考与练习
分析你的项目的测试金字塔分布。
如何将一个大型测试拆分为多个小型测试?
如何建立团队的测试文化?