【问题标题】:How do I generate Emma code coverage reports using Ant?如何使用 Ant 生成 Emma 代码覆盖率报告?
【发布时间】:2010-09-08 08:30:26
【问题描述】:

如何设置 Ant 任务以生成 Emma 代码覆盖率报告?

【问题讨论】:

    标签: ant code-analysis emma


    【解决方案1】:

    要回答有关源目录和检测目录在哪里的问题(这些可以切换到您的标准目录结构):

    <property file="build.properties" />
    <property name="source" location="src/main/java" />
    <property name="test.source" location="src/test/java" />
    <property name="target.dir" location="target" />
    <property name="target" location="${target.dir}/classes" />
    <property name="test.target" location="${target.dir}/test-classes" />
    <property name="instr.target" location="${target.dir}/instr-classes" />
    

    类路径:

    <path id="compile.classpath">
      <fileset dir="lib/main">
        <include name="*.jar" />
      </fileset>
    </path>
    
    <path id="test.compile.classpath">
      <path refid="compile.classpath" />
      <pathelement location="lib/test/junit-4.6.jar" />
      <pathelement location="${target}" />
    </path>
    
    <path id="junit.classpath">
      <path refid="test.compile.classpath" />
      <pathelement location="${test.target}" />
    </path>
    

    首先你需要设置 Ant 可以在哪里找到 Emma 库:

    <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" />
    

    然后检测代码:

    <target name="coverage.instrumentation">
        <mkdir dir="${instr.target}"/>
        <mkdir dir="${coverage}"/>
        <emma>
            <instr instrpath="${target}" destdir="${instr.target}" metadatafile="${coverage}/metadata.emma" mode="copy">
                <filter excludes="*Test*"/>
            </instr>
        </emma>
        <!-- Update the that will run the instrumented code -->
        <path id="test.classpath">
            <pathelement location="${instr.target}"/>
            <path refid="junit.classpath"/>
            <pathelement location="${emma.dir}/emma.jar"/>
        </path>
    </target>
    

    然后使用正确的 VM 参数运行目标,例如:

    <jvmarg value="-Demma.coverage.out.file=${coverage}/coverage.emma" />
    <jvmarg value="-Demma.coverage.out.merge=true" />
    

    最后生成你的报告:

    <target name="coverage.report" depends="coverage.instrumentation">
        <emma>
            <report sourcepath="${source}" depth="method">
                <fileset dir="${coverage}" >
                    <include name="*.emma" />
                </fileset>
                <html outfile="${coverage}/coverage.html" />
            </report>
        </emma>
    </target>
    

    【讨论】:

    • 看起来不像你定义的 ${coverage}
    【解决方案2】:

    User Guide has a good example of how to set up your build script 这样您不仅可以将检测代码与执行分开,而且还包含在同一个 &lt;target&gt; 中,这样您就不必运行一系列不同的目标,而是可以只需执行 ant emma tests 之类的操作(例如,如果 ant tests 是您通常运行单元测试的方式)。

    这是他们的例子:

    <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="run" depends="init, compile" description="runs the examples" >
        <emma enabled="${emma.enabled}" >
          <instr instrpathref="run.classpath"
                 destdir="${out.instr.dir}" 
                 metadatafile="${coverage.dir}/metadata.emma"
                 merge="true"
          />
        </emma>
    
        <!-- note from matt b: you could just as easily have a <junit> task here! -->
        <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>
    
        <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>
    

    【讨论】:

      【解决方案3】:

      Emma 2.1 引入了另一种获取运行时覆盖信息(.ec 文件)的方法。可以从运行检测应用程序的计算机的给定端口远程请求数据。因此无需停止 VM。

      要获取包含运行时覆盖率数据的文件,您需要在运行测试和生成覆盖率报告之间在 Ant 脚本中插入以下 sn-p:

      <emma>
          <ctl connect="${emma.rt.host}:${emma.rt.port}" >
              <command name="coverage.get" args="${emma.ec.file}" />
              <command name="coverage.reset" />
          </ctl>
      </emma>
      

      其他步骤与 Emma 2.0 类似。他们在previous post中得到了完美的描述

      有关 Emma 2.1 功能的更多信息:http://sourceforge.net/project/shownotes.php?group_id=108932&release_id=336859

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 1970-01-01
        • 2021-06-26
        相关资源
        最近更新 更多