2009-12-02 44 views
27

我在项目中使用了更多的单元测试,并阅读了我可以在线的所有信息,并且很多术语都感到困惑。因此,我可能会在对话和谷歌搜索中错误地使用这些术语。单元测试术语概述(存根vs模拟,集成与交互)?

有人可以概括所有的单元测试术语,如“假”类型以及测试类型(交互与整合)吗?

+0

相关:[伪装和嘲弄之间的区别](http://stackoverflow.com/questions/346372/whats-the-difference-between-faking-mocking-and-stubbing) – nawfal 2014-07-23 17:53:26

回答

45

当涉及到嘲笑对假货与存根,实际上有几种不同的方式,人们解释他们。我通常借the meanings defined by Martin Fowler

  1. 存根对象提供了一个有效的响应,但它是静态的 - 不管你通过什么输入,您总能获得同样的反应。
  2. 虚假对象的行为与真实对象相似,但它们以一种更简单的方式进行操作 - 例如使用Map存储数据而不是真实数据库的DAO。
  3. 模拟对象用于模拟测试用例 - 它们验证某些方法是在这些对象上调用的。

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

Integration testing真的不是单元测试的一个方面,它是单元测试的一个级别。它需要不同的单位并验证他们正确地一起工作。

+8

测试双打的定义不是福勒的 - 他们来自Gerard Meszaros的优秀书籍“xUnit测试模式”,福勒自由地承认这一点。 – 2009-12-02 08:02:38

5

福勒做当然是一个伟大的工作,在区分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太。

关于不同类型的测试,一个简化的解释可能是(这不是穷举性列表):

  • 单元测试:测试单个“单元”中的方法,在隔离
  • 集成测试:测试几个单元的积分(方法,类,组件,层)
  • 功能测试:测试的端至端方案(从用户的角度)

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

3

我已阅读(并衷心推荐)由罗伊·奥谢罗夫编辑的The Art of Unit Testing。他使用了一套简化的术语。

套用他的书......

集成测试 - 到达当前进程或对象以外的其他事情

交往试验交互的测试 - 在路上测试该对象协同工作

状态测试 - 由一个操作所产生的结果的测试

- 替身对象被测

模拟提供了代码所需的依赖 - - 这是使用真实的东西

存根,而不是任何替身对象替身用来检查测试

注意的是,这里存根和嘲弄二者可以被嘲弄的框架内提供的结果 - 在distiction是尽可能多的关于如何使用它们所使用的技术。

9

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

基本上这些是测试双:

  • 假人 - 傻瓜不含实施
  • 存根 - 存根的接口或基类
  • 间谍最小实现 - 间谍将记录哪些成员被调用
  • - more compl离,一个假可以类似于生产实施
  • 莫克 - 甲模拟通常是动态地由一个模拟库中创建并取决于其组态,一个模拟可以表现得像一个虚设,一个短截线,或间谍