锁定老帖子 主题: 单元测试之实践二,关于DAO的测试
精华帖 (1) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-11
我的第一个真正意义上的测试 。
前阵子发表过里面对于测试Service大家是没有意义的,对于测试DAO层则表现各有各的看法。 比如 robbin 大哥建议:
测试DAO不如连数据库一起测试吧。因为DAO测试的目的不是DAO接口实现对不对,而是测试是否如你预期的发送了SQL,如你预期的返回了结果集。这个时候你Mock之后,测试就没有意义了。 hyysguyang 大哥建议:篇
wuhua 写道
分层的原因很多。这里我的看法片面就不说了
但对于mock来说是有莫大好处的。 比如service测试的时候完全可以做到隔离数据库, 我现在的意思是, 但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。 但个人认为上面两个大哥的单元测试以非纯正的单元测试了,而是集成单元测试。 其实说白了,测试这东西只是为了项目更好,更快的完成。至于是否要求纯单元,或者是集成单元测试,则看各位的需要,如果觉得集成单元测试对项目有帮助,那就用吧,现在发现对这个已经没有明显的界限了。 不理会它了,现在回归到我们用户注册的例子。 java 代码
实际实现代码 java 代码
java 代码
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-09
感觉对dao的单元测试还是应该直接操作数据库呢。
写一个专门给测试用的spring配置文件,在这个文件中配置测试数据库,并且放好初始数据。 对hibernatetemplate类,不mock也可以的。 |
|
返回顶楼 | |
发表时间:2007-02-09
比较赞成LZ的想法。连接数据库耗时,而且实际上是又测试了hibernateTemplate 和 hibernate。
|
|
返回顶楼 | |
发表时间:2007-02-09
争论那么多干啥,测试的标准就是假如测试通过但你的实际代码不能运行那这个测试就不用写了
所以dao没有测试实际数据库也用不着写测试了 |
|
返回顶楼 | |
发表时间:2007-02-09
hsql在内存里会好一点
那样内存里的逻辑好构造一点 |
|
返回顶楼 | |
发表时间:2007-02-09
其实连接真实数据库进行DAO测试速度并不慢,这是因为每个DAO测试结束后,会自动rollback恢复环境。
对于一些框架软件,例如springframework来说,要测试的是API实现的逻辑,这种情况下大量mock隔离其他对象的影响是必要的。但是对于我们应用程序,特别是数据处理型应用,你不测试数据库访问,根本就等于没有做测试。换句话说测试DAO就是在测试你的Hibernate映射关系有没有配对,你的HQL查询有没有写对,这一Mock,要测试的真正目标根本就没有达到。 这种DAO测试诚然就是集成单元测试,其实就是对于Web Action测试,我也曾经一度认为应该mock service来测试,但是现在我已经不这样做了,而是真正初始化webwork的容器注入真正的service对象来测试了。因为Action是没有业务逻辑的,测试Action的目标是看xwork.xml有没有配对,拦截器运用是否正确的,这一mock,直接把action对象当做POJO来测试,你只能测试action传了什么参数,其他什么都没有去测,但是action传入什么参数,那是OGNL自动完成的,用不着你多此一举了。 从这个角度来说,只有对util类的测试才是真正的单元测试,其他都是集成测试,但我不觉得这样做有什么不对。特别是我看过ruby on rails的测试框架以后更加坚定了这种做法。rails的unit test,functional test,integration test都是集成测试。 |
|
返回顶楼 | |
发表时间:2007-02-09
robbin 写道 其实连接真实数据库进行DAO测试速度并不慢,这是因为每个DAO测试结束后,会自动rollback恢复环境。
由于java是工业化工作
对于一些框架软件,例如springframework来说,要测试的是API实现的逻辑,这种情况下大量mock隔离其他对象的影响是必要的。但是对于我们应用程序,特别是数据处理型应用,你不测试数据库访问,根本就等于没有做测试。换句话说测试DAO就是在测试你的Hibernate映射关系有没有配对,你的HQL查询有没有写对,这一Mock,要测试的真正目标根本就没有达到。 这种DAO测试诚然就是集成单元测试,其实就是对于Web Action测试,我也曾经一度认为应该mock service来测试,但是现在我已经不这样做了,而是真正初始化webwork的容器注入真正的service对象来测试了。因为Action是没有业务逻辑的,测试Action的目标是看xwork.xml有没有配对,拦截器运用是否正确的,这一mock,直接把action对象当做POJO来测试,你只能测试action传了什么参数,其他什么都没有去测,但是action传入什么参数,那是OGNL自动完成的,用不着你多此一举了。 从这个角度来说,只有对util类的测试才是真正的单元测试,其他都是集成测试,但我不觉得这样做有什么不对。特别是我看过ruby on rails的测试框架以后更加坚定了这种做法。rails的unit test,functional test,integration test都是集成测试。 所以别人写的代码的错误 会导至你程序的报错 为了画清界线才产生了单元测试。。。 ROR很少有你不经手的逻辑。。。 TDD也使别人写错的代码很快被发现 所以RAILS不用非要去追求单元测试 而如果是java那么。。。 还是老实作mock DAO是自己写的的但是框架不是 |
|
返回顶楼 | |
发表时间:2007-02-09
引用 由于java是工业化工作
所以别人写的代码的错误 会导至你程序的报错 为了画清界线才产生了单元测试。。。 ROR很少有你不经手的逻辑。。。 TDD也使别人写错的代码很快被发现 所以RAILS不用非要去追求单元测试 而如果是java那么。。。 还是老实作mock DAO是自己写的的但是框架不是 测试的策略和你用什么编程语言无关。单元测试也不是为了划清界限才产生的,单元测试为了保证软件的质量,这一点不要想歪了。不管是Java还是Ruby,敏捷软件开发有一个理念,所有的人拥有所有的代码,不管代码是不是你经手的,你都有责任去维护它的质量。单元测试不是为了推卸责任。 rails和Java在单元测试这一点上没有什么区别,本版前面有一个关于mock适用场合的讨论,这里不展开谈,只说结论:mock仅仅适用于测试环境无法重现的部分,例如信用卡支付网关,web容器请求和响应对象等等,mock不应该被滥用。 单元测试的范畴并不单单指隔离所有依赖对象进行单个对象的测试,否则任何对象的测试都必须引入mock,否则单元测试就无法完成的。怎么做单元测试要看你的测试目标,如果偏离了测试的目标,一昧追求纯粹意义上的隔离性,测试根本就是做无用功。 |
|
返回顶楼 | |
发表时间:2007-03-19
引用 测试的策略和你用什么编程语言无关。单元测试也不是为了划清界限才产生的,单元测试为了保证软件的质量,这一点不要想歪了。不管是Java还是Ruby,敏捷软件开发有一个理念,所有的人拥有所有的代码,不管代码是不是你经手的,你都有责任去维护它的质量。单元测试不是为了推卸责任。
rails和Java在单元测试这一点上没有什么区别,本版前面有一个关于mock适用场合的讨论,这里不展开谈,只说结论:mock仅仅适用于测试环境无法重现的部分,例如信用卡支付网关,web容器请求和响应对象等等,mock不应该被滥用。 单元测试的范畴并不单单指隔离所有依赖对象进行单个对象的测试,否则任何对象的测试都必须引入mock,否则单元测试就无法完成的。怎么做单元测试要看你的测试目标,如果偏离了测试的目标,一昧追求纯粹意义上的隔离性,测试根本就是做无用功。 完全同意,测试是为了质量,不是为了分清责任 |
|
返回顶楼 | |
发表时间:2007-04-04
对达到你目标没有任何帮助的测试用例远比没有测试用例还要糟糕,因为那不但浪费时间还浪费金钱……
所以,请确定你的测试目标,然后确定你的测试策略,之后就写有用的测试用例了. 在我开了,TDD除了提高质量之外,还有很多很多的好处,比如对我的开发效率有非常明显的提高.其他的好处嘛,那些很多经典的文章和书籍都介绍过,Just do it,慢慢的去体会咯 |
|
返回顶楼 | |