自动化软件测试专业人员经常区分各种类型的测试双倍,如Mocks、Stubs和Shim/假货。
实际上,在模拟不是Stubs Martin一文中,清楚地描述了两种测试类型之间的区别。
我不知道这种区分有什么用处。
我的目标是避免在创建单元测试时调用真正的依赖项,如果我知道使用的是模拟还是存根,会有什么区别吗?
发布于 2020-05-04 10:23:26
不管您使用的是模拟还是存根,都不会有那么大的区别。但是,真正不同的是一方面使用模拟或存根,另一方面使用假的。
模拟/存根和假货(使用福勒的术语)对世界做出了不同程度的假设,随后选择使用模拟/存根或假货对你正在做的测试有真正的影响:
更重要的是:
模拟通常假设很多:它们假设特定的方法将被调用,有时是以特定的顺序调用,通常带有非常具体的参数,并且它们在每次调用中返回非常特定的预定结果,这代表了另一个全新的假设:它们是一些程序员假设的结果,即真实的模块将返回给定的参数和其假定的状态。
存根对调用它们的方式做了一些假设,但是它们仍然假设了很多,无论是在调用方式上还是在实际模块的响应方面。这是因为存根,就像模拟一样,构建起来仅仅是为了响应特定的使用模式,当被测试的单元被特定的测试执行时,这种使用模式是预期的。本质上,存根的使用等同于使用模拟,它们唯一的区别是存根通常是手工构建的,所以即使您想编写更多的假设,也要做很多工作,而模拟通常是使用一些模拟框架创建的,这使得指定假设变得很容易,所以您可能会指定更多的假设。
另一方面,
。
从上面应该可以清楚地看到,当您使用模拟或存根时,您正在对被测试单元的内部工作进行过多的假设,而当您使用假货时,您并没有做出这样的假设:您不在乎您的被测试单元是如何调用您的假对象的,您只想知道它们交互的最终结果是否正确。
这反过来意味着:
这些都是事实,你可以利用它们来做出你自己受过教育的选择。如果您想要我的意见,假货是一个比模仿和存根好得多的选择,因为对实现进行测试并不是明智的做法,而在没有客观价值的情况下按书做一些事情只是一种狂热的编程。
(*)我的意思是“将其与集成测试混合在一起”,即您是在与假测试集成进行测试,并且您正在背离单元测试的规则,该规则要求您在与其环境完全隔离的情况下进行测试子系统的操作。有了假货,你就不再完全控制你的子系统-被测试和它的依赖关系之间交互的每一个细节;你让在测试中的子系统调用它所需要的任何方法来对付假的,而假的则尽可能忠实地响应原始的。如果子系统在测试中调用一个假的方法,而您不希望被调用,或者使用您没有预料到的参数值,那么您不一定会从这种类型的测试中知道。这正是集成测试中所发生的事情。这也没关系,因为您在集成测试中所关心的只是测试子系统与其依赖项之间交互的最终结果的正确性。在这种情况下,部分或所有依赖项都是假的。
https://softwareengineering.stackexchange.com/questions/398766
复制相似问题