Unit Testing Anti-Patterns, Full List

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

我之前写过一些关于面向对象编程中的反模式。现在是时候写一些关于单元测试反模式的内容了,因为它们确实存在,而且非常多。我将尽量在这个列表中包含我所知道的每一个例子。如果你知道其他的,请通过pull request添加它们或在下面发表评论。对于每一个反模式,我将尽量提及它的来源,如果不是我自己的。请记住,即使我在某处发现了它,这并不一定意味着它是在那里被发明的。如果你发现错误,请评论。

布谷鸟1(又名陌生人3)。这是一个存在于同一个单元测试中,但实际上并不属于该单元测试的测试方法。

每个方法一个测试1。尽管在测试和生产类之间保持一对一的关系是一个合理的起点,但在测试和生产方法之间保持一对一的关系几乎总是一个坏主意。

肛门探针2。一种需要使用不健康的方式来执行任务的测试,例如使用反射读取私有字段。

连体婴儿2。虽然被称为单元测试,但实际上是集成测试,因为被测试系统和测试之间没有隔离。

顺畅路径。测试只涵盖顺畅的路径(即预期结果,例如18岁),而没有测试边界和异常情况(例如-2岁)。

慢吞吞3。一个运行非常慢的单元测试。当开发人员启动它时,他们有时间去上洗手间、吸烟,或者更糟糕的是,在一天结束前他们回家之前启动测试。

巨型3。一个单元测试,虽然有效地测试了被测试对象,但可能跨越数千行代码并包含许多测试用例。这可能是系统被测试对象是一个上帝对象的指示器。

嘲弄3。有时候模拟是好的,也很方便。但有时候开发人员可能在努力模拟未被测试的东西时迷失自我。在这种情况下,一个单元测试包含了如此多的模拟、存根和/或伪造,以至于根本没有测试被测试的系统,而是测试模拟返回的数据。

检查员3。一个单元测试为了实现100%的代码覆盖率而违反了封装性,但却对对象的运行情况了解甚多,任何重构尝试都会破坏现有的测试,并要求任何更改都在单元测试中反映出来。

慷慨的剩余物3(又名连环犯地板湿滑)。一个单元测试创建了持久化在某处的数据,而另一个测试将该数据用于自己的邪恶目的。如果“生成器”在此之后运行,或者根本不运行,使用该数据的测试将直接失败。

地方英雄3(又名隐藏依赖,操作系统布道师,等等看环境破坏者)。一个测试用例依赖于某个特定于编写它的开发环境,以便运行。结果是,该测试在开发环境中通过,但在其他环境中运行时失败。

吹毛求疵者3。一个单元测试将一份完整的输出与其实际只对其中的一小部分感兴趣进行比较,因此测试必须不断与其他不重要的细节保持一致。

秘密捕手3。一个乍一看似乎没有进行任何测试的测试,因为没有断言,但就像他们说的,“魔鬼就在细节中”。这个测试实际上依赖于在发生意外时抛出异常,并期望测试框架捕获异常并将其作为失败报告给用户。

躲闪者3。一个单元测试对次要的(可能是容易测试的)副作用进行了大量的测试,但从不测试核心的期望行为。有时你可能会在与数据库访问相关的测试中找到这种情况,在调用一个方法后,测试从数据库中进行选择,并对结果运行断言。

多嘴3。一个单元测试(或测试套件),即使测试通过,也会在控制台上生成诊断信息、日志和其他杂项聊天。

贪婪的捕手3。一个单元测试捕获异常并吞掉堆栈跟踪,有时用不太信息丰富的失败消息替换它,但有时甚至只是记录(参见多嘴),然后让测试通过。

顺序测试者3。一个单元测试依赖于无序列表中的项目在断言期间以相同的顺序出现。

枚举器3(又名无名测试)。每个测试用例方法的名称仅仅是一个枚举,例如test1test2test3。结果是,测试用例的意图不清楚,唯一确定的方法是阅读测试用例的代码并祈求清晰度。

免费乘车3(又名顺便搭车)。与其编写一个新的测试用例方法来测试另一个功能,不如在现有的测试用例中添加一个新的断言。

过度设置3(又名母鸡)。一个测试需要很多工作来设置环境以开始测试。有时需要使用几百行代码来设置环境进行一个测试,涉及多个对象,这可能会使得很难真正确定正在测试什么,因为所有设置的“噪音”。

击球者。乍一看,测试覆盖了所有内容,并且代码覆盖工具以100%的覆盖率进行了确认,但实际上测试只是击中了代码,没有进行任何输出分析。

四十尺棒测试参见)。害怕靠近他们试图测试的类,这些测试以距离作为行动,通过无数层抽象和数千行代码与他们要检查的逻辑分离。

说谎者4(又名常青测试胜过一切的成功3)。一个测试不验证任何行为并在每种情况下都通过。任何在代码中引入的新错误都不会被这个测试发现。它可能是在实现完成后创建的,所以这个测试的作者无法知道这个测试是否实际上在测试什么。

  1. Spock: Up and Running by Rob Fletcher” translates to: “Rob Fletcher 所著的 Spock: Up and Running

  2. 掌握使用JUnit 5进行软件测试 由Boni Garcia所著。

  3. TDD Anti-Patterns by James Carr” should be translated to Chinese as: “James Carr的TDD反模式

  4. 反模式 by William E. Kempf

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-22 at 10:05

sixnines availability badge   GitHub stars