测试驱动开发可能出错的五种方式

原标题Five Ways Test-Driven Development Can Go Wrong

Dave Farley 将测试反模式当作改进软件设计的信号。

DFDave Farley讲者
频道
GOTO Conferences
发布
2021年5月7日
视频
21:34
阅读
3 分钟
原文
英语
在 YouTube 打开
往下滚动阅读时,视频会缩到右下角继续播放。字幕跟随阅读语言。
阅读语言共 2 种语言可读
由 AI 从英语原文翻译。打开“对照原文”可以逐段核对。
摘要

30 秒看懂

Dave Farley 讨论无意义断言、过多设置、巨型测试、过度模拟和检查私有内部细节的测试。他认为聚焦的测试与更好的关注点分离可以把测试困难转化为设计反馈。

  1. 1骗子没有有用断言的通过测试会制造虚假的信心。
  2. 2过多设置复杂设置可能暴露难处理的依赖。
  3. 3巨型测试大型测试可能掩盖究竟哪种行为失败。
  4. 4模拟至空把一切都模拟掉可能导致没有真正行为被测试。
  5. 5检查器与私有内部细节绑定的断言可能使测试脆弱。

要点建议

  1. 没有有用断言的通过测试会制造虚假的信心。
  2. 复杂设置可能暴露难处理的依赖。
  3. 大型测试可能掩盖究竟哪种行为失败。
  4. 把一切都模拟掉可能导致没有真正行为被测试。
  5. 与私有内部细节绑定的断言可能使测试脆弱。
全文

按章节阅读整理后的全文

只看原始文稿
01

测试作为设计反馈

Farley 介绍反馈循环的目的。

Dave Farley 认为测试驱动开发中的困难可以提示软件设计问题。在这场 2021 年的讲解中,他分析五种测试反模式,并提出让反馈更有用的方法。

在 Farley 看来,TDD 的价值不只是覆盖率数字:在短反馈循环中编写测试和代码,可以暴露耦合、关注点分离不佳和接口难用等问题。这些信号仍需结合具体情况判断。

02

无意义测试与设置

前两种模式暴露薄弱断言和难处理的依赖。

第一种反模式“骗子”是通过了却没有作出有意义断言的测试。他回忆一个覆盖率目标促使人们编写了执行代码却没有检查有用行为的测试。

他建议删除或改进无意义的测试,并在实现行为前观察新测试是否因预期原因失败。测试失败是有用证据,但仅凭失败并不能保证测试正确。

“过多设置”指准备测试需要大量工作。Farley 将其视为检查依赖和关注点分离的信号,而不是立刻接受脆弱的设置。

他展示一个为了检查 URL 字符串而启动整个 Jenkins 环境的测试。对这个特定行为,更小的单元级检查可能更快、更清晰;当交互本身重要时,更广泛的集成测试仍可能合适。

03

大型测试与模拟

他讨论意图不清和过度使用测试替身。

“巨型测试”是很长、包含许多断言且意图不清的测试。Farley 说,当互不相关的行为被捆绑在同一个用例里,失败可能很难诊断。

他倾向于将这种用例拆成聚焦的测试,并建议把每个测试一个断言作为经验法则。当多个相关断言共同描述一个完整行为时,它们也可能是合理的。

“模拟至空”依赖了过多 mock 或 stub,以至于几乎没有运行真实生产行为。在他的例子中,汽车和发动机都被模拟,测试的是配置好的替身,而非真实实现。

他建议重新审视设计,关注软件必须提供的行为。测试替身在边界处可能有用,但不应替代测试本来要验证的行为。

04

封装与行为

最后一种模式涉及与内部细节耦合的测试。

“检查器”通过破坏封装来断言私有实现细节。Farley 警告,与内部实现紧密耦合的测试可能在无害重构后失败,即使外部可观察行为仍然正确。

他展示了一个似乎只为测试加入的方法,追问更好的抽象或依赖边界能否让测试观察行为而不暴露私有状态。这是设计问题,不是禁止所有测试专用检测手段。

贯穿五种反模式的主题是把测试阻力当作反馈:简化设置、明确行为、改善分离,并避免把覆盖率本身当作目标。

同频道的其他文章

3 张幻灯片39:12EN → 简体中文
GOTO Conferences· 2026年10月28日Cate Huston:严谨如何支撑 AI 辅助开发的交付速度Cate Huston · Twill两人团队分享发布关口、自动检查、优先级和加快交付的成本。AI 工程管理Software engineeringAI agents
4 张幻灯片22:33EN → 简体中文
GOTO Conferences· 2026年10月26日William Schor:Netflix 如何从单元测试走向合成金丝雀William Schor · Netflix用生成的工作负载和接近生产的基础设施,测试分布式键值服务。Software engineering
5 张幻灯片34:11EN → 简体中文
GOTO Conferences· 2026年10月23日Anatoliy Bilenko 和 Alberto Carretero:用形式化方法和 AI 让数据库协议可靠Anatoliy Bilenko, Alberto Carretero · CanonicalCanonical 的数据库工程师把可执行规格、基于模型的测试、故障探索和重建的执行历史串起来,并说明为什么这些方法单独用,都无法证明真实系统正确。开发流程与测试Code review & verification可观测性与可靠性+2
28:15EN → 简体中文
GOTO Conferences· 2026年10月22日Steve Poole:开源安全与 AI 带来的维护挑战Olimpiu Pop, Steve Poole为什么漏洞发现加速会给维护者、依赖使用者和升级流程增加压力。Software engineeringAI security
5 张幻灯片46:36EN → 简体中文
GOTO Conferences· 2026年10月21日Don Syme:围绕人类协作构建 Agent 自动化Don Syme · GitHubContinuous AI、仓库工作流,以及无人值守软件维护所需的防护措施。Agent orchestrationSoftware engineering编程智能体
28:23EN → 简体中文
GOTO Conferences· 2026年10月19日学习 Ash:声明式 Elixir 应用、测试与可扩展性Christian Alexander, Rebecca Le, Zach DanielRebecca Le 和 Zach Daniel 解释他们的书与框架如何共同演进。Software engineering