单元测试反模式目录

反模式 :必须有本正式从一个简单的坏习惯,不好的做法,还是坏主意区分实际的反模式至少有两个关键因素:

  • 的动作,过程或结构有些重复的模式,最初似乎是有利的,但最终产生比有益的结果更坏的后果,
  • 一个重构的解决方案,也有明确说明,证明在实际操作中,可重复的。

投票支持你所看到的“野生”一时间太多了TDD的反模式。
由詹姆斯·卡尔的博客文章和testdrivendevelopment yahoogroup相关讨论

如果您发现一个“未命名”一张贴'时间了。 每个反模式的一个后请让投票的东西。

我的既得利益是找到前n个子集,这样我可以讨论“时间在一个饭盒满足在不久的将来。

--------------解决方案-------------

二等公民 -测试代码是没有得到很好重构的生产代码,包含了大量的重复代码,使其难以维持的测试。

免费乘车/背驮式 -詹姆斯·卡尔,蒂姆·奥廷格
而不是写一个新的测试用例方法测试另一/不同的特性/功能 ,一个新的断言(及其相应行动从AAA即法的步骤)在现有的测试案例以及游乐设施。

快乐路径

测试停留在幸福的路径(即预期的结果)没有测试边界和异常。

JUnit的反模式

本地英雄

测试用例是依赖于特定于它是写在以运行开发环境的东西。 其结果是测试通过发展箱子,但是当有人试图在其他地方运行失败。

隐藏的依赖

密切相关的当地的英雄,一个单元测试,需要一些现有数据已经​​填充的地方在试运行之前。 如果未填充的数据,测试将失败,并留下什么迹象给开发者什么希望,或者为什么......迫使他们通过英亩的代码来挖掘,找出它是使用数据从何而来。


可悲的是看到了这一点太多次与这取决于模糊多变的.ini文件这是经常出在任何给定的生产系统同步古代.DLL文件,更不用说现存你的机器上没有与负责这些DLL的三位开发广泛的协商。 叹。

链钢

一对夫妇的测试,必须在一定的顺序运行的,即一个测试改变系统(全局变量,数据库中的数据)和下一个测试(多个)取决于它的全局状态。

你经常会看到这样的数据库测试。 而不是做一个回滚teardown()测试提交他们的修改到数据库中。 另一个常见原因是,改变全局状态是不是裹着的try / finally块它清理,测试的失败。

嘲弄
有时嘲讽可以很好的和方便的。 但有时开发者可能会失去自己和他们的努力,以模拟出什么没有被测试。 在这种情况下,一个单元测试包含了许多嘲笑,存根,和/或伪造所测试的系统甚至没有被测试在所有的,而不是从嘲笑返回的数据是什么正在被测试。

来源:詹姆斯·卡尔的职位。

沉默的守望者 -凯莉?
一个测试,如果通过抛出一个异常..即使实际发生的异常是一个比一个开发商预想的不同。
另请参见:秘密的守望者

[Test]
[ExpectedException(typeof(Exception))]
public void ItShouldThrowDivideByZeroException()
{
// some code that throws another exception yet passes the test
}

检查员
一个单元测试,违反了封装,努力实现100%的代码覆盖率,但知道这么多关于什么是该对象中要体现在单元测试的任何企图重构将打破现有的测试,并要求任何改变事情。


“我怎么测试我的成员变量,而没有让他们公开... 只是单元测试?”

过多的设置-詹姆斯·卡尔
一个测试,需要巨大的设置,以甚至开始测试。 有时几百行代码用于制备环境进行一次检查,与参与几个对象,它可以使难以真正弄清什么测试由于所有设置正在进行的“噪音”。 (源:詹姆斯·卡尔的职位)

肛门探头

测试有使用疯狂,非法或不健康的方式来执行任务,如:阅读使用Java的setAccessible(真)或扩展一个类来访问受保护的字段/方法的私有字段或不得不把测试在一定的包访问包全局字段/方法。

如果你看到这个模式,测试使用下的类数据太多隐藏。

这与检查专员之间的区别是所测试的类试图掩盖甚至你需要测试的东西。 所以,你的目标是不是实现100%的测试覆盖率,但要能在所有测试任何东西。 认为只有私人领域,一个一类run()方法不带参数,没有干将可言。 没有办法来测试这不会破坏规则。


