Art*_*uro 5 agile unit-testing mocking
你们是否会说使用模拟比不使用模拟更好?模拟仅用于单元测试,还是可以直接在原始项目中用作真实对象并在之后切换?
我一直在这里和那里读书,我发现最有吸引力的嘲笑是层隔离.
模拟在单元测试中绝对有用.当您想要单独测试依赖于B的A时,然后模拟B(带有预期的输入/输出)来测试A.您确保单独测试B以确保它是正确的.
在动态语言中,它们并非绝对必要.但是模拟框架可以帮助您验证您在模拟上设置的期望是否得到满足.
你永远不应该使用mock作为真正的实现.那类型的东西是笑话的东西."我们可以嘲笑整个申请!Yaaaaay!" 那是什么接口/等价物...
最终,可以说它"只是另一种方式".软件写了几十年,并且在没有嘲笑的情况下继续编写.
它主要是单元测试的设施.
模拟/存根真正发挥作用的地方是测试驱动开发.在没有模拟/存根的情况下面临的问题是,应用程序中的依赖关系网通常是这样的,您必须在编写测试之前构建几乎整个应用程序,即使这样您也在测试更大的功能部分,这样隔离bug变得更加困难.
考虑以下:
ClassA并编写测试来验证其行为.ClassA需要从中获取数据RepositoryM.RepositoryM以便我可以测试ClassA.RepositoryM.RepositoryM确实需要ServiceX填充其数据.ServiceX所以我可以测试和实现,RepositoryM所以我可以测试和实现ClassA......等等.
使用模拟可以让您开始编写测试而无需执行任何操作.您只需要接口即可.
使用模拟框架可以使测试构建更快.
模拟/存根具有附带的好处 - 其中之一是对抽象而不是实现执行编程.
你们会说使用模拟比不使用模拟更好吗?
驾驶摩托车比驾驶汽车更好吗?这取决于您想要实现的目标:)。
为什么要使用模拟?
模拟与基于状态的测试:虽然我通常喜欢基于状态的测试,因为它感觉更可靠/直接,但通常情况下,使用模拟是验证代码单元是否正确执行其角色的唯一方法。为什么?好吧,在设计时不要考虑原则,类通常不会公开足够的数据来验证您的期望,因此验证其正常工作的唯一方法是检查其与其他协作者的行为/交互。
一个很好的例子是一个在订单完成时发送电子邮件的类 - 该类不会有“发送的电子邮件数量”属性或任何类似的属性,因此您需要检查是否进行了适当的方法调用。模拟设定了对交互的期望。
虽然您可以通过手动滚动公开此数据的自己的测试双类来测试交互(例如,创建一个实现所需接口的类型,然后将方法调用信息推送到列表中,然后针对存储的状态进行断言),但模拟框架速度通过允许我们只填写我们真正关心的部分来加快流程。
我应该在生产代码中使用模拟吗?
模拟仅用于单元测试还是可以直接在原始项目中作为真实对象使用然后切换?
如果“嘲笑”你的意思是使用“可以交换并以合理方式运行的‘假’类型”,那么是的——我经常使用‘假’类型,例如内存中的字典来替代数据库连接等。它们可以作为非实时生产代码中有用的权宜之计。
同样,如果您对接口进行编程,则可以创建具有已存根功能的应用程序的工作框架。这有助于充实完整的编程结构,而不必关注细节。一旦可用,您就可以在实际实现中进行替换(尽管如果您没有集成测试的支持,预计会出现一些集成错误)。
另一方面,如果“模拟”是指“在生产代码中使用模拟框架”,那么不——我不建议这样做,我会手写假实现并远离依赖性,而且更容易推理和调试。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |