首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mocks,Stubs和假货之间的区别有用吗?

Mocks,Stubs和假货之间的区别有用吗?
EN

Software Engineering用户
提问于 2019-09-23 13:06:43
回答 1查看 668关注 0票数 2

自动化软件测试专业人员经常区分各种类型的测试双倍,如Mocks、Stubs和Shim/假货。

实际上,在模拟不是Stubs Martin一文中,清楚地描述了两种测试类型之间的区别。

我不知道这种区分有什么用处。

我的目标是避免在创建单元测试时调用真正的依赖项,如果我知道使用的是模拟还是存根,会有什么区别吗?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2020-05-04 10:23:26

不管您使用的是模拟还是存根,都不会有那么大的区别。但是,真正不同的是一方面使用模拟或存根,另一方面使用假的。

模拟/存根和假货(使用福勒的术语)对世界做出了不同程度的假设,随后选择使用模拟/存根或假货对你正在做的测试有真正的影响:

  • 你是在做真正的、传统的、真诚的“单元测试”,还是
  • 你是走捷径,把单元测试和集成测试混为一谈吗?

更重要的是:

  • 你是在测试界面吗?或
  • 您是在对照实现进行测试吗?

模拟通常假设很多:它们假设特定的方法将被调用,有时是以特定的顺序调用,通常带有非常具体的参数,并且它们在每次调用中返回非常特定的预定结果,这代表了另一个全新的假设:它们是一些程序员假设的结果,即真实的模块将返回给定的参数和其假定的状态。

存根对调用它们的方式做了一些假设,但是它们仍然假设了很多,无论是在调用方式上还是在实际模块的响应方面。这是因为存根,就像模拟一样,构建起来仅仅是为了响应特定的使用模式,当被测试的单元被特定的测试执行时,这种使用模式是预期的。本质上,存根的使用等同于使用模拟,它们唯一的区别是存根通常是手工构建的,所以即使您想编写更多的假设,也要做很多工作,而模拟通常是使用一些模拟框架创建的,这使得指定假设变得很容易,所以您可能会指定更多的假设。

另一方面,

假货倾向于尽可能少的假设,相反,它们试图提供一套尽可能接近真实事物的功能。从代码的角度来看,理想的假的行为方式与原始的是无法区分的,因为代码正在行使它的公共接口。(不同之处在于它们的内部工作,当然还有它们为完成工作而可能调用或不调用的其他子系统。)因此,假货通常不依赖于任何被测试单元的任何特定的使用模式,而是通过任何测试来执行。

从上面应该可以清楚地看到,当您使用模拟或存根时,您正在对被测试单元的内部工作进行过多的假设,而当您使用假货时,您并没有做出这样的假设:您不在乎您的被测试单元是如何调用您的假对象的,您只想知道它们交互的最终结果是否正确。

这反过来意味着:

  • 当您使用模拟或存根时,您正在执行传统的“按书”进行单元测试,并且完全无视“针对接口进行测试,而不是针对实现进行测试”的建议。
  • 当您使用假币时,您实际上并不是在“按书”进行单元测试,而是将其与集成测试混合在一起,(*)但实际上您可以坚持针对接口而不是对实现进行测试。

这些都是事实,你可以利用它们来做出你自己受过教育的选择。如果您想要我的意见,假货是一个比模仿和存根好得多的选择,因为对实现进行测试并不是明智的做法,而在没有客观价值的情况下按书做一些事情只是一种狂热的编程。

(*)我的意思是“将其与集成测试混合在一起”,即您是在与假测试集成进行测试,并且您正在背离单元测试的规则,该规则要求您在与其环境完全隔离的情况下进行测试子系统的操作。有了假货,你就不再完全控制你的子系统-被测试和它的依赖关系之间交互的每一个细节;你让在测试中的子系统调用它所需要的任何方法来对付假的,而假的则尽可能忠实地响应原始的。如果子系统在测试中调用一个假的方法,而您不希望被调用,或者使用您没有预料到的参数值,那么您不一定会从这种类型的测试中知道。这正是集成测试中所发生的事情。这也没关系,因为您在集成测试中所关心的只是测试子系统与其依赖项之间交互的最终结果的正确性。在这种情况下,部分或所有依赖项都是假的。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/398766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档