XP编程这么多时间以来深受大家的喜爱,代码测试覆盖率作为XP不可缺少的一个部分深受管理者的喜爱,在目前市场上有很多的这方面的工具,最经典的为cover,但其不是免费的(对商业不是免费,对open source是免费的),今天我将推荐JCoverage,这是一个很不错的工具,虽然不是OpenSource的,但对于个人其有free版的.
主页:http://www.jcoverage.com/ |
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 /> |