Unit testing 我应该什么时候删除mock?
以前,当依赖接口的实现不可用时,我在TDD(测试驱动开发)中使用了mock。所以我模仿了这些依赖关系并测试了我的工作 现在可以使用依赖项的实现。那么,我应该删除mock还是将它们转换为spy或类似的?我认为集成测试只能在删除这些模拟之后进行,否则我可能不得不复制它们。我有点困惑,有什么建议吗?一如既往:视情况而定 如果您使用的是mock,那么您将针对定义的接口进行测试,因此您的单元测试将更加集中,并且测试中的破坏性更改可能会更少(例如,当内部需要重构时)Unit testing 我应该什么时候删除mock?,unit-testing,Unit Testing,以前,当依赖接口的实现不可用时,我在TDD(测试驱动开发)中使用了mock。所以我模仿了这些依赖关系并测试了我的工作 现在可以使用依赖项的实现。那么,我应该删除mock还是将它们转换为spy或类似的?我认为集成测试只能在删除这些模拟之后进行,否则我可能不得不复制它们。我有点困惑,有什么建议吗?一如既往:视情况而定 如果您使用的是mock,那么您将针对定义的接口进行测试,因此您的单元测试将更加集中,并且测试中的破坏性更改可能会更少(例如,当内部需要重构时) 如果您使用的是实际的依赖项,那么您的单元
如果您使用的是实际的依赖项,那么您的单元测试就没有那么集中(它们可能是集成测试)。因此,这些测试通常速度较慢,设置起来更困难,重构时更容易中断。另一方面,由于您是针对实际实现进行测试,您更有可能发现错误,因为实际实现的行为与您预期的不同。就单元测试而言-从不。通常是因为您希望保持单元测试的隔离:
- 您的单元测试(就像任何其他类一样)通常只有一个更改/中断的原因。当错误发生时,您希望将可能的违规者数量减少到绝对最小。由于某些依赖项可能失败,或者其他依赖项可能失败,或者最终实际测试的类可能失败而导致单元测试失败是不可接受的
模拟应该用来隔离你的单位。当然,在编写不同类型的测试(比如集成)时,您不需要隔离。您需要真正的组件协同工作。这是使用实际实现而不是模拟的原因之一-但是这不会使单元测试无效。它们应该保持孤立。IMO,模拟是一种平衡行为,我通常模拟更复杂和不确定的接口。我想我明白你的意思了,我应该同时保留“模拟依赖关系的单元测试”和“使用真实对象检查集成的单元测试”。看来我的单元测试代码要加倍了。@RahulKulshreshtha:是的。您需要两种类型的测试。单元-验证低级行为(单元)和集成,以确保类按预期协同工作。集成测试通常会测试更大的进程(例如,是否从数据库中获取实体,是否已解析并保存到其他数据库),而单元测试将单独检查进程的部分(例如,解析器逻辑和边缘情况)。通常不需要删除测试,但可能需要同时删除这两个测试。通过进行单元测试和集成测试,通常更容易找出问题发生的位置。即使您的单元和集成测试基本相同,这也是正确的,只是您在其中一个测试中使用mock,而在另一个测试中不使用mock。