XP编程这么多时间以来深受大家的喜爱,代码测试覆盖率作为XP不可缺少的一个部分深受管理者的喜爱,在目前市场上有很多的这方面的工具,最经典的为cover,但其不是免费的(对商业不是免费,对open source是免费的),今天我将推荐JCoverage,这是一个很不错的工具,虽然不是OpenSource的,但对于个人其有free版的.
JCoverage的允许需要JUnit和Log4j,等类库,你可以在其文档中看到详细说明,同时JCoverage可以和Ant结合在一起使用,
注意事项:
1 : 初始化是最好删除当前目录下的jcoverage.ser文件,这个文件就是测试的结果,如果其在当前目录下找到这个文件将不会进行测试,或者重新测试
2 : 在进行instrument时,一定要保证其class是debug模式下编译的,否则将不能注入jcoverage指令,建议从新用debug模式编译一个在当前目录
3 : 在进行junit是,一定要保证测试的是加入jcoverage指令的类,否则不能生成jcoverage.ser文件,当然也就不能够测试覆盖率了,我在这个弄了很久,主要是classpath的问题,这个时候你要保证其的classpath中包含加入jcoverage指令的class并不简单,如果你使用工程级别的classpath,那你就痛苦吧,我就是这样痛苦的很,你最好使用一个新的classpath,即除了工程必须的就是加入jcoverage指令的class了,这也就是我下面的例子为什么那么烦琐的原因;这个看似简单的问题会把你的信心给扫的全无.因为如果你经常使用ant的话,那么在你的classpath中有很多个一样的class,如工程自己一个,为了加入jcoverage指令而以debug模式编译的一份,加入jcoverage指令的一份,那么现在至少有三份了,罗嗦了这么多就是不希望大家走弯路.
4 : 最后生成报告,你可以选择html和xml格式,但free版只有html格式,这里有一个不是很完美的地方,如果你的资源代码是UTF-8编码的,那么生成的报告中代码注释将有一部分乱码,
附录中有两部分内容:
附录1:是我个人的ant脚本 ,这段脚步是我个人的环境,你如果需要使用请修改之 ,
附录2:JCoverage的报告截图 ,次报告为Html的格式,当然你也可以设置为其它格式
附录:我个人工程中的ant脚本:
<!--jcoverager report-->
<property name=build.jcoverageReport.dir value=${build.dir}/JCoverageReport />
<taskdef resource=tasks.properties classpathref=appclasspath />
<!--拷贝资源文件,这里主要是为了下面生成报告方便-->
<target name=jcoverage_init depends=init>
<mkdir dir=${build.jcoverageReport.dir}/temp_source />
<copy todir=${build.jcoverageReport.dir}/temp_source>
<fileset dir=${project.src.dir} />
</copy>
<copy todir=${build.jcoverageReport.dir}/temp_source>
<fileset dir=${project.test_src.dir} />
</copy>
</target>
<!--编译资源代码,由于instrument要求class必须为debug模式编译的,为了安全这里从新编译-->
<target name=jcoverage_compile depends=jcoverage_init>
<mkdir dir=${build.jcoverageReport.dir}/temp_classes />
<javac srcdir=${build.jcoverageReport.dir}/temp_source
destdir=${build.jcoverageReport.dir}/temp_classes
debug=yes>
<include name=**/*.java />
<classpath refid=classpath />
</javac>
</target>
<!--instrument在类的二进制文件中注入jcoverage指令;注意:一定是debug模式下编译的类-->
<target name=jcoverage_instrument depends=jcoverage_compile>
<mkdir dir=${build.jcoverageReport.dir}/temp_instrument />
<instrument todir=${build.jcoverageReport.dir}/temp_instrument>
<!-- 忽略org.apache.common的应用 -->
<ignore regex=org.* />
<fileset dir=${build.jcoverageReport.dir}/temp_classes>
<include name=**/*.class />
</fileset>
<classpath refid=classpath />
</instrument>
</target>
<!-- 启动junit,进行代码覆盖测试 -->
<target name=jcoverage_junit depends=jcoverage_instrument>
<mkdir dir=${build.jcoverageReport.dir}/temp_junit />
<junit printsummary=no haltonfailure=no fork=yes>
<formatter type=brief usefile=false />
<formatter type=xml usefile=yes />
<batchtest todir=${build.jcoverageReport.dir}/temp_junit>
<fileset dir=${build.jcoverageReport.dir}/temp_instrument includes=**/*Test.class />
</batchtest>
<classpath>
<pathelement location=${build.jcoverageReport.dir}/temp_instrument />
<path refid=classpath />
</classpath>
</junit>
</target>
<!-- 产生代码覆盖测试报告 -->
<target name=jcoverage_report depends=jcoverage_junit>
<report srcdir=${build.jcoverageReport.dir}/temp_source destdir=${build.jcoverageReport.dir}/>
</target>
<target name=jcoverage depends=jcoverage_compile,jcoverage_instrument,jcoverage_report />