Skip to main content

testing

📅 2026-03-31 ✏️ 2026-03-31 CS
No related notes

1 · testing#

https://martinfowler.com/testing

S 软件开发中,测试长期被视为编码完成后由独立团队执行的独立活动。敏捷和 XP 运动改变了这一格局,将测试提升为开发核心环节。 C 但实践中仍存在诸多困惑:测试金字塔怎么分层?单元/集成/端到端边界在哪?Mock 和 Stub 有什么区别?自动化测试就够了吗?团队常在这些问题上争论不休却缺乏统一框架。 Q 如何构建一套完整、分层、可落地的测试体系? A Martin Fowler 给出的答案是:以**自测试代码(Self-Testing Code)**为核心,围绕三个维度构建体系——测试组合策略、测试分类与实现技术、自动化之外的补充手段

1.1 · 核心理念:Self-Testing Code#

编写全面的自动化测试套件,一条命令即可运行,通过即可发布。这既是质量保障,也是重构和持续交付的前提。TDD(测试驱动开发)是实现这一目标的核心实践。

1.2 · 1. 测试组合策略——怎么分层#

  • 测试金字塔(Test Pyramid):底层大量 Unit Test,顶层少量 Broad Stack Test(端到端),中间是 Component/Integration Test
  • 实践落地(Practical Test Pyramid):按粒度分桶,每层有明确的测试类型和数量比例
  • 微服务场景:引入网络分区后,需要重新思考测试策略,用 Contract Test 等方式管理跨服务依赖
  • 金字塔 vs 蜂巢之争:Fowler 指出争论的根源是”单元测试”和”集成测试”的定义本身不清晰

1.3 · 2. 测试分类与实现技术——怎么写#

分类体系:

分类含义
Unit Test对最小单元的快速测试,定义其实模糊
Integration Test验证独立开发的单元连接后能否正确工作,可窄可宽
Component Test限定范围到系统某一部分
Broad Stack Test端到端/全栈测试
Contract Test验证外部服务契约是否变化
Story Test面向业务的验收测试
Subcutaneous Test绕过 UI 直接测底层
Threshold Test在部署流水线中设阈值监控

实现技术:

  • Test Double:Dummy / Stub / Spy / Mock / Fake 的统一术语体系
  • Mocks ≠ Stubs:Mock 验证行为(behavior verification),Stub 提供状态(state verification),两种不同的测试风格
  • Page Object:封装 HTML 页面的应用级 API,隔离 UI 变化
  • Humble Object:把逻辑从难测元素中抽出,使不可测对象”谦卑化”
  • Object Mother / Self Initializing Fake / Clock Wrapper:创建测试数据、模拟远程服务、控制时间的实用模式
  • 消除非确定性测试:隔离、异步、远程服务、时间、资源泄漏是五大元凶
  • 测试覆盖率:用来发现未测代码的工具,而非衡量测试质量的指标
  • Test Impact Analysis:通过调用图分析只运行受变更影响的测试,加速构建

1.4 · 3. 自动化之外的补充——还缺什么#

自动化测试是一张精细的捕虫网,但仍不够:

  • 探索性测试(Exploratory Testing):快速学习-设计-执行循环,发现自动化测试覆盖不到的盲区
  • 生产环境 QA(QA in Production):通过日志和监控在生产环境发现质量问题,配合持续交付
  • 合成监控(Synthetic Monitoring):在生产环境定期运行自动化测试子集,将结果推送到监控系统
  • 面向领域的可观测性(Domain-Oriented Observability):以业务语义而非技术指标来添加可观测性,保持代码整洁

2 · links#

  1. https://martinfowler.com/articles/practical-test-pyramid.html
  2. https://martinfowler.com/articles/microservice-testing/