`
yangzb
  • 浏览: 3500632 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JCoverage使用简明手册

    博客分类:
  • Java
阅读更多

    不论 TestCase 写的多么的好和完善,要想确保被测试的代码每一行都被执行,仍然是非常困难的。为了获取关于这方面的信息,我们可以使用 JCoverage

使用目的

JCoverage 正如其名,主要用于代码的覆盖测试。通过在被测试类的二进制文件中添加相应的指令,再配合 junit jcoverage 可以给出被测试类的代码覆盖率,并给出测试过程中哪些语句被执行,哪些没有。通过这些信息,我们可以了解测试代码的测试质量,以及被测试类中哪些语句需要特别的关注(即那些未被覆盖的语句)。

当前的版本是 1.0.5 ,可以从 www.jcoverage.com/downloads.html 下载。在实际使用时,需要将 jcoverage 用到的类放到对应的 classpath 中。在这个版本中它所依赖的外部类以及版本:

- bcel    5.1     http://jakarta.apache.org/bcel/

- log4j   1.2.8     http://jakarta.apache.org/log4j/

- getopt  1.0.9     http://gnu.org/

- oro     2.0.7   http://jakarta.apache.org/oro/

 

用法

1.       jcoverage 可以和 ant 配合使用,使这一过程自动化。基本用法:

-          编译被测试类和相应的被测试类的 junit 代码。

-          使用 <instrument> ,将 jcoverage 的指令加入到被测试类的二进制文件中。为了保证这一过程能够有效,请在编译被测试类时,设置 <javac> debug 属性设为 yes

-          执行 junit 代码进行代码覆盖测试。这一步需要注意的是,需要将被注入指令的测试类要早于单元测试所需的测试类装入。为了确保这一点,需要使用 <classpath> ,使注入指令的测试类位于测试类之前

-          使用 <report> 产生覆盖测试的报告。

2.       使用例子:

<!-- 采用 debug 模式编译被测试类 -->

<javac destdir="${dist.coverage.classes}" deprecation="on" debug="yes" >

<src path="${src.code}"/>

    <classpath refid="classpath"/>

</javac>

<!-- 编译被测试类的 junit 代码 -->

<javac destdir="${dist.coverage.junit}" deprecation="on">

    <src path="${src.junit}"/>

    <classpath refid="classpath"/>

</javac>

<!-- 定义 jcoverage 任务 -->

<path id="jcoverage">

        <fileset dir="junit_lib">

               <include name="jcoverage.jar"/>

        </fileset>

    </path>

<taskdef classpathref="jcoverage" resource="tasks.properties"/>

<!-- 给被测试类二进制代码中注入 jcoverage 的指令 -->

<instrument todir="${dist.coverage.instrument}">

        <classpath refid="classpath"/>

    <!-- 忽略 org.apache.common 的应用 -->

    <ignore regex="org.apache.common.*"/>

 

    <fileset dir="${dist.coverage.classes} ">

         <include name="**/*.class"/>

    </fileset>

</instrument>

<!-- 启动 junit ,进行代码覆盖测试 -->

<junit printsummary="yes" haltonfailure="no" fork="yes">

    <classpath>

        <!-- 注意:被注入指令的类,位置在测试类之前。

这样确保它们早于测试类备加载,使指令起作用。 -->

        <pathelement location="${dist.coverage.instrument} "/>

        <path refid="classpath"/>

        <pathelement location="${dist. coverage.junit} "/>

    </classpath>

 

    <formatter type="xml"/>

 

        <batchtest todir="${doc.jcoverageReport}">

         <fileset dir="${src.junit}" includes="**/*Test.java" />

     </batchtest>

</junit>

<!-- 产生代码覆盖测试报告 -->

<report srcdir="${src.code}" destdir="${doc.jcoverageReport}">

3.       jcoverage 提供的 ant 任务标签有:

-          <instrument> ,在类的二进制文件中注入 jcoverage 指令。注意:一定是 debug 模式下编译的类。

-          <report> ,产生 jcoverage 报告,默认格式是 HTML 。也可以产生 XML 格式方便应用客户自定义的 xslt 产生其他格式的报告。产生 XML 格式的报告:

<report srcdir="${src.code}" destdir="${doc.jcoverageReport}" format="xml" >

-          <merge> ,整合多个由 jcoverage 产生的输出文件。整个 jcoverage 实际的运作过程是:首先, jcoverage 给测试类注入指令产生新类,被注入指令的类在 junit 运行过程中产生输出文件(后缀为 ser ),最后根据输出文件产生报告。如果有多个输出文件, jcoverage 提供了 <merge> 来整合这些文件,最后,从整合文件中产生整体报告。用法:

<merge>

<fileset dir="${basedir}">

<include name="**/jcoverage.ser"/>

</fileset>

</merge>

-          <check> ,检查测试是否达到设定的标准,它可以和 <report> 配合使用。使用例子:

例1 

<check branch="95" line="95"/> ,意思是分支覆盖率需要达到 95% ,行覆盖率达到 95%

例2   

<check branch="95" line="95">

    <regex pattern="xptoolkit.jcoverage.*" branch="85" line="95"/>

</check>

包名符合 xptoolkit.jcoverage.* 模式的分支覆盖率达到 85% ,行覆盖率达到 95% 其余的分支覆盖率需要达到 95% ,行覆盖率达到 95%

检查表

       在使用 jcoverage 时需要注意的问题:

-          jcoverage 注入指令的类必须是在 debug 模式下编译的类。建议将那些使用 debug 模式编译的类的存放与最终的产品的目录分开。

-          使用了 <instrument> 的类,与源类的目录也最好分开。

-          对于那些使用了 AOP (如 AspectJ )技术的项目, jcoverage 不能很好的应用到那些已经添加了 Aspect 信息的类。

-          代码覆盖工具只是给出了指导性的意见,不要过分依赖和相信它的结果。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics