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

An overview of unit testing terminology ( stub vs mock , integration vs. interaction )?

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

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


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

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

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


    MSN杂志的这篇文章解释了这些术语,并通过示例和一些源代码进行了详细介绍。

    基本上这些是测试双打:

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


    Fowler当然在区分Mocks和Stubs方面做得非常出色,但对我来说,XUnit Test Patterns一书是参考资料,我建议检查Mocks,Fakes,Stubs和Dummies进行全面比较。

    是的,我知道,这是令人困惑的,这就是为什么我建议检查Mocks和Stubs不是间谍,然后让间谍,最后是Mockito - 块上的新模拟框架。

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

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

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


    我读过(并衷心推荐)Roy Osherove的单元测试艺术。他使用了一套简化的术语。

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

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

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

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

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

    Stub - 一个替代对象,提供被测代码所需的依赖关系

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

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


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

    请参阅:http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html

    和http://xunitpatterns.com/XUnit%20Terminology%20Crossreference.html