写“unit testing”的代码?

你使用什么样的做法来使你的代码更友好的unit testing?

  • TDD – 首先编写testing,强制您考虑可testing性,并帮助编写实际需要的代码,而不是您认为可能需要的代码

  • 重构接口 – 使嘲笑更容易

  • 公共方法虚拟,如果不使用接口 – 使嘲笑更容易

  • dependency injection – 使嘲笑更容易

  • 更小,更有针对性的方法 – testing更专注,更容易编写

  • 避免静态类

  • 避免单身人士,除非有必要

  • 避免密封的课程

dependency injection似乎有帮助。

先写testing – 这样,testing驱动你的devise。

  1. 使用TDD
  2. 在编写代码时,尽可能地利用dependency injection
  3. 编程接口,而不是具体的类,所以你可以替代模拟实现。

确保你所有的课程都遵循单一责任原则 。 单一责任意味着每个class级都应该有唯一的责任。 这使得unit testing更容易。

编写testing时(与其他软件任务一样)不要重复自己(DRY原则)。 如果您的testing数据对于多个testing有用,那么将其放在两个testing都可以使用的地方。 不要将代码复制到两个testing中。 我知道这似乎是显而易见的,但我总是看到它发生。

最简单的方法是不要检查你的代码,除非你使用它检查testing。

我不是第一个写testing的巨大粉丝。 但是我非常相信的一件事是代码必须通过testing来检查。 甚至在一个小时之前,还没有 。 我认为,只要他们一起进来,他们写的顺序就不那么重要了。

小,高度凝聚力的方法。 我苦苦学习 想象一下你有一个处理authentication的公共方法。 也许你做了TDD,但是如果方法很大,将很难debugging。 相反,如果#authenticate方法以更伪代码的方式进行填充,调用其他小方法(可能是受保护的),那么当出现错误时,为这些小方法编写新的testing并找出错误的方法很容易。

还有一些你在OOP中学到的第一件事,但这么多似乎忘记了: 代码反对接口,而不是实现

花一些时间重构不可testing的代码以使其可testing。 写testing并获得95%的覆盖率。 这样做教我所有我需要知道的关于编写可testing的代码。 我并不反对TDD,但是学习代码可testing性或不可testing性的细节有助于您在devise时考虑可testing性。

不要写不可testing的代码

我相信我会被选为这个,但我会发表意见无论如何:)

虽然这里的许多build议都很好,但我认为这需要稍微锻炼一下。 目标是编写更可靠和可维护的健壮软件。

目标不是要有unit testing的代码。 尽pipe可testing的代码不是目标,但是为了使代码更“可testing”,还有很多努力。 这听起来真的很好,我相信它给人们带来了温暖的模糊,但事实是,所有这些技术,框架,testing等都是有代价的。

他们花费时间在培训,维护,生产力开销等方面。有时它是值得的,有时候不是,但是你不应该把盲目的东西放在眼前,而是要让你的代码更“可testing”。

我尽可能使用testing驱动开发,所以我没有任何代码不能被unit testing。 除非unit testing首先存在,否则不会存在。

 1.Using a framework/pattern like MVC to separate your UI from you business logic will help a lot. 2. Use dependency injection so you can create mock test objects. 3. Use interfaces. 

看看这个谈话自动化testing模式和气味 。 对我来说主要的一点就是确保UnitTest代码质量高。 如果代码是有据可查的,写得很好的话,每个人都会有动力保持这种状态。

没有静力学 – 你不能嘲笑静力学。

另外谷歌有一个工具,将衡量您的代码的可testing性…

我一直试图find一个unit testing不那么麻烦的事情,而且我真的很想做。 根据我的经验,一个相当大的因素是你的工具。 我做了很多ActionScript的工作,可悲的是,这些工具是有限的,比如没有IDE集成和缺乏更先进的嘲笑框架(但是好东西是即将到来的,所以没有抱怨!)。 我之前用更成熟的testing框架完成了testing驱动的开发,这确实是一个更愉快的经历,但仍然觉得有点麻烦。

不过最近我开始用不同的方式编写代码。 我曾经开始写testing,看他们失败,写代码,使testing成功,冲洗和重复,所有这一切。

但是,现在我开始编写界面,几乎不pipe我要做什么。 起初,我当然试图找出问题,并想出一个解决scheme。 然后我开始编写接口来获得代码和通信的抽象感觉。 在那个时候,我通常意识到,由于我没有充分认识到这个问题,我并没有真正想出解决问题的办法。 所以我回去,修改解决scheme并修改我的界面。 当我觉得接口反映我的解决scheme时,我实际上开始编写实现,而不是testing。 当我执行了一些东西(草稿执行,通常是婴儿步骤),我开始testing它。 我一直在回顾testing和实施之间,一步一步前进。 由于我有所有的接口,注入mock是非常容易的。

我觉得这样的工作,对于其他实现知之甚less,只能和接口交stream的课程,是非常自由的。 这让我不再考虑实施另一个class级,我可以把重点放在当前的单位上。 我只需要知道接口提供的合同。

但是,是的,我仍然在努力制定出一个超级超凡的程序 – 每一次都是如此。

哦,我还想补充一点,我不写testing的一切。 香草属性不太多,但得到/设置variables是无用的testing。 他们正在用语言合同来工作。 如果他们不这样做,我的问题比我的单位不可testing。

要准备好您的代码是可testing的:

  • logging你的假设和排除。
  • 避免做大于一件事情的大型复杂class级 – 牢记单一责任原则 。
  • 如果可能的话,使用接口来解耦交互,并允许注入模拟对象。
  • 在可能的情况下,使公共方法虚拟以允许模拟对象来模拟它们。
  • 如果可能,在devise中使用组合而不是inheritance – 这也鼓励(并支持)将行为封装到接口中。
  • 如果可能,请使用dependency injection库(或DI实践)为实例提供其外部依赖关系。

为了充分利用unit testing,请考虑以下几点:

  • 向您自己和您的开发团队介绍unit testing框架的function,嘲笑库以及您打算使用的testing工具。 当你真正开始编写你的testing时,理解他们能做什么和不可以做什么是至关重要的。
  • 在开始写作之前计划好你的testing。 确定要包含在testing中的边缘情况,约束条件,先决条件,后置条件和排除条件。
  • 尽可能修复破损的testing。 testing可帮助您发现代码中的缺陷和潜在问题。 如果你的testing被破坏了,你就打开了必须在以后修复更多东西的大门。
  • 如果您按照您的团队中的代码审查stream程,代码审查您的unit testing。 unit testing与其他代码一样,也是系统的一部分 – 评论有助于识别testing中的弱点,就像系统代码一样。

你不一定需要“让你的代码更友好”。

相反,可以使用嘲笑工具包来使可测性问题消失。 一个这样的工具包是JMockit 。