下面还是简要的介绍一下Clover在JUnit中的使用(构建工具为Ant):
1.在使用Clover做测试覆盖率分析之前请确保您的代码及测试代码无误。
2.如果采用Ant作为构建工具,则将clover.jar放入Ant的classpath下。也可采用另一种方法,可先将clover.jar及Clover中的另一个jar包cenquatasks.jar放入项目的lib下,采用cenquatasks.jar中的extendclasspath方法将clover.jar扩展到Ant下,在build.xml中加入以下代码:
<
taskdef
resource
="com/cenqua/ant/antlib.xml"
classpath
="lib/cenquatasks.jar"
/>
< extendclasspath path ="lib/clover.jar" />
< taskdef resource ="clovertasks" classpath ="lib/clover.jar" />
3.添加clovertask到Ant中,如下:
< extendclasspath path ="lib/clover.jar" />
< taskdef resource ="clovertasks" classpath ="lib/clover.jar" />
<
taskdef
resource
="clovertasks"
/>
4.在build.xml中加入clover的初始化任务:
<!--
clover.init
-->
< target name ="clover.init" >
< clover-setup initString ="clover_coverage.db" preserve ="true" />
</ target >
注意:步骤3中的代码可放入4中。
< target name ="clover.init" >
< clover-setup initString ="clover_coverage.db" preserve ="true" />
</ target >
5.加入一个或多个运行clover report的任务,最后的结果有多种输出方式:html、pdf、swing、xml等等。
其中,swing方式的代码如下:
<!--
show the clover coverage result with swing
-->
< target name ="clover.swing" depends ="clover" >
< clover-view />
</ target >
html方式如下:
< target name ="clover.swing" depends ="clover" >
< clover-view />
</ target >
<!--
show the clover coverage result with html file
-->
< target name ="clover.html" depends ="clover" >
< clover-report >
< current outfile ="${target.dir}/clover" title ="Clover Report" >
< format type ="html" />
</ current >
</ clover-report >
</ target >
上面代码中都depends="clover",这里clover任务只是为了简洁而设,代码如下:
< target name ="clover.html" depends ="clover" >
< clover-report >
< current outfile ="${target.dir}/clover" title ="Clover Report" >
< format type ="html" />
</ current >
</ clover-report >
</ target >
<!--
runs the clover
-->
< target name ="clover" depends ="clean,clover.init,compile,test" />
通过以上代码的设置即可运行clover.swing 或者clover.html运行Clover查看测试代码的覆盖率。测试结果如下图所示:
< target name ="clover" depends ="clean,clover.init,compile,test" />
其中build.xml中的运行JUnit测试代码的任务如下:
<!--
runs the tests
-->
< target name ="test" >
< java classname ="MoneyTest" fork ="yes" >
< classpath refid ="build.classpath" />
</ java >
</ target >
这是通过java命令运行的,也就是在MoneyTest.java中有main方法:
< target name ="test" >
< java classname ="MoneyTest" fork ="yes" >
< classpath refid ="build.classpath" />
</ java >
</ target >
public
static
void
main(String args[])
{
junit.textui.TestRunner.run(MoneyTest. class );
}
还可以直接通过junit命令运行,如下:
junit.textui.TestRunner.run(MoneyTest. class );
}
<
target
name
="unittest"
depends
="clover.init,compile"
description
="Test the application"
>
< taskdef resource ="clovertasks" />
< echo message ="Testing the application with junit .." />
< junit haltonfailure ="true" printsummary ="true" fork ="true" >
< classpath refid ="build.classpath" />
< classpath >
< pathelement path ="${ant.home}/lib/clover.jar" />
</ classpath >
< formatter type ="brief" usefile ="false" />
<!-- <test name="MoneyTest"/> -->
< batchtest >
< fileset dir ="${build}" includes ="**/*Test.class" />
</ batchtest >
</ junit >
</ target >
以上两种test方法都可使用。
< taskdef resource ="clovertasks" />
< echo message ="Testing the application with junit .." />
< junit haltonfailure ="true" printsummary ="true" fork ="true" >
< classpath refid ="build.classpath" />
< classpath >
< pathelement path ="${ant.home}/lib/clover.jar" />
</ classpath >
< formatter type ="brief" usefile ="false" />
<!-- <test name="MoneyTest"/> -->
< batchtest >
< fileset dir ="${build}" includes ="**/*Test.class" />
</ batchtest >
</ junit >
</ target >
在所有任务中,首先要运行clover.init这样就能启动clover,对后面的任务进行监控并adapt一些操作,在随后的compile过程中,clover会记录所编译的java文件的各种数据并存入其db数据库,clover会监控随后运行的UnitTest,计算测试的覆盖率并写入数据库。这里有一点要注意:无论是采用java方式还是junit方式运行test房间,都要在命令中加入属性fork="true",这是因为clover要在JVM shutdown的时候将数据写入数据库,如果没有这个属性,就会出现“no coverage data found for *.db”错误,出现测试覆盖率均为0的结果。