每日构建(包含自动化测试,至少我是这么做的)可以保证我们的代码每天都在可控制的范围内,任何人对于代码库中的修改都能通过每日构建反馈给开发小组,但是我们如何知道我们所有的测试是否够呢,我们是否遗漏的某些代码的四角了,这些问题通过简单的测试报告是无法获知的,幸好我们有代码测试覆盖工具可以帮助我们消除我们的担忧.
下面我来说一下自己是如何实践代码覆盖率测试的.
如下我已经拥有了自己的工程,工程结构图如下

工程中的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
<
property
name
="cobertura.dir"
value
="D:/developTools/cobertura-1.9"
/>
<
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文件打上标签
<
target
name
="instrument"
>
<
cobertura-instrument
todir
="WebRoot/WEB-INF/instrumented-classes"
>
<
fileset
dir
="WebRoot/WEB-INF/classes"
>
<
include
name
="**/*.class"
/>
</
fileset
>
</
cobertura-instrument
>
</
target
>
标签打好了,接下来就是测试了,这里有一点很重要,就是打上标签的class必须在被测试的class之前出现.
<
target
name
="cover-test"
depends
="instrument"
>
<
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测试也有了,现在该是产生测试报告的时候了
<
target
name
="coverage-report"
depends
="cover-test"
>
<
cobertura-report
destdir
="cobertura"
>
<
fileset
dir
="src"
>
<
include
name
="**/*.java"
/>
</
fileset
>
<
fileset
dir
="test"
>
<
include
name
="**/*.java"
/>
</
fileset
>
</
cobertura-report
>
</
target
>
好了,到这里为止我们的build文件已经可以产生测试覆盖率报告了,让我们运行看看结果吧.