修改build.classpath代码成如下所示:
这里顺便我们也把path的值说明一下,省得有人不懂哦!这里的ant.home是在计算机里创建的环境变量ANT_HOME,它的值应该是你的ant的安装路径,例如c:ant,所以前两行代码的意思,就是把c:antlibclover.jar和c:antlibjunit.jar作为依赖库。当然,事先你一定要拷贝这两个jar文件到你的lib目录。
好了,我们现在开始重新使用clover任务来运行junit测试!
C:cloversincky>ant clean
Buildfile: build.xml
clean:
[delete] Deleting directory C:cloversinckybuild
BUILD SUCCESSFUL
Total time: 0 seconds
C:cloversincky>ant clover compile
Buildfile: build.xml
clover:
[clover-setup] Clover Version 1.3.8, built on May 18 2005
[clover-setup] loaded from: C:cloverlibclover.jar
[clover-setup] 30 day Evaluation License registered to sinckyzhang@163.com
[clover-setup] You have 10 day(s) before your Evaluation License expires.
[clover-setup] Clover is enabled with initstring 'C:cloversinckydemo_coverage.db'
compile:
[mkdir] Created dir: C:cloversinckybuild
[javac] Compiling 4 source files to C:cloversinckybuild
[clover] Clover Version 1.3.8, built on May 18 2005
[clover] loaded from: C:cloverlibclover.jar
[clover] 30 day Evaluation License registered to sinckyzhang@163.com
[clover] You have 10 day(s) before your Evaluation License expires.
[clover] No coverage database 'C:cloversinckydemo_coverage.db' fou
nd. Creating a fresh one.
[clover] Clover all over. Instrumented 4 files.
BUILD SUCCESSFUL
Total time: 2 seconds
我们会发现在sincky目录下多了一个demo_coverage.db文件;之后我们再执行测试任务:
C:cloversincky>ant test
Buildfile: build.xml test:
[java] ......................
[java] Time: 0
[java] OK (22 tests)
BUILD SUCCESSFUL
Total time: 0 seconds
我们会看到又多了一个关于junit测试的.db文件!现在,我们已经使用clover统计完了覆盖率信息,之后创建clover报告,以直观方式来查看具体的覆盖率结果!这个任务需要在build.xml里创建任务。Clover的报告有多种方式:html、pdf、xml以及swingview的图形化报告,当然与eclipse等java的IDE集成,也会在IDE里创建报告;这里我们只演示html
类型的报告!我们修改build.xml文件,添加如下任务:
这里的元素指产生的报告类型是当前的测试报告,还有历史报告,我们在后边讲解!这个报告是html格式,创建后的报告放在一个叫做clover_html的文件夹里,报告标题叫做Clover demo。
我们现在给出完整的修改后的build.xml文件:
moneytest build file
fork=\
现在我们执行report这个任务:
C:cloversincky>ant report
Buildfile: build.xml
clover:
[clover-setup] Clover Version 1.3.8, built on May 18 2005
[clover-setup] loaded from: C:cloverlibclover.jar
[clover-setup] 30 day Evaluation License registered to sinckyzhang@163.com
[clover-setup] You have 10 day(s) before your Evaluation License expires.
[clover-setup] Clover is enabled with initstring 'C:cloversinckydemo_coverage.db'
report:
[clover-report] Clover Version 1.3.8, built on May 18 2005
[clover-report] loaded from: C:cloverlibclover.jar
[clover-report] 30 day Evaluation License registered to sinckyzhang@163.com
[clover-report] You have 10 day(s) before your Evaluation License expires.
[clover-report] Loaded results from 1 coverage recording.
[clover-report] Writing report to 'C:cloversinckyclover_html'
[clover-report] Done. Processed 1 packages.
BUILD SUCCESSFUL
Total time: 1 second
现在你可以打开sincky下的clover_html文件夹下的index.html文件,如下所示:
报告最左边是包名,以及包下边的类;右边是主窗口,显示当前这个Money类的测试覆盖率,我们可以通过行号来查看到15、16、17行执行了156次,下边还会有两行一次也没有执行过,所以造成这个类整体的测试覆盖率不是100%。 40 27
if (isZero()) 41 0
if (anObject instanceof IMoney) 42 0
return ((IMoney)anObject).isZero();
四、重构测试代码实现百分百测试覆盖率
我们总是希望做单元测试的时候,让代码的测试覆盖率尽可能的达到100%,所以我们需要重构测试代码。从分析得知,第40行虽然执行了27次,但是从来没有测试if的判断条件为true的情况,所以我们要添加测试用例,测试isZero()返回为true的情况!因此,我们修改测试代码MoneyTest.java文件,在前边初始化地方加上一个Money实例,如下:
public class MoneyTest extends TestCase { private Money f12CHF; private Money f14CHF; private Money f7USD; private Money f21USD; private Money f0USD;在setup方法里添加:
protected void setUp() {
f12CHF= new Money(12, \
f14CHF= new Money(14, \
f7USD= new Money( 7, \
f21USD= new Money(21, \
f0USD = new Money(0, \
在最后加上一个测试用例:
public void testMoneyEqualsZero() {
assertTrue(!f0USD.equals(null));
IMoney equalMoney = new Money(0, \
assertTrue(f0USD.equals(equalMoney)); }
之后,我们重新编译,测试,创建报告,即执行下列命令:
>ant clean
>ant clover compile
>ant test
>ant report
这时候再打开新的html报告,看到如下效果覆盖率已经到达100%:
完毕,如果能进展到这一步,相信你已经对使用junit、ant、clover做java的单元测试,已经到了一个新的飞越!如果有兴趣,你还可以把junit报告和clover报告一并输出,以更好的为企业开发中使用这种工作模式!
文章源码均来自clover网站,本人稍做修改。
写在后面的话:目前国内单元测试尚在起步阶段,由于工作量大,耗时耗成本,很多公司都省去该环节;但是使用一些先进的技术,对源代码一些关键的类进行单元测试是可行的,也是必要的;希望本文对测试与java开发界朋友有所收获,Sincky在来日会写一些关于clover高级应用的文章,分享给大家!(2005年9月于上海 台风暴雨夜)