论坛首页 综合技术论坛

对junit的一点体会

浏览 46745 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-21  
CafeBabe 写道
swing 写道

10、我要进行的是TDD,不是测试!因此,这里有一个很重要的原则:足够简单的代码不特地为它编写单元测试。
11、到这里,答案已经很显然,按照第10条所说的原则,在设计中,凡是必须牵涉外部资源的代码(如servlet、jsp、dao等等)必须足够简单,这样我就可以不对它进行测试。

你好像是这个意思:
1 dao牵涉到外部资源
2 dao可以做到足够简单
所以dao就不用测试了
什么叫做“dao足够简单“?好像spring dudu也说过,你如果用spring,hibernate,那你的dao代码可能就很“简单”,比如
public void saveUser(User user);{
  getHibernateTemplate();.save(user);;
}

这个方法里只有一行代码,所以“简单”,“一般“情况下不会有问题,除非你那天头晕,把save(user)写成了delete(user)
但仔细想想,要是你的mapping文件写错了,你即使写了save,它又能工作吗?所以我们测试hibernate dao,不仅是测试代码,也是测试映射文件。看似简单的代码其实不简单,hibernate这样的orm tool其实把很多本应该写在代码中东西挪到了配置文件里面。
再说了,不是所有的方法都能够写得如此“简单”的,比如说我们的项目中经常有这种东东,Parent<-->Child一对多,需要这样一个方法,
public void update(Parent p){
}
这个方法要update parent,同时对它的children做相应的insert,update或者delete


我想我说的不完全是你理解的意思,
首先,我也认为要是你的mapping文件写错了,你即使写了save也不能正常工作,甚至,你数据库链接的配置错了也不能正常,还有比如,你的表结构错了,或者数据库版本有问题,等等,这些都会导致错误。但是,我说了,我的大前提,单元测试通常是我在进行TDD的过程构建的。这个前提就牵涉了很多方面,包括我的单元测试的边界、单元测试的维护代价,特别是我要从单元测试中获取的核心价值等等。

你要给自己的单元测试划分好边界,并不是这个类牵涉了某个配置文件,那么那个配置文件的对错也是属于这个类的单元测试来测试的,事实上,如果你是纯粹的单元测试,那么只应该测试这个目标单元的接口(这个词可能不是很准确),外部的环境应该完全由你的测试来搭建,这样才能保证测试的独立性,另一个方面这样做也有利于你获得清晰的单元测试。当然,也许hibernate的配置文件很多人都当作其DAO的一个延伸;不过我觉得,这样的测试,最好还是做到集成测试中去。

是不是对一个DAO做单元测试,是一个综合考虑的结果,你所指出的两点1 dao牵涉到外部资源 2 dao可以做到足够简单
并不是很准确,按照我上面的推论,到了第12点,基本上你可以认为是这样:因为dao牵涉到外部资源,所以我希望dao不做单元测试;因为要不做DAO的单元测试,所以dao必须足够简单。

还有一点,我在单元测试中不对大部分DAO做测试,不代表就不对它们做测试了。我认为由集成测试来覆盖这部分内容更加合理。

从另一个角度说,我在上面的论述中提到的一些速度、设计等等方面的考虑,都还是表面,最终目的还是看你能够从单元测试中获取的价值来考虑的。

因此,关键是你做单元测试所付出的代价和你的收获是否平衡,在此基础上做出取舍。
一般情况下,我认为,让DAO足够简单后,做它的单元测试的代价(包括维护它们的代价)远远高于你能从其中获取的价值。另一方面,我认为一个简单的集成测试比你对每个DAO做单元测试所花费的代价要低很多,所以使用集成测试来完成这部分的测试就会合适很多。
(这里请一定注意集成测试和单元测试在测试环境的搭建上的差别,我就不深入讨论下去了。)

关于对DAO这类单元做的单元测试的维护代价,我认为比普通的类高出很多,可能10倍也不止,谁来保证它们的正确性?这曾经是我写单元测试的极大困扰。后来我认定只有足够简单的单元测试才能最大限度避免这个问题,因此对复杂的单元测试我总是非常警惕。

我想我和你最大的不同可能还是在写单元测试的目的上,我也曾经对DAO做单元测试,现在我认为这样的做法得不偿失。
另一个方面,如果按照你的逻辑来考虑的话,就有必要对所有代码都测试了,甚至一个工具生成的get/set方法,毕竟工具也是可能出错的。
0 请登录后投票
   发表时间:2005-06-03  
感觉还是测试用力要写好. 不知道XP是如何unit test的.
0 请登录后投票
   发表时间:2005-06-14  
可惜我们就是全部编码完事之后才进行测试文档的编写和junit测试的。而且全部测试加文档才给了一周的时间,导致很多时候junit就是为了符合已经存在的代码而编写的。不但准确性得不到保障,而且有很多的测试点根本发现不了或者还没来得及发现测试工作就完了。测试起的作用很小,基本就靠跑页面的时候发现bug。

