每日构建(包含自动化测试,至少我是这么做的)可以保证我们的代码每天都在可控制的范围内,任何人对于代码库中的修改都能通过每日构建反馈给开发小组,但是我们如何知道我们所有的测试是否够呢,我们是否遗漏的某些代码的四角了,这些问题通过简单的测试报告是无法获知的,幸好我们有代码测试覆盖工具可以帮助我们消除我们的担忧.
下面我来说一下自己是如何实践代码覆盖率测试的.
如下我已经拥有了自己的工程,工程结构图如下
工程中的ant build是通过eclipse自动生成的,生成方法为右击工程名-->export.
大家可以根据自己的需要来选择生成脚本,我对于家里自己的工程基本都是用eclipse自己的生成的,至于公司则全部手写,其实ant手写也挺快的,而且也非常简单.
好了,我们现在有了ant 脚本,我们加下来需要做的就是将单元测试覆盖的功能加进去.我选择使用cobertura,免费的冬冬生成的报告非常有用,而且能和ant非常好的集成.ant本身并没有cobertura的task支持,我们需要做点手脚让ant明白我们要用cobertura.
首先当然是从cobertura的官网上(http://cobertura.sourceforge.net/)下载cobertura的最新版本,现在最新版本为1.9.
接下来我们需要在我们的build脚本中声明cobertura的 task
< path id ="cobertura.classpath" >
< fileset dir ="${cobertura.dir}" >
< include name ="cobertura.jar" />
< include name ="lib/**/*.jar" />
</ fileset >
</ path >
< delete file ="cobertura.ser" />
< taskdef classpathref ="cobertura.classpath" resource ="tasks.properties" />
要使用我们必须对我们所需要测试的class文件打上标签
< cobertura-instrument todir ="WebRoot/WEB-INF/instrumented-classes" >
< fileset dir ="WebRoot/WEB-INF/classes" >
< include name ="**/*.class" />
</ fileset >
</ cobertura-instrument >
</ target >
标签打好了,接下来就是测试了,这里有一点很重要,就是打上标签的class必须在被测试的class之前出现.
< mkdir dir ="${junit.output.dir}/cover-test" />
< junit fork ="yes" printsummary ="withOutAndErr" >
< formatter type ="xml" />
< classpath >
< fileset dir ="D:/developTools/cobertura-1.9/lib" >
< include name ="**/*.jar" />
</ fileset >
</ classpath >
< classpath refid ="cobertura.classpath" />
< classpath location ="D:/developTools/cobertura-1.9/cobertura.jar" />
< classpath location ="WebRoot/WEB-INF/instrumented-classes" />
< classpath >
< pathelement path ="WebRoot/WEB-INF/classes" />
</ classpath >
< classpath refid ="test.classpath" />
< batchtest fork ="yes" todir ="${junit.output.dir}" >
< fileset dir ="test" >
< include name ="**/*Test*.java" />
< exclude name ="**/AllTests.java" />
</ fileset >
</ batchtest >
</ junit >
</ target >
ok测试也有了,现在该是产生测试报告的时候了
< cobertura-report destdir ="cobertura" >
< fileset dir ="src" >
< include name ="**/*.java" />
</ fileset >
< fileset dir ="test" >
< include name ="**/*.java" />
</ fileset >
</ cobertura-report >
</ target >
好了,到这里为止我们的build文件已经可以产生测试覆盖率报告了,让我们运行看看结果吧.