单元测试术语的概述(存根与模拟,集成与交互)?
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 坦率地承认这一点。以上是关于单元测试术语的概述(存根与模拟,集成与交互)?的主要内容,如果未能解决你的问题,请参考以下文章