1

我有以下项目结构:

  • src/com/dummy/abc.java
  • src_tests/come/dummy/abcTest.java
  • 构建.xml

我需要通过使用 emma 的测试来检查我的代码的覆盖率。通过阅读 emma + junit 示例,我得出一个结论,要获得报告,我需要执行以下操作:

  1. 编译'src'
  2. 编译'src_tests'
  3. 仪器编译的 'src_tests' => 'instrumented_src_tests'
  4. 使用附加 jvmarg 在“instrumented_src_tests”上运行 junit

问题是步骤 4 应该返回某种文件,然后与“report”命令一起使用应该创建一个报告。我越来越

emma-report:
   [report] processing input files ...
   [report] 1 file(s) read and merged in 67 ms
   [report] nothing to do: no runtime coverage data found in any of the data files

~ 编辑我附上我的 build.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="HELL scream" default="all" basedir=".">
    <property name="build.sources.dir" location="${basedir}/src"/>
    <property name="build.sources.des" location="${basedir}/bin/classes"/>
    <property name="test.sources.dir" location="${basedir}/src_test"/>
    <property name="test.sources.des" location="${basedir}/bin/classes_test"/>
    <property name="test.reports.des" location="${basedir}/reports-junit"/>
    <property name="emma.sources.des" location="${basedir}/bin/classes_emma"/>
    <property name="emma.reports.des" location="${basedir}/reports-emma"/>
    <property name="emma.final.reports.des" location="${basedir}/reports-emma/final"/>
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <path id="emma.lib" >
        <fileset dir="/home/user1/Desktop/emma-2.0.5312/lib">
            <include name="*.jar"/>
        </fileset>
    </path>

    <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <target name="clean-all">
        <delete failonerror="false">
            <fileset dir="${emma.final.reports.des}"/>
            <fileset dir="${emma.reports.des}"/>
            <fileset dir="${emma.sources.des}"/>
            <fileset dir="${test.reports.des}"/>
            <fileset dir="${test.sources.des}"/>
            <fileset dir="${build.sources.des}"/>
        </delete>
    </target>
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <target name="compile-sources">
        <mkdir dir="${build.sources.des}"/>
        <javac srcdir="${build.sources.dir}" includes="" excludes="" destdir="${build.sources.des}" listfiles="true" debug="true" includeantruntime="false"/>
    </target>  
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->   
    <target name="compile-tests">
        <mkdir dir="${test.sources.des}"/>
        <javac srcdir="${test.sources.dir}" includes="" excludes="" destdir="${test.sources.des}" listfiles="true" debug="true" includeantruntime="false">
            <classpath>
                <pathelement location="/home/user1/Desktop/junit-4.10.jar"/>
                <pathelement location="${build.sources.des}"/>
            </classpath>
        </javac>
    </target> 
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <target name="compile-emma-tests">
        <emma enabled="true" >
            <instr instrpath="${test.sources.des}" destdir="${emma.sources.des}" metadatafile ="${emma.reports.des}/instrumentation.emma" merge ="true"/>
        </emma>
    </target>
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --> 
    <target name="run-tests">
        <mkdir dir="${test.reports.des}"/>
        <junit haltonfailure="no" showoutput="yes" printsummary="true">            
            <formatter type="plain" usefile="false" />
            <formatter type="xml"/>
            <classpath>
                <pathelement location="/home/user1/Desktop/junit-4.10.jar"/>
                <pathelement location="${build.sources.des}"/>  
                <pathelement location="${emma.sources.des}"/>                
                <path refid="emma.lib" />
            </classpath>

            <batchtest todir="${test.reports.des}" fork="true">
                <fileset dir="${emma.sources.des}"/>
            </batchtest>                       

            <jvmarg value="-Demma.coverage.out.file=${emma.reports.des}/coverage.emma" />
            <jvmarg value="-Demma.coverage.out.merge=false" />
        </junit>            
    </target>
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <target name="junit-tests-report">
        <junitreport todir="${test.reports.des}">
            <fileset dir="${test.reports.des}">
                <include name="TEST-*.xml"/>
           </fileset>

           <report format="frames" todir="${test.reports.des}/junit_reports"/>
       </junitreport>
    </target> 
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <target name="emma-tests-report">
        <emma enabled="true" >
            <report sourcepath="${build.sources.dir}">    
                <fileset dir="${emma.reports.des}" >
                    <include name="*.emma" />
                </fileset>

                <txt outfile="${emma.final.reports.des}/coverage.txt" depth="package" columns="class,method,block,line,name" />
                <xml outfile="${emma.final.reports.des}/coverage.xml" depth="package" />
                <html outfile="${emma.final.reports.des}/coverage.html" depth="method" columns="name,class,method,block,line" />
            </report>
        </emma>
    </target>
    <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
    <target name="all" depends="clean-all, compile-sources, compile-tests, compile-emma-tests, run-tests, junit-tests-report, emma-tests-report"/>
