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

Emma in Ant for offline

阅读更多
1. 下载emma lib
http://sourceforge.net/projects/emma/files/emma-release/2.0.5312/emma-2.0.5312.zip/download
我下载的是emma-2.0.5312.zip

2. 解压emma-2.0.5312.zip,里面有一个lib目录,内含2个jar文件:
emma.jar
emma_ant.jar: 包含了Emma taskdefs
这两个文件都要放在项目的lib库里,可以在build.xml里设置一个path element以方便ant调用

<!-- directory that contains emma.jar and emma_ant.jar: -->
  <property name="emma.dir" value="${basedir}/../lib" />

  <path id="emma.lib" >
    <pathelement location="${emma.dir}/emma.jar" />
    <pathelement location="${emma.dir}/emma_ant.jar" />
  </path>

  <taskdef resource="emma_ant.properties" classpathref="emma.lib" />


2. offline模式,先给需要进行代码覆盖的class文件加字节码

<target name="emma" description="turns on EMMA instrumentation/reporting" >
    <property name="emma.enabled" value="true" />
    <!-- EMMA instr class output directory: -->
    <property name="out.instr.dir" value="${basedir}/outinstr" />
    <mkdir dir="${out.instr.dir}" />
  </target>


<target name="emma.add.bytecode" depends="init, compile" description="Emma add bytecode to classes" >
    <emma enabled="${emma.enabled}" >
      <instr instrpathref="run.classpath"
             destdir="${out.instr.dir}" 
             metadatafile="${coverage.dir}/metadata.emma"
             merge="true">
        <filter includes="classes name or classes package which you want to coverage">
        <filter excludes="classes name or classes package which you do not want to coverage">
        <filter value="+classes, -classes">
        <filter file="filter.txt">
      </instr>
    </emma>
  </target>

注:
(1) instr是emma的字节码插入器,它是在编译好的classes目录里把需要进行coverage的class文件插入bytecode,并copy到
${out.instr.dir}目录,生成metadata.emma文件
(2) filter用于匹配哪些类需要或者不需要进行coverage,可以用includes\excludes\value\file这几种方式,支持*匹配符。file方式里的文件可以是这样的:
#-表示这个类不需要coverage
-com.foo.test.*
#+表示需要
+com.foo.*

3. 运行代码,或者是运行junit来执行代码,这里是用emma下载包里自带的example为例是执行代码,注意加的两个jvmarg,把运行代码的覆盖率文件coverage.emma生成,以及生成的内容是merge方式

<target name="run" depends="emma.add.bytecode" description="Execute code or run junit test">
    <java classname="Main" fork="true" >
      <classpath>
       <pathelement location="${out.instr.dir}" />
        <path refid="run.classpath" />
        <path refid="emma.lib" />
      </classpath> 
      <jvmarg value="-Demma.coverage.out.file=${coverage.dir}/coverage.emma" />
      <jvmarg value="-Demma.coverage.out.merge=true" />
    </java>
  </target>


4. 生成report,根据前两步的metadata.emma和coverage.emma两个文件,生成txt和html两种格式的report
  <target name="emma.report" depends="run" description="Generate the emma report">
    <emma enabled="${emma.enabled}" >
      <report sourcepath="${src.dir}" >
        <fileset dir="${coverage.dir}" >
          <include name="*.emma" />
        </fileset>

        <txt outfile="${coverage.dir}/coverage.txt" />
        <html outfile="${coverage.dir}/coverage.html" />
      </report>
    </emma>
  </target>


<report>的sourcepath用于指定源代码目录,这样可以在html里看到哪些代码被coverage了。
其他的一些参数:
depth: 指定report细到哪一层,可以为以下的值:

    * all
    * package
    * source
    * class
    * method

encoding: 指定report的字符集
参考:
http://emma.sourceforge.net/userguide_single/userguide.html
http://emma.sourceforge.net/reference_single/reference.htm

原文地址:http://hi.baidu.com/lettoo/blog/item/da98a0038edaaae708fa93cd.html
分享到:
评论
1 楼 cancan7 2012-11-23  
您好,为什么我下载的emma_ant.jar中没有Emma taskdefs文件呢,而且海报这个错误:
D:\Workspaces\ant_junit_emma\CodeCoverage\make\build.xml:61: taskdef A class needed by

class com.vladium.emma.emmajavaTask cannot be found: org/apache/tools/ant/taskdefs/Java
using the classloader AntClassLoader[D:\Workspaces\ant_junit_emma\CodeCoverage\
lib\emma.jar;D:\Workspaces\ant_junit_emma\CodeCoverage\lib\emma_ant.jar]

Total time: 0 seconds

期待您的尽快回复,谢谢

相关推荐

Global site tag (gtag.js) - Google Analytics