评论由迈克尔·博格瓦特: 这是不是一个真正的考验反模式,这是实用主义处理代码中的不足之处进行测试。 当然,这是更好地解决这些缺陷,但可能无法在第三方库的情况。

亚伦Digulla:我种的认同。 也许这个词条真的是更适合于一个“JUnit的HOWTO”维基而不是一个反模式。 评论?

测试用无名 -尼克Pellow

这被添加到重现bug跟踪一个特定的错误的测试,其作者认为不保证它自己的名字。 相反,提高现有的,缺乏测试,新测试将创建一个名为testForBUG123。

两年后,当测试失败,您可能需要先尝试和发现的BUG-123在您的bug跟踪系统找出测试的意图。

慢打个招呼

运行慢得令人难以置信单元测试。 当开发人员踢了,他们有时间去洗手间,抢烟,或更糟的是,打完测试过才回家在一天结束。 (源:詹姆斯·卡尔的职位)

又名不会得到运行频繁,他们应该测试

蝴蝶

你必须测试的东西其中包含时刻都在变化,等,其包含当前日期的结构数据,并且没有办法钉结果下降到一个固定的值。 丑陋的部分是,你不关心这个价值可言。 它只是使不添加任何价值您的测试更为复杂。

它的翅膀的蝙蝠会导致飓风在世界的另一边-爱德华·罗伦兹,蝴蝶效应

闪烁的测试(来源:罗米利科金)

测试这只是偶尔出现故障,不能在特定的时间,而且一般是由于种族测试中的条件。 通常情况下测试的东西是异步的,如JMS时出现。

可能是一个超级设置为'观望'反模式和'沉睡'反模式。

构建失败了,哦,只需再次运行构建-匿名开发者

等着瞧

运行一些设置代码,然后测试需要“等待”的一个特定的时间,才可以'看'如果被测代码充当预期。 它使用了Thread.sleep()或同等学历TestMethod的肯定是一个“观望”的考验。

通常情况下,你可能会看到这一点,如果测试是测试生成系统外部的事件,例如电子邮件,HTTP请求或文件写入到磁盘上的代码。

这样的测试也可以是本地英雄因为它将FAIL上较慢的框或超载CI服务器运行时。

观望反模式是不与梦之混淆。

不适当地共享夹具 -蒂姆·奥廷格
在测试夹具几个测试用例甚至不使用或需要安装/拆卸。 部分原因是由于开发惯性来创建一个新的测试夹具...容易只是增加一个测试用例到桩

巨人

单元测试,虽然它是有效测试的测试对象,可以跨越千行,并包含很多很多测试案例。 这可能是一个指标,根据测试,该系统是一个神的对象(詹姆斯·卡尔的职位)。

一个肯定的迹象这个人是一个测试,跨越多个代码AA几行。 通常情况下,测试非常复杂,它开始包含其自身或片状行为的错误。

我相信,当我看到一些闪烁的图形用户界面
不健康的固定/痴迷通过其GUI测试应用程序“就像一个真正的用户”

通过GUI测试的业务规则是耦合的可怕的形式。 如果您通过GUI写上千次试验,然后改变你的图形用户界面,上千次的试验打破。
相反,测试通过GUI界面不仅事,夫妇GUI来一个虚拟的系统,而不是真正的系统中,当您运行这些测试。 通过不涉及GUI的API测试业务规则。 鲍勃 - 马丁

“你必须明白,眼见为实,但也知道,相信是看到。” -丹尼斯·威特利

在梦之,又名维苏威火山 -尼克Pellow

发往一个试验来FAIL在未来某些特定的时间和日期。 这通常是由不正确的边界时测试它使用日期或Calendar对象代码检查造成的。 有时候,如果运行在一天中的一个非常具体的时间,如午夜的测试可能会失败。

“沉睡”并不是要与'观望'反模式相混淆。

该代码将被取代长期在2000年之前 -许多开发商在1960年

枯树

测试这其中,存根被创建,但测试实际上并没有写入。

其实我也看到了这一点在我们的生产代码:

class TD_SomeClass {
public void testAdd() {
assertEquals(1+1, 2);
}
}

我甚至不知道该怎么想的。

通过了今天这个位:

湿地
测试创建一个地方持续的数据,但是,当考完试不清理。 这将导致测试(同样的测试,或可能的其它测试),以后续的测试运行失败。