</project>

这可能是微不足道的......

另外,当使用 emma.sources.dest 我在我的(唯一)测试中得到这个

run-tests:
    [junit] Running com.emma.test.MathTest
    [junit] Testsuite: com.emma.test.MathTest
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
    [junit] 
    [junit]     Caused an ERROR
    [junit] Illegal local variable table length 5 in method com.emma.test.MathTest.<init>()V
    [junit] java.lang.ClassFormatError: Illegal local variable table length 5 in method com.emma.test.MathTest.<init>()V
    [junit]     at java.lang.Class.forName0(Native Method)
    [junit]     at java.lang.Class.forName(Class.java:188)
    [junit] 
    [junit] Test com.emma.test.MathTest FAILED

〜解决添加这个:

<jvmarg value="-XX:-UseSplitVerifier"/>
<jvmarg value="-Demma.coverage.out.file=${emma.reports.des}/coverage.emma" />
<jvmarg value="-Demma.coverage.out.merge=false" />
4

3 回答 3

3

Emma 自 2005 年以来一直没有稳定的版本,并且不能很好地与较新版本的 JDK 配合使用。自2011 年以来,Cobertura 没有进行任何新的开发。因此,我不再向开发人员推荐使用 Emma 或 Cobertura。

我已经切换到JaCoCo进行代码覆盖。它由 Emma Eclipse 团队发起,并正在积极开发中。

正如 JaCoCo 的使命宣言中所述。

[...] EMMA 和 Cobertura 是两个最好的和广泛使用的开源工具。这两个工具不再由原作者积极维护,也不支持当前的 Java 版本。由于缺乏回归测试,维护和功能添加很困难。

因此,我们启动了 JaCoCo 项目,为基于 Java VM 的环境中的代码覆盖率分析提供一种新的标准技术。[...]

JaCoCo 的好处在于它可以在多种环境中工作,而且您不必在编译后检测代码。在执行测试时进行检测。它看起来像这样:

<jacoco:coverage destfile="${target.dir}/jacoco.exec">
    <junit>
        [...]
    </junit>
</jacoco>

然后用于<jacoco:coverage>打印覆盖率报告。

你必须使用艾玛吗?如果没有,你可能会更好地使用 JaCoCo 让一切正常工作。

于 2013-04-18T15:04:11.670 回答
1

Emma 依赖于字节码注入(如果记忆对我有用的话);但是,在 Java 7 中,代码还没有更新,因为 JVM 现在有一个调试接口。

JaCoCo 通过附加到调试接口并在您的代码进入方法并在不注入检查点的情况下通过字节码时进行监听来测试代码覆盖率。这显然是更好的做事方式(现在它已经存在),我怀疑 Emma 是否会全力支持 Java 7。

我建议你“升级”到 JaCoCo。

于 2013-04-18T15:05:03.580 回答
0

当您使用错误的命令生成报告时,您会收到此错误。大多数在线教程都在提倡错误的(可能是旧的)命令,即使我在使用以下命令生成报告时也遇到了这个错误:

{JAVA_HOME}\jre\lib\ext>java -cp emma.jar emma report -r html -in coverage.em, {ALFRESCO_HOME}\coverage.ec EMMA: 处理输入文件 ... EMMA: 1 个文件已读取并在 60 毫秒内合并 EMMA:无事可做:在任何数据文件中都找不到运行时覆盖数据

命令的正确用法是: {JAVA_HOME}\jre\lib\ext>java -cp emma.jar emma report -r txt,html -in {JAVA_HOME}\jre\lib\ext\coverage.em -in C:\ t1_tempSetup\Alfresco\coverage.ec EMMA:处理输入文件 ... EMMA:在 70 毫秒内读取和合并 2 个文件 EMMA:将 [txt] 报告写入 [{JAVA_HOME}\jre\lib\ext\coverage.txt ] ... EMMA:将 [html] 报告写入 [{JAVA_HOME}\jre\lib\ext\coverage\index.html] ...

于 2015-10-19T18:28:51.850 回答