单元测试中的“利人”与“利己”

单元测试中,每个测试类,甚至测试方法最好没有依赖,这样有很多好处:1.每个测试类都可以单独运行并能成功;2.修改一个测试类不会对其它类造成影响。这也是为什么JUnit中提供setUp()和tearDown()的原因之一。
一般情况下,大家喜欢在setUp()中创建环境,运行完测试,在tearDown()中清除环境,这样互相不依赖。我把这种情况叫做“利他”,即你相信别人,别人也相信你。这对很多单元测试都没问题。
但是有时候你是否遇见过这样的问题:
1.跟其他同事协作开发时,你对自己写的单元测试了然于胸,但是未免不会心里打鼓:万一别人tearDown()不正确,并对我的测试有影响了怎么办?
一般情况下,大家需要实现商量好,比如都同意在setUp()创建环境,tearDown()清除环境。
2.即使跟其他同事商量好了setUp()、tearDown()的职责,你是否遇到过这样的情况呢?
在IDE里面跑某个DAO类所有的测试方法(可能测试方法比较多,需要的时间比较长),刚点了执行,突然发现某些地方写错了,或者其它原因,你直接终止了运行。这样就造成了不希望的后果:下次运行测试也会失败,因为你强行终止了进程,没有来得及tearDown()。于是下一次执行测试之前,你不得不通过sql或者其它办法先把数据库里的数据清理一下。
3.你在运行所有单元测试的过程中,发现某个dao测试失败了,经过仔细debug,花费了很多时间,发现竟然是前一个dao测试没有清理完全数据,虽然之前你和同事已经商量过了。
同样,在功能测试中也可能遇到前面所提的问题。那么有更好的办法吗?

很多人可能已经实践过这样写单元测试(尤其是DAO等代价比较高的测试),把清理环境和创建环境都放到setUp()时做。这样肯定保证了自己单元测试的顺利执行。我认为这种方式是“利己”的方式,但是在这种情况下却是非常合适的方式。虽然利己,但是如果大家事先生命,而且人人保证自己没问题,那么所有的单元测试一块跑起来问题也就不大。

猜你喜欢

转载自aqingsao.iteye.com/blog/307184