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

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

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

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

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


当前回答

等着瞧

一种运行一些设置代码的测试,然后需要“等待”一段特定的时间,才能“看到”被测代码是否按预期运行。使用Thread.sleep()或等效的testMethod肯定是一个“等待和观察”测试。

通常,如果测试正在测试生成系统外部事件(如电子邮件、http请求或将文件写入磁盘)的代码,您可能会看到这种情况。

这样的测试也可能是一个本地英雄,因为当它在较慢的机器或过载的CI服务器上运行时,它将失败。

不要将“等待和观察”反模式与“睡眠者”混淆。

其他回答

肛门探测器

一个必须使用疯狂的、非法的或其他不健康的方式来执行其任务的测试,例如:使用Java的setAccessible(true)读取私有字段或扩展一个类来访问受保护的字段/方法,或者必须将测试放在某个包中以访问包的全局字段/方法。

如果您看到这种模式,则说明测试中的类使用了过多的数据隐藏。

这与Inspector之间的区别在于,被测类甚至试图隐藏需要测试的内容。因此,您的目标不是实现100%的测试覆盖率,而是能够测试任何东西。想象一个只有私有字段的类,一个没有参数的run()方法,而且根本没有getter。在不违反规则的情况下,没有办法进行测试。


Michael Borgwardt评论:这并不是一个真正的测试反模式,它是一种实用主义,用于处理被测试代码中的缺陷。当然,最好是修复这些缺陷,但在第三方库的情况下,这可能是不可能的。

Aaron Digulla:我有点同意。也许这个条目真的更适合“JUnit HOWTO”wiki,而不是反模式。评论?

慢戳

运行极其缓慢的单元测试。当开发人员开始测试时,他们有时间去洗手间,抽根烟,或者更糟的是,在一天结束回家之前开始测试。(来源:James Carr的帖子)

也就是那些不会像它们应该的那样频繁地运行的测试

沉睡者,又名维苏威火山,尼克·佩洛

注定在未来某个特定时间和日期失败的测试。这通常是由于在测试使用Date或Calendar对象的代码时不正确的边界检查造成的。有时,如果在一天中非常特定的时间(如午夜)运行测试可能会失败。

不要将“潜伏者”与“等待和观察”反模式混淆。

这些代码早在2000年之前就已经被替换了——许多开发人员在1960年就被替换了

愉快路径

测试保持在满意的路径上(即预期的结果),而不测试边界和异常。

JUnit 反模式

以铁链锁住一群做苦工的囚犯

必须以特定顺序运行的几个测试,即一个测试改变了系统的全局状态(全局变量,数据库中的数据),而下一个测试依赖于它。

您经常在数据库测试中看到这种情况。测试不会在teardown()中执行回滚,而是将更改提交给数据库。另一个常见的原因是对全局状态的更改没有包装在try/finally块中,如果测试失败,这些块将被清理。