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

Joh*_*ell 35 unit-testing mocking

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

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

Kal*_*see 50

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

  1. 存根对象提供有效的响应,但它是静态的 - 无论您传入什么输入,您都将获得相同的响应.
  2. 虚假对象就像真实对象一样,但它们以更简单的方式进行 - 例如使用Map存储数据而不是真实数据库的DAO.
  3. 模拟对象用于模拟测试用例 - 它们验证在这些对象上调用某些方法.

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

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

  • 测试双打的定义不是福勒的 - 他们来自杰拉德·梅萨罗斯优秀图书'的xUnit测试模式’,和福勒自由地承认了这一点. (8认同)

小智 12

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

基本上这些是测试双打:

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


Pas*_*ent 6

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

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

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

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

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


Bev*_*van 5

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

转述他的书...

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

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

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

假的- 任何用来代替真实事物的替代物

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

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

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