在我们的例子中,测试留下的文件中的“临时”目录躺在身边,从跑测试中第一次的用户权限。 当其他用户试图测试在同一台机器上:热潮。 在詹姆斯·卡尔的网站上的评论,乔金 - Ohlrogge提到这为“邋遢工作者”,它的灵感来源于“慷慨剩菜”的一部分。 我喜欢我的名字变得更好(更小的侮辱,更熟悉)。

杜鹃 -弗兰克·卡弗
单元测试它坐落在一个测试用例数人,并享有相同的(可能很长)安装过程中的测试案例的其他测试,但后来放弃部分或全部的文物从安装和创建自己的。
不适当地共享夹具:高级症状

秘密守望者 -弗兰克·卡弗
第一眼会出现一个测试是做不测试,由于缺少断言。 但是“魔鬼在细节”。该测试是真正依靠一个异常被抛出,并期待测试框架捕获该异常并将其报告给用户失败。

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

环境防暴

A'单位'测试,各种需求'开始蔓延伸到它的环境,使用和设置环境变量/端口。 运行两个这些测试的同时会造成“不可用口'异常等。

这些测试将是间歇性的,并留下开发商说这样的话“只是再次运行”。

一溶液的Ive看到的是随机选择要使用的端口号。 这减少了冲突的可能性,但显然犯规解决问题。 所以,如果可以的话,总是嘲笑代码,以便它实际上并不分配不能分享资源。

图灵测试

由具有多了一些昂贵的工具自动地生成一个TestCase,许多断言从类测试使用一些太聪明按半数据流分析中获得。 暂时平息开发商陷入信任一种虚假的安全感,他们的代码是很好的测试,从设计和维护的高品质检验的责任免除他们。 如果机器可以写测试你的,为什么不能吸合,其手指出和写入应用程序本身!

你好笨-世界上最聪明的计算机到新的学徒(从旧的Amiga漫画)。

四十右脚单刀测试

怕过于接近,他们正试图测试类,这些测试的行为在远处,用抽象的无数层和数以千计的他们正在检查的逻辑行代码的分离。 因此,他们非常脆,容易受到各种各样的副作用的发生在史诗般的旅程,并从阶级的利益。

分身

为了测试一些东西,你必须在测试复制的代码部分到一个新的类具有相同的名称,包装,你必须使用类路径的魔法或自定义类加载器,以确保它是可见的第一个(让您的副本拾取向上)。

这种格局表明隐藏的依赖关系,你不能从测试控制不健康的量。

我看着他的脸......我的脸! 它像一面镜子,但让我浑身冰冷。

母鸡 -弗兰克·卡弗
一个常见的​​设置,其中确实远远超过了实际测试的情况下需要。 例如制造各种填充显然重要和独特的值,当仅测试断言为存在或不存在的东西复杂的数据结构。
不适当地共享夹具:高级症状

我不知道它做什么......我加入它无论如何,以防万一-匿名开发者

测试它全部

我不能相信这并没有被提及到现在,但是测试不应该打破单一职责原则

我所遇到的这个这么多次,这打破了这个规则测试是通过定义一个噩梦维护。

线安打

在第一次看测试涵盖了与代码覆盖工具确认其与100%,但在现实中测试只打代码,而无需任何输出分析。

覆盖-VS-可达代码

分类:单元测试 时间:2012-01-01 人气:1
本文关键词: 单元测试,TDD,反模式
分享到:

