4Software Engineering at Google

测试

测试策略

测试金字塔测试规模测试文化测试维护

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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%)。

测试规模:小型快而多,大型慢而少。

测试文化:工程师负责、覆盖率足够、持续维护。

好的测试:可读、独立、确定、快速。


五、思考与练习

分析你的项目的测试金字塔分布。

如何将一个大型测试拆分为多个小型测试?

如何建立团队的测试文化?


4/8测试
0%