我正在学习有关测试驱动开发的在线课程,并遇到了测试替身的概念。根据课程中测试替身的定义:
测试双打:测试替身是在单元测试中用于替代实际生产系统协作者的对象。
我知道测试双打是什么意思了。但后来有人提到,测试替身有多种类型。课程中提到的内容是:
Dummy:可以根据需要传递的对象,但没有任何类型的测试实现,因此永远不应该使用。
Fake:这些对象通常具有足以测试的特定接口的简化功能实现
但不用于生产。
Stub:这些对象提供了适合测试的预设答案的实现。
Spies:这些对象提供记录传入值的实现,以便测试可以使用它们。
Mocks:这些对象经过预先编程以期望特定的调用和参数,并且可以在必要时抛出异常。
我以前使用过模拟,并且对它们是什么以及如何使用它们有一个简短的了解。尽管我对其他提到的测试替身类型感到困惑。
有人可以帮助我了解这些类型的测试替身之间的区别以及何时使用测试替身吗?
有用的文献,
- from Martin Fowler:
- 测试双精度 https://martinfowler.com/bliki/TestDouble.html
- 模拟不是存根 https://martinfowler.com/articles/mocksArentStubs.html
- from Sandi Metz:
- 测试的魔术 https://www.youtube.com/watch?v=URSWYvyc42M
虚拟是一种奇怪的情况,因为您使用虚拟是因为被测试的代码实际上并不使用虚拟;换句话说,系统的组成需要你提供一些多余的元素。通常,这暗示您正在测试的逻辑应该可以通过更具体的接口访问。
当测试场景要求被测代码从某些依赖项获取值时,通常会使用存根和假冒。
存根非常集中;它不会假装在内部做正确的事情,而只是返回一些预设的答案。例如,您可以使用存根来模拟特定的故障模式。
Fake 的名字很糟糕——它是依赖项的真实实现,只是针对测试(小型、确定性、在内存中)进行了优化,而不是针对生产(规模)进行了优化。在某些圈子里,你会听到代替 https://github.com/eventide-project/useful-objects#substitutes,而不是“假”。
当您尝试确定代码是否将正确的信息发送到依赖项而不需要耦合到该依赖项时,通常会使用间谍和模拟。
间谍通常会维护他们在测试期间收到的消息历史记录,稍后可以根据预期消息列表进行验证。模拟是该想法的更积极的表达,其中在场景运行时(而不是事后)对被测代码的行为进行断言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)