相关文章

  • 是嘲弄一个TDD的反模式? 2014-10-25

    我读了这个答案,告诉嘲弄是TDD的反模式. 可是等等! 我们要模拟/存根所有依赖编写单元测试. 在其他情况下,这将是一个集成测试. --------------解决方案------------- 过度使用mock对象可以是一个反模式,不是嘲笑自己. 这是真的,你需要模拟/存根你的依赖,但是当你的类有太多的依赖,可能需要更多的时间和精力去嘲笑和电线都正确,而不是写类本身. 和嘲讽的定义非常脆弱,容易折断,什么是某种针对TDD规则. 太多的依赖意味着要么你的类是某个神的对象,需要进行重构或者是一些顶

  • 单一职责原则VS贫血领域模型反模式 2013-11-26

    我在一个项目中,是以单一职责原则很严重. 我们有很多的小班授课,事情很简单. 然而,有气无力的领域模型 - 没有在任何我们的模型类的无行为,他们只是财产袋. 这不是一个关于我们的设计的投诉 - 它实际上似乎工作得很好 在设计的评价,SRP是带出,每当新的行为被添加到系统中,并因此新的行为通常在一类新的结束. 这使事情变得很容易单元测试,但我很困惑,有时是因为它感觉像拉的行为了地方,它是相关的. 我想提高我的如何正确使用SRP的理解. 在我看来,这SRP是反对加入共享同样的情况下,以一个对象业务建

  • 什么反模式这是否常见的编程错误而下跌 2012-03-05

    对于一个编程项目, 假设程序员已经在很多地方不同的命名风格类似的功能,例如... int ask_bro_4_data(); 而另一个为 int ask_mom_for_data(); 这并不代表什么反模式? 从本质上讲,它是缺乏标准化吧? 如,一个函数用来,在其他用途​​4. 相若程序员可能以某种方式,涉及到它们的使用,但未能在任何情况下这样做,或以非标准化的方式这样做的命名变量. 这使得寻找在一个大的代码库,这些变量,因为它们可能不会跟随你认为他们会命名条件更难. 有任何想法吗? 很抱歉的不

  • 依赖注入链反模式? 2012-07-16

    这是问题所在,可以说我们做一个游戏,并且希望使用依赖注入. 这是我们所拥有的: Game Class // This is just the code to keep track of the overall game logic Character Class // This would be the guys in the game, good and bad guys both Weapon Class // The weapons for the characters 因此,一般来说,当

  • 当你使用反射? 模式/反模式 2014-02-02

    据我所知,反射API(在C#),但我不知道在什么情况下,我会使用它. 哪些模式 - 反模式使用反射? --------------解决方案------------- 我用在C#中反射的东西的地方只有在基于配置文件的信息工厂的模式,在这里我创建对象(在我的情况下,网络监听器). 在配置文件中提供的组件的位置,在其中的种类的名称,以及所需要的任何额外参数. 工厂拿起这些东西并创建了一个基于的听众. 在一个产品我工作的,我们使用了很多,但反思是一个复杂的,缓慢的野兽. 不要去寻找的地方使用它,只是因为

  • 是静态方法DI反模式? 2014-02-07

    我是谁开始掌握依赖注射的全功率Java开发人员,并且它突然对我说明白没有办法注入一个静态方法. 所以,我开始思考: 是静态方法DI反模式? 更重要的是:如果我要拥抱依赖注入,这是否意味着我需要停止编码静态方法? 我问,因为没有办法来嘲笑他们,并在单元测试,这是一个巨大的关断为我注入模拟静. 编辑 :我知道,"包装",并注入现有的静态方法的常用的方法是这样的: public class Foo { public static void bar() { ... } } public int

  • 难道又是一个反模式注入DI容器(几乎)每个班级? 2014-03-19

    最近我发现自己不关心太多的依赖项一类,并通过他们在构造函数中,但我只是一直通过DI容器,并保持在一个私有属性. 这样,我的课不会有非常明确的依赖关系,我得到一切从容器中,当我需要它. 不知怎的,我对这个解决方案,但(除了因访问容器的开销)不良情绪,但是我真的不能想太多缺点. 也许有依赖宽松的定义可以减少一类的便携性,或重构时,我得到的惊喜......? 你觉得这个怎样? --------------解决方案------------- 绝对错误的. 不要把对象的DI容器; 他们不需要知道或关心他们

  • 什么类型的编码反模式,当你越过他们老是重构? 2014-11-03

    我只是重构一些代码,是在类的不同部分我的工作,因为它是一系列嵌套条件运算符(?:)这是做了一个更清晰的每吨由一个相当简单的开关语句(C#). 你什么时候会触及代码不直接您正在从事的工作,使之更加清楚了吗? --------------解决方案------------- 我曾经是重构和碰到像这样的代码: string strMyString; try { strMyString = Session["MySessionVar"].ToString(); } catch { strMySt

  • 披着log4net的,以降低耦合反模式? 2015-03-15

    披着log4net的,以降低耦合反模式? 或注射的记录器实例变成公共财产的反模式? 你如何接近log4net的依赖? --------------解决方案------------- 总结一个记录器下面的原因 - 它隔离的变化只记录仪,在未来,如果你想改变它的东西更没有级联变化. 它使您的生活更轻松,当你想要编写测试用例. 您可以轻松地模拟所需要的东西. 如果由于某种原因,你需要在你的应用不止一个记录器,然后包装帮助. 您可以通过一些工厂/注册表,更改记录. 前 - 如果代码中,你希望有不同的记录

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.804 (s). 10 q(s)