我正在寻找类似以下规则的内容:
如果一个测试符合以下条件之一,它就不是一个单元测试:
- 与数据库通信
- 无法与其他测试同时运行
- 使用“环境”(如注册表或文件系统)
还有哪些条件呢?
我正在寻找类似以下规则的内容:
如果一个测试符合以下条件之一,它就不是一个单元测试:
还有哪些条件呢?
如果以下情况发生,那么一个测试就不是单元测试:
- 需要读写数据库
- 需要进行网络通信
- 需要涉及文件系统
- 无法与其他单元测试同时运行
- 需要对环境进行特殊操作(例如编辑配置文件)才能运行
如果测试不是在测试一个单元,那它就不是一个单元测试。
事实上,这就是全部内容。
“单元”在单元测试中的概念并没有明确定义,实际上,迄今我找到的最好的定义并不算是一个定义,因为它是循环的:单元测试中的一个单元是可以在孤立的情况下进行测试的最小可能的东西。
这给你两个检查点:它是否在孤立的情况下进行测试?它是最小可能的东西吗?
请注意,这两个都是依赖于上下文的。在某些情况下(例如整个对象),可能是最小可能的东西,但在另一种情况下,仅仅是单个方法的一小部分。在某些情况下,孤立的定义也会不同(例如在内存管理语言中,您永远无法与垃圾收集器隔绝开来,大多数情况下这并不重要,但有时候可能并非如此)。
这是一个比较难的问题...
对我来说,单元测试是验证独立某一特定逻辑的方式。也就是说,我会将某些逻辑从整体中提取出来(如果需要通过模拟依赖项),然后仅测试这个逻辑——一个单元(整体的一部分)——以探索不同种类的可能控制流。
但另一方面...我们能否总是100%确定正确或错误??不想陷入哲学,但正如Michael在他的帖子中所说:
执行这些操作的测试并不是坏事。 它们通常值得编写,并且可以在单元测试工具中编写。 然而,重要的是要能够将它们与真正的单元测试分开, 这样我们就可以保持一组测试,在每次进行更改时都可以快速运行。
那么为什么我不能编写一个单元测试,通过访问测试文件夹中的某个虚拟文件(例如MS测试允许使用DeploymentItem)来验证解析xls文件的逻辑呢?
当然——如上所述——我们应该将这些测试与其他测试分开(可能在JUnit的单独测试套件中)。但我认为,如果他们感到舒适,一个人也应该编写这些测试...当然又要记住,单元测试只应该测试隔离的一部分。
在我看来,最重要的是这些测试运行快速,并且不要花费太长时间,以便可以重复运行和频繁运行。
此代码没有断言,并且不希望抛出异常。
Assert.Fail()
或等效内容包含在测试方法的最后一行中。这样,它就会“默认失败”。 - pgb当测试同时测试多个事情时(即测试两个事物如何协同工作),它不是单元测试,而是集成测试。
好的单元测试清单:
更多最佳实践(没有特定的重要性顺序):
这是我从Roy Osherove的书《The Art of Unit Testing》中提取出来的知识的一部分。
复杂的问题。
假设我要编写一些业务逻辑,所有业务逻辑都需要通过某种形式的数据访问层(DAL)来访问数据。
为了测试目的,我模拟了DAL单元(通过创建“mockingbirds”)。
但是这些mockingbirds当然也是它们自己的附加单元。因此,即使使用mocks,当我想对业务逻辑模块进行单元测试时,似乎仍然会违反“没有其他单元参与”的想法。
当然,通常人们知道,“为DAL创建mockingbirds”可能会使您的测试本身无效,因为您的mockingbird在某些特定方面偏离了DAL。
结论:对于任何以任何方式依赖于任何类型的DAL的业务模块,都不可能进行“真正的单元测试”,是吗?
推论:唯一可能进行“真正的”单元测试的是DAL本身,是吗?
推论的推论:鉴于“DAL”通常是ORM或某个DBMS的DML,而且这些产品通常被认为是“经过验证的技术”,那么进行任何单元测试的附加价值是什么,是吗?