第2章:测试的概念(The Concept of Test)
一、导读
1.1 本章学习目标
第2章深入探讨了测试的本质。测试不仅仅是验证代码正确性的手段,更是设计工具和质量保障机制。
1.2 为什么第二章如此重要
理解测试的本质——测试是设计的工具,而不仅仅是验证工具——是正确实践 TDD 的前提。
1.3 核心问题引导
单元测试和集成测试有什么区别?
测试金字塔是什么?
什么是行为验证和状态验证?
如何编写好的测试?
二、核心概念详解
2.1 测试金字塔
/ E2E \ 少量端到端测试
/ 集成测试 \ 适量集成测试
/ 单元测试 \ 大量单元测试2.2 单元测试
- 测试单个类或方法
- 不依赖外部资源
- 快速、可靠、可重复
2.3 集成测试
- 测试多个组件的协作
- 可能依赖数据库、网络等
- 较慢,但能发现组件间的交互问题
2.4 行为验证 vs 状态验证
java
// 状态验证:检查最终状态
@Test
public void shouldAddItem() {
cart.add("item1");
assertEquals(1, cart.size());
}
// 行为验证:检查是否调用了正确的方法
@Test
public void shouldSendEmail() {
service.register("user@test.com");
verify(emailSender).send("user@test.com", "Welcome!");
}三、实战案例
3.1 测试金字塔实践
java
// 单元测试(大量)
@Test void shouldCalculateTotal() { ... }
@Test void shouldApplyDiscount() { ... }
// 集成测试(适量)
@Test void shouldPersistOrder() { ... }
// E2E 测试(少量)
@Test void shouldCompleteCheckout() { ... }四、本章小结
测试金字塔指导我们编写大量单元测试、适量集成测试和少量 E2E 测试。行为验证和状态验证各有适用场景。
五、思考与练习
为什么单元测试应该最多?
如何编写可维护的测试?
什么时候使用行为验证?什么时候使用状态验证?
测试覆盖率重要吗?
如何处理测试中的随机性?