stub 与 mock 的区别

作者在 2010-09-22 01:30:27 发布以下内容
stub 与 mock 的区别 关键字: stub, mock, test, tdd

有些东西就是这样,有些东西你心理面很明白,可是当你要给别人讲的时候却发现有一点点困难。

 

关于Stub & Mock的确别,我的理解是:

 

1.先说不同点:

 

   Stub方法里面需要实现逻辑,因为对Stub的调用者需要依赖,stub模块或函数的返回值,正因为此,搭建stub跟mock比起来,是比较耗费精力的。也正因为此,stub一般用于粗粒度测试。

 

   而mock的关键则是他要足够啥,只要能够让他的依赖者与之进行足够的交互既可以,正因为他傻,所以他的编写相对较容易,也正因为他傻,创建mock的工作可以由Easymock,mockmaker来自动完成,也正因为此,他可以用作细粒度的测试。

 

2.再说相同或想联系的地方。

 

   都能够对系统进行隔离,

 

   测试的很多时候我们会把一个mock退化成一个简单的stub,大多数的mock生成工具也都支持这一点。从这一点我们也可以看出,虽然作为很不同的两个概念,但他们之间也不是永远有着严格的界限。

 

其他的呢?关于设计与使用上的更多考量呢? 呵呵 这里推荐Martin Fowler 的一篇文章,文章很好,是naias宝宝 发给我的,感谢naias宝宝。:)

 

Mocks Aren't Stubs Mocks Aren't Stubs(一个翻译的版本)
技术 | 阅读 5941 次
文章评论,共2条
vfdff(作者)
2010-09-22 01:50
1
stub VS mock<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在测试中,经常涉及到对依赖代码的处理,这将涉及到系统的结构的设计。一个好的设计,必然是容易测试的。代码之间的依赖被极大的隔离开来,很容易的进行测试。如何对对其他层具有依赖的代码代码进行测试呢?可以有两种方法:引入stub和引入mock。那么这两者之间的区别是什么呢?<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;在理解其区别之前,需要明白一点,他们都是为了同一个目标而出现的,代替依赖部分,让原先的“整合测试”简化为“单元测试”。&nbsp; &nbsp;&nbsp; &nbsp; <br />
<br />
mock:使用easymock等包,在程序代码中向被测试代码注入“依赖部分”,通过代码可编程的方式模拟出函数调用返回的结果。<br />
<br />
stub:自己写代码代替“依赖部分”。它本身就是“依赖部分”的一个简化实现。<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;实际上,在能够使用mock的时候,就不应该选择使用stub。但是有时候是必须使用stub的,例如在对遗留代码进行测试时,该部分代码不支持“注入”,那么只能将“替代”这个过程外移,使用stub完成此任务了。
vfdff(作者)
2010-09-22 01:58
2
mock的问题在于,你实际上不是在检查一个对象的接口,而是深入到了实现过程中。<br />
<br />
stub和mock的使用是有很大区别的,stub的用法是:假设一个对象是正确的,在这个基础上检查其他对象的接口。比如:我们假设A类肯定是对的,在此基础上检查B对不对,于是就制造一个A-stub。而mock是用来检查A的实现过程到底是不是对的。<br />
<br />
mock实际上是和面向对象的设计原则相违背的,他是在深入一个过程,去检查实现细节。因此mock用的多不多,体现了这个程序设计的内聚性好不好。如果程序中到处都需要用mock来测试,说明程序的内聚性不高。<br />
<br />
比如说有这样的需要:A向数据库里面写一个数据,然后B从数据库里面读这个数据。这样的设计从道理上来说就是不合理 的,既然是同一段逻辑,就应该封装在同一段代码中,外界只应该关注他的接口,而不应该知道这个数据的定义。对这段代码进行测试,也只需要测试他的接口。如果需要知道实现过程对不对,数据在表里面到底保存了没有,这时候就可以使用mock。即使是这段代码里面错翻天了,也不应该对其他代码造成损害,至少接口是对的。这就把mock的使用范围和影响力减到最小了。<br />
------------------------------------------------------------<br />
&nbsp;&nbsp;我倒不觉得他所说的完全正确, Mock还有一个更有用处的地方, 在一个多模块的商业项目中,&nbsp;&nbsp;简单讲, 甲负责完成A, 乙负责完成B, 而A需要通过接口调用B实现, 这个时候, 因为项目的时间安排的关系, 甲完成了自己的代码, 而乙并没有完成B实现, 在这个时候,难道甲的单元测试不做了么? 使用Mock的目的就在这里了. 作为单元测试本身的概念, A是独立的单元, 它的单元测试只需要测试A本身的(如果连同B也考虑进去, 那只能是集成测试了).所以在这个时候需要做的就是假定B已经完成,并且正确, 基于此对A进行单元测试.<br />
&nbsp; &nbsp;&nbsp;&nbsp;Mock用烂绝对不是Mock的错, 而是使用Mock的人根本就没有理解Mock的真正目的和使用范围.
游客请输入验证码
浏览1940946次