论坛首页 综合技术论坛

吹弹得破是重回一人犯错,全家光荣的老路

浏览 60939 次
该帖已经被评为精华帖
作者 正文
   发表时间:2006-04-23  
robbin 写道
其实Rod Johnson也明确提出了选择mock的方针,而且再退一步来说....


不用再退一步了,既然你同意Rod的看法,那就按照他的来吧
至于你具体怎么用,就看你怎么想了

robbin 写道

嗯,你的观点是框架测试适合大量使用mock,而应用测试不适合。那么请问,我如何对应用项目进行单元测试?如果你不建议大量使用mock,那么你怎么对应用代码进行单元测试?


首先,我没有完全否定mock,我们也用,比如mock录制异常的情况就非常方便,如我前面所说
引用
mock也有很多种用法,只要受益大于损耗就好了


然后,想使用stub
如果你喜欢的话,可以自己写一套IoC测试套件,也不是很难
如果不喜欢自己写,可以使用spring的test包,它是可以在非Spring应用中单独使用的
但所有的前提是,你是面向接口编程的,这样你就可以轻易的使用stub,如果我没记错的话,javaeye的好多项目都省略了接口(如果记错了,就当我没说好了)springside也是,我在项目中强制使用接口。
某些情况下代码量是少于easymock的,况且很多东西可以让IDE自己来生成,只要配一下代码的模板

当然,如果你的团队已经习惯于mock,那就继续用mock吧,如同我前面所说:
引用
没人能把话都说全了,况且每个人的经验不同,同一个事物看法难免有小的差异,只要能得到些东西就好了


最后,我很想知道,你在测DAO层时是怎么使用mock的?
0 请登录后投票
   发表时间:2006-04-23  
easymock2.0之后,其他通用mock工具实际上已经濒临破产了,而且,通过扩展,easymock现在也能直接mock类。
我并不认同"模仿测试是透明测试"的说法,其实,模仿测试虽然透明的模仿了被mock接口的行为,但是,最重要的一点,对于使用这些mock对象的被测试方法而言,测试用例相当于规定了这些方法的实现细节(必须以合理的顺序和方式调用那些mock对象)。即便使用了Dependence Injection,这个做法也是所谓的脆弱性或者易碎性的根源,而不是模仿测试导致的。
在这种白盒测试思路下,不论用stub还是mock,都是无法避免易碎性的。
0 请登录后投票
   发表时间:2006-04-23  
charon 写道
即便使用了Dependence Injection,这个做法也是所谓的脆弱性或者易碎性的根源,而不是模仿测试导致的。


恩...charon这个论点有意思,能否详细说说?
0 请登录后投票
   发表时间:2006-04-23  
flyingbug 写道
robbin 写道
其实Rod Johnson也明确提出了选择mock的方针,而且再退一步来说....


不用再退一步了,既然你同意Rod的看法,那就按照他的来吧
至于你具体怎么用,就看你怎么想了

robbin 写道

嗯,你的观点是框架测试适合大量使用mock,而应用测试不适合。那么请问,我如何对应用项目进行单元测试?如果你不建议大量使用mock,那么你怎么对应用代码进行单元测试?


首先,我没有完全否定mock,我们也用,比如mock录制异常的情况就非常方便,如我前面所说
引用
mock也有很多种用法,只要受益大于损耗就好了


然后,想使用stub
如果你喜欢的话,可以自己写一套IoC测试套件,也不是很难
如果不喜欢自己写,可以使用spring的test包,它是可以在非Spring应用中单独使用的
但所有的前提是,你是面向接口编程的,这样你就可以轻易的使用stub,如果我没记错的话,javaeye的好多项目都省略了接口(如果记错了,就当我没说好了)springside也是,我在项目中强制使用接口。
某些情况下代码量是少于easymock的,况且很多东西可以让IDE自己来生成,只要配一下代码的模板

当然,如果你的团队已经习惯于mock,那就继续用mock吧,如同我前面所说:
引用
没人能把话都说全了,况且每个人的经验不同,同一个事物看法难免有小的差异,只要能得到些东西就好了


最后,我很想知道,你在测DAO层时是怎么使用mock的?


JavaEye的开源项目没有一个是我写的,不代表我的意见。而且我看到的是JavaEye的开源项目基本上都是面向接口编程的。

