Steve Smith 谈端到端测试是有害的

  • Daniel Bryant
  • 陆志伟

2015 年 12 月 28 日

话题:DevOps持续交付语言 & 开发架构文化 & 方法

最近 InfoQ 采访了 Steve Smith,坐下与其讨论了他最近的博客文章“端到端测试是有害的”背后的观点。Smith 谈到发布测试是一种‘风险管理剧院(risk management theatre)’形式,讨论了环境下单元测试和验收测试的优势,强调了运行时监控相对典型脆弱的、运行缓慢的端到端测试实现的价值。

InfoQ:你好 Steven,谢谢你接受 InfoQ的采访。你能介绍一下你自己,同时简单解释一下你最新博客文章“端到端测试是害的”的前提吗?

Smith:我在伦敦工作,职业是持续交付顾问,作为一名开发者,多年来我做过大量的单元测试,验收测试,冒烟测试和监控,而没有采用端到端测试。我从来不是端到端测试的爱好者,因为他们既慢又脆弱,并且数年来,每当有客户说“在产品发布之前,我们需要执行端到端测试 1 天 /2 周 /1 个月”时,总是会让我感到很难过。

2014 年的时候,我写过一篇端到端测试的文章,因为称发布测试是一种风险管理剧院形式而为人熟知,今年我的研究向前迈进了一步。今年春天,当有个客户说“在产品发布前我们需要端到端的性能测试”,我问他们,为什么他们为了第三方的利益愿意花自己的钱测试第三方系统呢,并且他们动心了。

今年夏天,当这个话题再被提出的时候,我和我的同事再次指出这是一个多么糟糕的想法,并且我们建议使用第三方产品监控替代端到端测试。自那之后我非常的恼怒,接下来我花了 4 个月,每晚阅读和思考端到端的测试,现在你可以在我的博客上阅读我的最终(长)版本。并且希望你能够提供初始反馈信息,明年我打算就此发表一场演讲。

InfoQ:你在文章中提到端到端测试不会检查被测系统的“行为”。你能更具体地解释一下吗,以及这种说法背后的原因?

Smith:为了简洁起见,我简化了单元测试,验收测试和端到端测试的构建时自动检查,并且根据 Jerry Weinberg 的Perfect Software and Other Illusion书中的术语进行了分类。Jerry 描述了针对实现检查目的,比如开发者是否做了他们认为应该做的(单元测试),和针对需求检查实现,比如开发者是否做了需要做的之间的差异。验收测试或者端到端测试将会检查被测系统内通过遵循特定路径满足要求的需求,但是它不会检查路径内所有不同行为的可能性。这就是为什么单元测试流行起来的原因。

InfoQ:你讨论了相对平均恢复前时间(MTTR)优先低平均故障间隔时间(MTBF)构建出来的系统会受到有关黑天鹅事件波及的风险。开发者和运维者如何说服管理人员相信这个问题的现状(和固有风险)?

Smith:这个问题很好。Nassim Nicholas Taleb 在著作 Black SwanAntifragile中表明让人们理性对待可能性和“小概率事件会发生”的想法是多么的困难。我通常是这样处理客户的:

  1. 计算每个事件每单位时间的成本,比如“如果第三方支付系统失灵,我们每分钟花费的成本是多少”
  2. 计算每个事件的持续时间,比如“如果第三方支付系统失灵,失灵的时间是多久”
  3. 计算每个事件发生的概率,比如“第三方支付系统失灵的可能性是多少”
  4. 风险 = 1 * 2 * 3

人们通常能够很容易评估 1 和 2,因为他们了解自己的业务,并知道第三方的生产周期。3 相对比较困难,但是即使是粗略的估计也可以给出明确的指示——再加上可以向人们展示致力于缩短生产周期有多么的重要。

InfoQ:随着“可编程的基础设施”的迅速流行,你觉得在构建管道中集成基础设施变化有多重要?对此你有什么建议(比如是否应该有独立的应用/基础设施管道)?

Smith:自动化的基础设施显然是件好事,并且有助于实现较低的平均恢复前时间,因为它能够促进基础设施错误的快速回滚。我有看到捆绑了应用程序版本(使用类似聚合工件(Aggregate Artifact))的自动化基础设施版本或者拥有特有变化率的完全独立的管道。这取决于该应用程序依赖基础设施的程度。

InfoQ:你能为那些负责提高遗留应用程序测试质量,并且该测试拥有大量端到端测试的人员一些建议吗?对于一个脆弱的测试套件,是否有等效的流行的微服务可以取代遗留应用程序strangler模式’

Smith:这个问题很好。最近我在 Netherlands 举办的 2015 年持续交付会议上发表了 主旨演讲,在 Q&A 中我被问到了完全相同的问题,我成功抵制了 “看情况而定”的正常回答。替换单元测试和验收测试中大量的自动化端到端测试需要很长时间,并且很难说服产品负责人,因此我赞成你使用 Strangler 应用程序的建议。

我将会围绕遗留应用程序构建新的应用,包含单元测试和验收测试,并在新应用逐步取代遗留应用的时候从遗留应用中逐步移除端到端测试。这需要大量的投资,但是随着新应用取代遗留应用,并且端到端测试的移除,人们会注意到生产周期缩短了,并且质量更高。

InfoQ:谢谢你百忙之中接受 InfoQ的采访。你还有什么希望跟读者分享的吗?

Smith:在构建时请不要使用端到端测试。如果你想要测试你的代码,在构建时使用单元测试或者验收测试。如果你想要测试你代码依赖的第三方,使用运行时监控。

Steve Smith 有关端到端测试想法的其它信息可以参考他最近的博客文章端到端测试是有害的

查看英文原文:End-to-End Testing Considered Harmful:A Q&A with Steve Smith

DevOps持续交付语言 & 开发架构文化 & 方法