JAVA单元测试入门

现在单元测试很流行,都说要测试驱动开发了嘛,还有敏捷开发什么的,且不说思路怎么样,技术走势我们控制不了,不过就单元测试技术本身来说,还是有一定意义的。

单元测试就是写代码来测试代码,主要就是对方法的测试,细分的话也可以分为黑盒测试,白盒测试,以及模拟测试,一般三种都要同时使用,最基本的就是调用一下方法,JUNIT断言一下返回值是否正确,也就是黑盒测试了,我这里先说一下命名规范。

测试代码的包结构要和被测试代码相同,也就是放在同一个包下面,但不要是同一文件夹,一般工程代码在src下,测试代码就在test下,不过内部包路径,测试类和被测试类都要一一对应。

测试类和被测试类类名要对应,在原类名的后面加一个Test即可,也就是假如被测试类的名字叫UserBusiness,那么测试类的名字就叫UserBusinessTest,这是类名的命名规范。

测试类的方法名也和被测试类的方法名对应,不同的是这次测试方法名是在前面加test,假如被测试方法名为create() 那测试的方法名就是testCreate().

好了,基本的命名说完了,下面来说一下白盒测试。刚才说了,黑盒测试通常就是调用一下方法验证一下而已,那白盒测试呢,就是主要针对有流程控制的代码,要做到考虑所有可能,覆盖所有代码和路径,传入不同的值,包括一些边界值,保证测试的全面和完整。这点非常重要,也是体现一个人测试水平的高低的地方了,可以在注释中说明使用的测试用例,期望结果等。

最后说模拟测试,之所以需要模拟,是因为一些对象或方法为被测试的代码所依赖,但是又不方便提供,比如数据库操作,客户端请求等,当然你也可以提供,不过如果每次做单元测试都要启动数据库,启动容器的话,就不"敏捷"了,单元测试很大作用就是为了重复测试很方便嘛。所以我们就对这些被依赖的资源进行模拟,也就是mock了,目前mock框架主要有jmock和easymock,实现原理大概都是使用动态代理,使用起来也大同小异,下面就简单介绍一下mock的思路。

首先要保证要被模拟的这些对象都能够注入到被测试类里面去,不管是set方法注入还是方法传参都可以,否则我模拟一个对象了传不进去就没办法测了,所以最好是面向接口编程,使用依赖注入,尽量使被测试的类和其所依赖的对象松耦合,这也是我们编码的时候就应该注意的事情。注入进去以后,被测试对象现在就用的是模拟的对象了,然后第二步就是对模拟的对象进行录制,也就是指明那个方法传什么参数返回什么值,方便被测试的类使用,录制完了就重放一下,重放的目的是为了让模拟的对象准备就绪,然后就可以调用被测试类的那个被测试的方法了,使用到mock对象的地方,只要调用了录制过的方法,一切都会按照你设定的方式为它返回值,这样你就可以忽略被测试方法依赖的其他对象带来的影响,实现真正的对被测试方法的单元测试了。

上面说的录制,重放什么的,mock框架都提供了完整的API,可以方便的使用,这里就不细说了。

再说一下单元测试要注意的三点,第一点:永远不要忘了你要测试的是什么,对一个方法测试就只测这个方法,方法里调用了其他的方法,你就要mock,这才是真正的单元测试。

第二点:编写代码的时候就要考虑能够方便的进行单元测试,也就是松耦合,面向接口编程的原则,让每个类,每个方法尽量减少对其他对象的依赖。

最后要注意的是,单元测试可以说尽可能早,并且自动的发现一些问题,但是无法发现所有问题,比如设计的问题单元测试就是无能为力的,不过认真做过单元测试的代码,在质量上肯定会高很多,如果已习惯于做单元测试,那么编码的时候自然也会多考虑一些问题,这对我们的编码水平提高也很有好处的。

是不是很简单呢?那么立刻对你的代码来一场单元测试吧!

你可能感兴趣的:(JAVA单元测试入门)