何时testing不是unit testing?
我正在寻找像这样的规则:
如果符合以下条件,则testing不是unit testing:
- 它与数据库进行通信
- 它不能与其他testing并行运行
- 使用registry或文件系统等“环境”
那里还有什么?
见Michael Feathers的定义
一个testing不是一个unit testing,如果:
- 它与数据库交谈
- 它通过networking进行通信
- 它涉及到文件系统
- 它不能和其他任何unit testing同时运行
- 你必须对你的环境做特别的事情(比如编辑configuration文件)来运行它。
如果testing不是unit testing,则不是unit testing。
严重的是,这就是它的一切。
unit testing中“单元”的概念没有明确的定义,事实上,到目前为止我发现的最好的定义实际上并不是一个定义,因为它是循环的:unit testing中的单元是最小的可以单独进行testing。
这给你两个检查点:它是孤立的testing吗? 这是最小的可能吗?
请注意,这两个都是依赖于上下文的。 在一种情况下(也就是整个对象),可能最小的事情可能在另一种情况下只有一个单一方法的一小部分。 在另一种情况下,隔离可能是另一种情况(例如,在内存pipe理的语言中,你从来不会孤立于垃圾收集器运行,大部分时间是不相关的,但有时可能不是这样)。
它没有断言,也不期望抛出exception。
很难…
对于我来说,一个unit testing可以单独validation一个特定的逻辑。 意思是,我采取了一些逻辑,从其余的(如果必要的话,通过嘲笑依赖关系)中提取出来,并通过探索不同types的可能的控制stream来testing这个逻辑 – 一个整体的单元。
但在另一方面,我们可以总是100%说正确或不正确的? 不要成为哲学,但是 – 正如迈克尔在他的文章中所说 :
做这些事情的testing并不坏。 通常他们是值得写的 ,他们可以写在一个unit testing线束。 但是,能够将它们与真正的unit testing分开是非常重要的,这样我们就可以保留一组testing,以便在进行更改时能够快速运行。
那么,为什么我不应该写一个unit testing,通过访问我的testing文件夹中的文件系统的某个虚拟文件来validationparsing逻辑,例如一个xls文件(就像MStesting允许DeploymentItem一样)?
当然,如前所述,我们应该将这些testing与其他testing分开(也许在JUnit的单独testing套件中)。 但是我认为如果他觉得在那里感觉舒服的话,也应该写这些testing……显然,总是要记住unit testing应该单独testing一个testing。
在我眼中最重要的是这些testing运行速度快,不需要太长时间,可以反复运行。
在下列情况下,testing不是unit testing:
- 它一次testing多个事物(即testing两个事物如何协同工作) – 那么这是一个综合testing
好的unit testing清单:
- 他们是自动的
- 它们是可重复的
- 他们很容易实现
- 一旦写入,它们仍然用于未来的使用
- 他们可以被任何人运行
- 他们可以通过按下button来运行
- 他们跑得很快
一些更好的实践(没有特别重要的顺序):
- testing应该与集成testing(较慢)分离,以便尽可能频繁地运行
- 它们不应该包含太多的逻辑(最好是没有控制结构)
- 每个testing应该只testing一件事(因此,它们应该只包含一个断言)
- 在断言中使用的期望值应该是硬编码的,而不是在testing运行时计算的
- 外部依赖关系(文件系统,时间,内存等)应该被存根replace
- testing应该在testing关机时重新创build初始状态
- 在断言中,最好使用“包含…”策略,而不是“严格等于…”策略(即我们期望集合中的某些值,string中的某些字符等)
这是我从Roy Osherove的书“unit testing的艺术”中提炼出来的知识的一部分
跨多个失败单元进行testing不会成为unit testing。
错综复杂的问题。
假设我要编写一些业务逻辑,所有业务逻辑都需要通过某种forms的DAL获取数据。
说为了testing的目的,我嘲笑DAL单元(通过创build“模仿鸟”)。
但是那些嘲讽鸟当然还有其他的单位。 所以即使在使用mock的时候,当我想对我的业务逻辑模块进行unit testing的时候,似乎还是会违背“没有其他单位参与”的想法。
当然,众所周知,“为DAL创造模仿鸟”可以使你的testing本身无效,因为你的模仿鸟在DAL的某些特定方面有所偏离。
结论:对任何forms的DAL,问号依赖的业务模块进行“真正的unit testing”是完全不可能的。
推测:唯一可能的(“真正的”!)unit testing是DAL本身,问号?
腐蚀的推测:由于“DAL”通常是ORM或者某些DBMS的DML,并且鉴于这些产品通常是作为“成熟的技术”购买的,那么做unit testing的附加价值是什么所以永远,问号?
在testing是否是unit testing之后,下一个问题是,这是一个很好的unit testing吗?