反模式:必须至少有两个关键元素来正式区分实际的反模式与简单的坏习惯、坏实践或坏想法:

一些重复的行为模式、过程或结构,最初看起来是有益的,但最终产生的坏结果多于有益的结果 一个重构的解决方案,清楚地记录,在实际实践中证明,并可重复。

为您在“野外”中见过太多次的TDD反模式投票。 James Carr的博客文章和testdrivendevelopment yahoogroup的相关讨论

如果你找到了一个“未命名的”…也要贴出来。请每个反模式一篇文章,让投票有意义。

我的既得利益是找到前n个子集,这样我就可以在不久的将来在午餐会上讨论它们。


当前回答

环境破坏者

一个用于各种“需求”的“单元”测试开始溢出到其环境中,使用和设置环境变量/端口。同时运行两个这样的测试会导致“端口不可用”异常等。

这些测试将是断断续续的,开发人员会说“再运行一次”之类的话。

我看到的一个解决方案是随机选择一个端口号来使用。这降低了冲突的可能性,但显然不能解决问题。因此,如果可以,总是模拟代码,这样它就不会分配不可共享资源。

其他回答

蝴蝶

您必须测试一些包含随时变化的数据的东西,比如包含当前日期的结构,并且没有办法将结果固定为一个固定的值。糟糕的是,您根本不关心这个值。它只会使您的测试更加复杂,而不会增加任何价值。

它翅膀上的蝙蝠可以在世界的另一端引发飓风。——爱德华·洛伦兹《蝴蝶效应

今天被这个咬了一口:

潮湿的地板上: 测试创建的数据被持久化到某个地方,但是测试完成后并不清理。这会导致测试(相同的测试,也可能是其他测试)在后续测试运行中失败。

在我们的例子中,测试在“temp”目录中留下了一个文件,该文件具有第一次运行测试的用户的权限。当不同的用户尝试在同一台机器上测试时:砰。在James Carr网站上的评论中,Joakim Ohlrogge将其称为“邋遢的工人”,这也是“慷慨的剩菜”的灵感来源之一。我更喜欢我的名字(不那么侮辱人,更熟悉)。

秘密捕手——弗兰克·卡弗 由于缺少断言,乍一看似乎没有进行任何测试的测试。但是“细节决定成败”。测试实际上依赖于要抛出的异常,并期望测试框架捕获异常并将其作为失败报告给用户。

[Test]
public void ShouldNotThrow()
{
   DoSomethingThatShouldNotThrowAnException();
}

巨大的

一个单元测试,尽管它是有效地测试被测对象,但它可以跨越数千行,并包含许多许多测试用例。这可以作为一个指示器,表明测试中的系统是一个上帝对象(James Carr的帖子)。

对于这种情况,一个明确的迹象是测试跨越了不止几行代码。通常,测试是如此复杂,以至于它开始包含自己的错误或不可靠的行为。

检查员 为了实现100%的代码覆盖率而违反封装的单元测试,但是它非常了解对象中正在发生的事情,以至于任何重构的尝试都将破坏现有的测试,并要求在单元测试中反映任何更改。


“我如何测试我的成员变量而不使它们为公共…”只是为了单元测试?”