单元测试术语的概述(存根与模拟,集成与交互)?

Posted

技术标签:

【中文标题】单元测试术语的概述(存根与模拟,集成与交互)?【英文标题】:An overview of unit testing terminology ( stub vs mock , integration vs. interaction )? 【发布时间】:2010-12-22 05:53:29 【问题描述】:

我在我的项目中使用了更多的单元测试,并阅读了我可以在线阅读的所有信息,并且对很多术语感到困惑。因此,我可能在对话和谷歌搜索中错误地使用了这些术语。

有人可以概述所有单元测试术语,例如“假”类型以及测试类型(交互与集成)吗?

【问题讨论】:

相关:whats-the-difference-between-faking-mocking-and-stubbing 【参考方案1】:

来自 MSN 杂志的 article 解释了这些术语,并通过示例和一些源代码进行了一些详细说明。

基本上这些是测试替身:

Dummy - Dummy 不包含任何实现 存根 - 存根是接口或基类的最小实现 Spy - 间谍会记录调用了哪些成员 假的 - 更复杂,假的可能类似于生产实现 Mock - 模拟通常由模拟库动态创建,根据其配置,模拟可以表现得像假人、存根或间谍

【讨论】:

【参考方案2】:

我已阅读(并衷心推荐)Roy Osherove 的 The Art of Unit Testing。他使用了一套简化的术语。

套用他的书...

集成测试 - 任何超出当前进程或对象以与其他对象交互的测试

交互测试 - 测试对象协同工作的方式

状态测试 - 对操作产生的结果进行测试

赝品 - 任何代替真实物品的替代品

存根 - 一个替代对象,提供被测代码所需的依赖项

Mock - 用于检查测试结果的替身

请注意,这里的 Stub 和 Mocks 都可以由 Mocking 框架提供 - 区别在于它们的使用方式与所使用的技术一样。

【讨论】:

【参考方案3】:

Fowler 在区分 Mocks and Stubs 方面当然做得很好,但对我来说,XUnit Test Patterns 这本书是参考,我建议查看 Mocks, Fakes, Stubs and Dummies 进行全面比较。

是的,我知道,这很令人困惑,这就是为什么我建议检查Mocks and Stubs aren't Spies,然后检查let’s spy,最后检查Mockito - The New Mock Framework on the Block。

关于不同类型的测试,一个简单的解释可能是(这不是一个详尽的列表):

单元测试:单独测试单个“单元”、方法 集成测试:测试多个单元(方法、类、组件、层)的集成 功能测试:测试端到端场景(从用户角度)

所有这些类型都是有用的而不是排他的,它们实际上只是没有相同的意图。

【讨论】:

【参考方案4】:

这是一本好书:http://xunitpatterns.com/

见:http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html

和http://xunitpatterns.com/XUnit%20Terminology%20Cros-s-reference.html

【讨论】:

【参考方案5】:

当谈到 mock 与 fake 与 stub 时,人们实际上有几种不同的解释方式。我一般借the meanings defined by Martin Fowler:

    存根对象提供有效响应,但它是静态的 - 无论您输入什么输入,您总是会得到相同的响应。 假对象的行为与真实对象相似,但它们以更简单的方式进行处理,例如使用地图而不是真实数据库来存储数据的 DAO。 模拟对象用于模拟测试用例——它们验证是否在这些对象上调用了某些方法。

交互测试是一个通用术语,指的是确保对象之间的交互正确(确保调用预期的方法)的单元测试。这与状态(或经典)测试相反,它不关心方法中发生了什么,只要结果状态是正确的。我在上面链接的 Fowler 的文章中对这些类型的测试进行了比较。

Integration testing 真的不是单元测试的一个方面,它是单元测试之上的一个层次。它需要不同的单元并验证它们是否可以正确地协同工作。

【讨论】:

Test Doubles 的定义不是 Fowler 的 - 它们来自 Gerard Meszaros 的优秀著作“xUnit Test Patterns”,Fowler 坦率地承认这一点。

以上是关于单元测试术语的概述(存根与模拟,集成与交互)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 集成测试中最好地存根/模拟 rest API 调用

扩展特征的单元测试类 - 我如何在特征中模拟和存根方法?

C# - 单元测试,模拟?

Android单元测试与模拟测试详解

swift 2中单元测试的存根方法

单元测试如何使用 Mockito 模拟存储库