【发布时间】:2009-08-10 22:24:04
【问题描述】:
我正在寻找这样的规则:
如果满足以下条件,则测试不是单元测试:
- 它与数据库通信
- 它不能与其他测试并行运行
- 使用注册表或文件系统等“环境”
还有什么?
【问题讨论】:
-
除了上面所说的,检查一下:这个question。
-
Roy Osherove 对单元测试的定义:只在内存中,运行速度快,可重复,不触及任何外部资源
标签: unit-testing
我正在寻找这样的规则:
如果满足以下条件,则测试不是单元测试:
还有什么?
【问题讨论】:
标签: unit-testing
如果满足以下条件,则测试不是单元测试:
- 它与数据库对话
- 它通过网络进行通信
- 涉及文件系统
- 它不能与您的任何其他单元测试同时运行
- 您必须对您的环境做一些特殊的事情(例如编辑 配置文件)来运行它。
【讨论】:
如果一个测试没有测试一个单元,它就不是一个单元测试。
说真的,仅此而已。
单元测试中“单元”的概念并没有很好的定义,事实上,到目前为止我找到的最好的定义实际上并不是一个定义,因为它是循环的:单元测试中的单元是最小的可能的东西可以单独测试。
这为您提供了两个检查点:是否单独测试?它是最小的吗?
请注意,这两者都取决于上下文。在一种情况下可能是最小的东西(例如,整个对象)在另一种情况下可能只是一个单一方法的一小部分。在一种情况下被视为隔离的可能在另一种情况下(例如,在内存管理的语言中,您永远与垃圾收集器隔离运行,而且大多数时候这无关紧要,但有时它可能不是)。
【讨论】:
困难的...
对我来说,单元测试在隔离中验证一个特定的逻辑。意思是,我采取一些逻辑,从其余部分中提取它(如果有必要通过模拟依赖项)并通过探索不同类型的可能控制流来测试该逻辑 - 一个(整体)单元。
但另一方面...我们可以总是 100% 说正确或不正确吗?不要成为哲学,而是 - 就像Michael says在他的帖子中一样:
执行these things 的测试还不错。 它们通常值得写,而且它们 可以写在单元测试工具中。 然而,重要的是能够 将它们与真正的单元测试分开,所以 我们可以保留一组测试 每当我们使我们的 变化。
那么,为什么我不应该编写一个单元测试,通过访问我的测试文件夹中的文件系统中的一些虚拟文件来验证解析例如 xls 文件的逻辑(例如 MS 测试允许使用 DeploymentItem)?
当然——如前所述——我们应该将这些测试与其他测试分开(可能在 JUnit 中的单独测试套件中)。但我认为,如果他觉得在那儿有这些测试很舒服的话,他也应该编写这些测试......显然,然后总是再次记住单元测试应该只测试一个单独的部分。
在我看来,最重要的是这些测试运行速度很快,而且不需要太长时间。它们可以重复且非常频繁地运行。
【讨论】:
它没有断言,并且不期望抛出异常。
【讨论】:
Assert.Fail() 或等效的测试方法的最后一行。这样,它将“默认失败”
在以下情况下测试不是单元测试:
良好的单元测试清单:
更多最佳实践(按重要性不分先后):
这是我从 Roy Osherove 的书中提取的部分知识 - The Art of Unit Testing
【讨论】:
跨多个可能失败的单元实施测试不是单元测试。
【讨论】:
错综复杂的问题。
假设我要编写一些业务逻辑,所有业务逻辑都需要通过某种形式的 DAL 获取数据。
假设出于测试目的,我模拟了 DAL 单元(通过创建“知更鸟”)。
当然,那些知更鸟本身就是额外的单位。因此,即使使用模拟,当我想对我的业务逻辑模块进行单元测试时,我似乎仍然会违反“不涉及其他单元”的想法。
当然,众所周知,“为 DAL 创建模仿鸟”会使您的测试本身无效,因为您的模仿鸟在某些特定方面偏离了 DAL。
结论:完全不可能对以任何方式依赖于任何类型 DAL 的业务模块进行“真正的单元测试”,问号?
推论:唯一可能(“真正”!)单元测试的是 DAL 本身,问号?
推论的推论:鉴于“DAL”通常是 ORM 或某些 DBMS 的 DML,并且鉴于这些产品通常作为“经过验证的技术”购买,那么做任何事情的附加价值是什么?单元测试,问号?
【讨论】:
确定一个测试是否是单元测试之后,下一个问题是,它是good unit test吗?
【讨论】: