注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

单元测试 - JUnit+Ant+Cobertura生成单元测试代码覆盖率 | How to Generate Code Coverage Report With Junit And Cobertura  

2013-02-27 19:50:47|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
单元测试 - JUnit+Ant+Cobertura生成单元测试代码覆盖率 | How to Generate Code Coverage Report With Junit And Cobertura - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
 
   上一篇文章《单元测试-使用JUnit+Ant自动化执行单元测试并生成报告 | How to Automated Unit Testing with JUnit and Ant》说明了JUnit+Ant自动化执行单元测试和生成报告。本篇文章继续讲解单元测试中如何生成单元测试代码覆盖率报告。
    Cobertura通过额外的语句来记录在测试时类的哪些行被执行,哪些行没有执行,以HTML或XML格式生成报告。通过报告,我们可以非常容易发现我们漏掉的测试用例,从而提高代码的健壮性。Cobertura被设计成可结合Ant运行。

一、编写用Cobertura生成报告的Ant脚本

1、本次使用Cobertura的当前最新版本1.9.4.1,它依赖的类库清单如下:
<path id="cobertura.classpath">
        <pathelement location="${src.extend.lib.dir}/cobertura-1.9.4.1.jar" />
        <pathelement location="${play.lib.dir}/lib/asm-all-3.3.1.jar" />
        <pathelement location="${play.lib.dir}/lib/log4j-1.2.16.jar" />
        <pathelement location="${src.extend.lib.dir}/jakarta-oro-2.0.8.jar" />
</path>

2、首先,添加一个taskdef。然后,配置一个cover-instrument任务,用字节码技术往已经编译好的class中添加日志代码,生成用于测量代码覆盖率的class。
<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
<target name="cover-instrument" depends="compile">
        <mkdir dir="${target.cover-test.dir}"/>
        <cobertura-instrument todir="${target.cover-test.dir}">
            <fileset dir="${target.java.dir}">
                <include name="**/**.class" />
            </fileset>
        </cobertura-instrument>
    </target>
<cobertura-instrument>标签配置属性说明:
  • todir - 存放织入了日志代码的测量代码覆盖率的class。
<cobertura-instrument>中的子元素<fileset>指定需要生成代码覆盖率报告的class。

3、添加一个cover-test任务,用于执行单元测试代码。
<target name="cover-test" depends="cover-instrument">
        <mkdir dir="${target.cover-test-report.dir}"/>
        <junit printsummary="on" haltonerror="on" haltonfailure="on" fork="on">
            <classpath path="${target.cover-test.dir}" />
            <classpath refid="app.test.classpath" />
            <classpath refid="app.classpath" />
            <batchtest todir="${target.cover-test-report.dir}">
                <fileset dir="${target.unit-test.dir}">
                    <include name="**/*Test.class" />
                </fileset>
            </batchtest>
        </junit>
</target>
单元测试 - JUnit+Ant+Cobertura输出单元测试代码覆盖率 | How to Generate Code Coverage Report With Junit And Cobertura - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来注:
  • 被织入了日志代码用于测量代码覆盖率的class必须位于所有<classpath>的最前面。
  • <junit>中的fork必须启用。可设置为"on","true"或"yes"。

4、定义一个cover-report任务。生成代码覆盖率报告。
<target name="cover-report" depends="cover-test">
        <cobertura-report srcdir="${src.java.dir}" destdir="${target.cover-test-report.dir}" />
</target>

二、代码覆盖率报告样本

在命令行中执行:ant cover-report 生成代码覆盖率报告。类似如下:

单元测试 - JUnit+Ant+Cobertura输出单元测试代码覆盖率 | How to Generate Code Coverage Report With Junit And Cobertura - 傲风 - 宝剑锋从磨砺出 梅花香自苦寒来
 

附录:完整的Ant脚本build.xml样例

<?xml version="1.0" encoding="UTF-8" ?>
<project name="busimonitor" basedir=".">
    <property name="src.java.dir" location="${basedir}/app" />
    <property name="src.test.dir" location="${basedir}/test" />
    <property name="target.dir" location="${basedir}/classes" />
    <property name="target.java.dir" location="${target.dir}/java" />
    <property name="target.unit-test.dir" location="${target.dir}/unit-test" />
    <property name="target.cover-test.dir" location="${target.dir}/cover-test" />
    <property name="src.extend.lib.dir" location="${basedir}/lib"/>
    <property name="play.lib.dir" location="/devdata/projects/game/play-1.2.5/framework" />
    <property name="target.report.dir" location="${basedir}/report" />
    <property name="target.unit-test-report.dir" location="${target.report.dir}/unit-test" />
    <property name="target.cover-test-report.dir" location="${target.report.dir}/cover-test" />
    <path id="app.classpath">         <fileset dir="${play.lib.dir}">             <include name="**/*.jar" />         </fileset>         <fileset dir="${src.extend.lib.dir}">             <include name="*.jar" />         </fileset>
        <path location="${target.java.dir}" />         <path location="${basedir}/conf" />     </path>
    <path id="app.test.classpath">         <path location="${target.unit-test.dir}" />     </path>
    <target name="compile.java">         <mkdir dir="${target.java.dir}" />         <javac srcdir="${src.java.dir}" destdir="${target.java.dir}"              debug="on" source="1.6" includeantruntime="on">             <classpath refid="app.classpath"></classpath>         </javac>     </target>
    <target name="compile.test" depends="compile.java">         <mkdir dir="${target.unit-test.dir}" />         <javac srcdir="${src.test.dir}" destdir="${target.unit-test.dir}"              debug="on" source="1.6" includeantruntime="on">             <classpath refid="app.classpath"></classpath>             <classpath refid="app.test.classpath"></classpath>         </javac>
        <copy todir="${target.unit-test.dir}">             <fileset dir="${src.test.dir}">                 <include name="**/*.properties" />                 <include name="**/*.xml" />             </fileset>         </copy>     </target>
    <target name="compile" depends="compile.java, compile.test"></target>
    <target name="unit-test" depends="compile">         <mkdir dir="${target.unit-test-report.dir}" />         <junit printsummary="on" haltonerror="off"              haltonfailure="off" fork="on">             <formatter type="plain" usefile="off"/>             <formatter type="xml" usefile="on" />             <batchtest todir="${target.unit-test-report.dir}">                 <fileset dir="${target.unit-test.dir}">                     <include name="**/*Test.class"/>                 </fileset>             </batchtest>             <classpath refid="app.classpath"></classpath>             <classpath refid="app.test.classpath"></classpath>         </junit>     </target>
    <target name="unit-test-report" depends="unit-test">         <mkdir dir="${target.unit-test-report.dir}/html" />         <junitreport todir="${target.unit-test-report.dir}">             <fileset dir="${target.unit-test-report.dir}">                 <include name="TEST-*.xml" />             </fileset>             <report todir="${target.unit-test-report.dir}/html" />         </junitreport>     </target>

<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />     <target name="cover-instrument" depends="compile">         <mkdir dir="${target.cover-test.dir}"/>         <cobertura-instrument todir="${target.cover-test.dir}">             <fileset dir="${target.java.dir}">                 <include name="**/**.class" />             </fileset>         </cobertura-instrument>     </target>
    <target name="cover-test" depends="cover-instrument">         <mkdir dir="${target.cover-test-report.dir}"/>         <junit printsummary="on" haltonerror="on" haltonfailure="on" fork="on">             <classpath path="${target.cover-test.dir}" />             <classpath refid="app.test.classpath" />             <classpath refid="app.classpath" />             <batchtest todir="${target.cover-test-report.dir}">                 <fileset dir="${target.unit-test.dir}">                     <include name="**/*Test.class" />                 </fileset>             </batchtest>         </junit>     </target>
    <target name="cover-report" depends="cover-test">         <cobertura-report srcdir="${src.java.dir}" destdir="${target.cover-test-report.dir}" />     </target>

</project>


参考资料 | References



<正文结束>

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2013年02月27日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容或者说明原作者和转载地址!

  评论这张
 
阅读(3253)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017