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

时间:2009-12-02 00:34:35

标签: unit-testing mocking

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

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

5 个答案:

答案 0 :(得分:49)

当涉及到模拟与假货与存根时,实际上有几种不同的方式可以解释它们。我通常借the meanings defined by Martin Fowler

  1. Stub对象提供有效的响应,但它是静态的 - 无论您输入什么输入,您都会得到相同的响应。
  2. 虚假对象就像真实对象一样,但它们以更简单的方式进行 - 例如使用Map来存储数据而不是真实数据库的DAO。
  3. 模拟对象用于模拟测试用例 - 它们验证在这些对象上调用某些方法。
  4. 交互测试是一个通用术语,指的是确保对象之间的交互是正确的单元测试(确保调用预期的方法)。这与状态(或经典)测试相反,它不关心方法中发生的情况,只要结果状态是正确的。这些类型的测试在我上面链接的Fowler文章中进行了比较。

    Integration testing实际上不是单元测试的一个方面,它高于单元测试。它需要不同的单位并验证它们是否正确协同工作。

答案 1 :(得分:12)

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

基本上这些是测试双打:

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

答案 2 :(得分:6)

Fowler当然在区分Mocks and Stubs方面做得非常出色,但对我来说,XUnit Test Patterns本书是参考资料,我建议您查看Mocks, Fakes, Stubs and Dummies进行全面比较。< / p>

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

关于不同类型的测试,可以简化解释(这不是详尽的列表):

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

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

答案 3 :(得分:4)

答案 4 :(得分:4)

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

用他的书来解释......

集成测试 - 到达当前流程或对象之外的任何测试以与其他内容进行交互

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

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

- 使用任何替代真实物品的替身物品

存根 - 提供受测试代码所需的依赖关系的替代对象

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

请注意,这里Stubs和Mocks都可以通过Mocking框架提供 - 这种干扰与它们如何被用作所使用的技术一样多。