不知道大家在县编码后测试的情况下怎么快速、完整地找出方法中存在的测试点?难道只能靠经验积累起来的直觉?
0 请登录后投票
   发表时间:2005-06-14  
香克斯 写道
不知道大家在县编码后测试的情况下怎么快速、完整地找出方法中存在的测试点?难道只能靠经验积累起来的直觉?

不需要完整。每次要修改或者要debug之前添加新的测试,测试用例是逐渐累积起来的,不是一开始就想完整的。
0 请登录后投票
   发表时间:2006-01-02  
CafeBabe 写道
muziq 写道
代价高不高就看你对测试的要求了,如果要测试能够在无人干预的情况下自动反复运行就有的折腾了。如果你的测试程序只能保证第一次运行的时候可以工作,第二次就不好说,那么还不如不写。

麻烦就麻烦在数据库的状态的恢复,这个问题解决了,就好的多。

这有什么好麻烦的?
我是在setUp()中把table,sequence等等全部drop掉重建(用hibernate),然后用一个jdbc工具插入所有的测试数据
这样速度可能会慢点,但保证了测试的隔离。


握手,同道。

除此之外,有點心得:
首先,KISS DAO層,然後才可以UT DAO,不然測試時間也太長樂,並且不符合接口簡單化的要求。

接口是設計時確定的,之後就立即寫設計接口testcase,再Coding-&gt; UT-&gt;修改-&gt;UT....這樣循環,直到完成。
0 请登录后投票
   发表时间:2006-01-02  
引用

CafeBabe 写道:
引用

muziq 写道:
代价高不高就看你对测试的要求了,如果要测试能够在无人干预的情况下自动反复运行就有的折腾了。如果你的测试程序只能保证第一次运行的时候可以工作,第二次就不好说,那么还不如不写。

麻烦就麻烦在数据库的状态的恢复,这个问题解决了,就好的多。

这有什么好麻烦的?
我是在setUp()中把table,sequence等等全部drop掉重建(用hibernate),然后用一个jdbc工具插入所有的测试数据
这样速度可能会慢点,但保证了测试的隔离。

可以采用DBUnit,setUp里backup table DAO会修改的表,tearDown里再recover.
不过我觉得这样也很麻烦,现在是跟spring里的测试通过事务控制的,setUp里begin Transaction,
tearDown里rollback
0 请登录后投票
   发表时间:2006-01-07  
spring提供的测试框架,也就是spring-mock.jar,非常好用,可以通过setDefaultRollback(false/true)自由的控制是否rollback;还可以通过setPopulateProtectedVariables(true)实现autowire by name。
用着非常爽。
0 请登录后投票
   发表时间:2006-01-15  
robbin 写道
giantzou 写道
Junit是自己写的,如果写得不过严格,或想得不够周到,不知有没有可能变成Pandora's box , 说到底还是得靠自己的Coding Ability,不知大家有何高见呢?


其实我觉得单元测试很难写的,特别是涉及到对数据库的操作,setup和teardown方法怎么写,是颇费脑筋的,有时候写unit test感觉到比写代码还要费事。


是的,我也觉得很耗时间。 如果时间本来就很赶的话,单元测试还有没有必要进行?进行了肯定完不成。
0 请登录后投票
   发表时间:2006-01-15  
戏说乾隆 写道
robbin 写道
giantzou 写道
Junit是自己写的,如果写得不过严格,或想得不够周到,不知有没有可能变成Pandora's box , 说到底还是得靠自己的Coding Ability,不知大家有何高见呢?


其实我觉得单元测试很难写的,特别是涉及到对数据库的操作,setup和teardown方法怎么写,是颇费脑筋的,有时候写unit test感觉到比写代码还要费事。


是的,我也觉得很耗时间。 如果时间本来就很赶的话,单元测试还有没有必要进行?进行了肯定完不成。

复杂的测试环境需要有一个专门而且预先的设计,比如一些逻辑完全需要基于有复杂联系的初始数据进行的逻辑,这些测试的初始化必须作为一个整体的考虑进行设计。
至于说因为时间的关系不作单元测试,真是很可怕的事情。因为你在放弃作好的软件的基本准则。
0 请登录后投票
   发表时间:2006-01-15  
戏说乾隆 写道
robbin 写道
giantzou 写道
Junit是自己写的,如果写得不过严格,或想得不够周到,不知有没有可能变成Pandora's box , 说到底还是得靠自己的Coding Ability,不知大家有何高见呢?


其实我觉得单元测试很难写的,特别是涉及到对数据库的操作,setup和teardown方法怎么写,是颇费脑筋的,有时候写unit test感觉到比写代码还要费事。


是的,我也觉得很耗时间。 如果时间本来就很赶的话,单元测试还有没有必要进行?进行了肯定完不成。


今天花5分钟写测试和明天花30分钟调bug的区别而已。
0 请登录后投票
论坛首页 综合技术版

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