我测试DAO层会启动spring容器,访问hsqldb数据库,不使用mock,具体的论述可以看这里:
http://forum.iteye.com/viewtopic.php?t=20035&start=15
0 请登录后投票
   发表时间:2006-04-23  
charon 写道
easymock2.0之后,其他通用mock工具实际上已经濒临破产了,而且,通过扩展,easymock现在也能直接mock类。
我并不认同"模仿测试是透明测试"的说法,其实,模仿测试虽然透明的模仿了被mock接口的行为,但是,最重要的一点,对于使用这些mock对象的被测试方法而言,测试用例相当于规定了这些方法的实现细节(必须以合理的顺序和方式调用那些mock对象)。即便使用了Dependence Injection,这个做法也是所谓的脆弱性或者易碎性的根源,而不是模仿测试导致的。
在这种白盒测试思路下,不论用stub还是mock,都是无法避免易碎性的。


stub和mock的易碎性其实还是不同的。stub对调用顺序基本没有什么依赖,而动态mock严重依赖调用顺序。所以非常复杂而频繁的逻辑调用,使用动态mock未必是一个合理的选择。

只不过我的Action里面调用Service接口,Service调用DAO接口,都是非常简单的逻辑,所以问题不大。
0 请登录后投票
   发表时间:2006-04-23  
winterwolf 写道
"一人犯错 全家光荣" 这应该是个大的命题. 也许这是一个面向对象还是面向服务的问题. 以及整个web框架结构的问题.

强调用"技术"手段绕过框架本身的问题 我感觉没什么意义. 对深入讨论也没什么帮助. 每个人都有自己的技巧 没必要为**技术做免费广告.

但是应该考虑为此付出的代价有多大 能彻底解决这个问题吗 ? 自以为是的强势作风对讨论没有帮助.


好了,我闪了。
0 请登录后投票
   发表时间:2006-04-23  
这其实是单元测试究竟是一个白盒还是黑盒测试的问题(或者灰盒?),以及测试的重用问题。以前应该讨论过一部分。
黑盒的测试用例是可重用的(对于同一个接口的不同实现而言),白盒的测试用例是不可重用的,而且,如果被测方法内部有所调整,这个测试用例有时也必须调整(对于TFP方式,测试先行调整),实际上相当于把被测方法的一部分逻辑或者别的什么用测试用例显式确定下来了.
最后其实就是一个问题,对于一个实现某个接口的类而言,单元测试到底是在测试什么?
虽然我一直大量使用easymock,但在心里,认为唯一合法的方式,就是一个方法的副作用也正好是主要作用或唯一作用的时候. 而那种为了让一个对象的状态准备就绪而采用的脚手架方式,我有一个疑问,难道我为了测试一个业务方法是不是正确实现,还要给它提供一堆dao,还要关注这些dao是不是被以合适的顺序合适的方式调用?
0 请登录后投票
   发表时间:2006-04-23  
flyingbug 写道
但所有的前提是,你是面向接口编程的,这样你就可以轻易的使用stub,如果我没记错的话,javaeye的好多项目都省略了接口(如果记错了,就当我没说好了)springside也是,我在项目中强制使用接口。


springside是不强制使用接口,要用到接口在架构上的好处时还是用的,比如规则引擎的模块。
  理由说了,维护接口的成本,代码浏览跳转时老要用热键的成本,文件数量的成本,非0成本导致他真正必要用的时候,重构的时候才用,而不会一开始强制铺开。

   现在easymock都不要求基于接口了,java语言只能通过接口作proxy这点根本是不合理的,目前都在跑cglib的方案解决。 stub不用接口没法用是个问题,但早晚还是会解决的吧。
0 请登录后投票
   发表时间:2006-04-23  
charon 写道
我有一个疑问,难道我为了测试一个业务方法是不是正确实现,还要给它提供一堆dao,还要关注这些dao是不是被以合适的顺序合适的方式调用?

TDD是关于设计,而不是关于测试。业务逻辑需要取出x和y的数据,然后用z的方式组合这些数据,这是你的设计,所以你应该用测试来描述它。
0 请登录后投票
   发表时间:2006-04-23  
框架本身就不支持松藕合 系统本身就没有按模块来设计 在测试上如何能划分清楚 ? 

我觉得这个不用列出一堆代码来解释. 

闪那么快干嘛 有错误可以说.

你和gigx的意思无非说人家的单元测试水平有问题 我感觉单元测试水平再高也没用 根本就不是这个问题.
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics