使用emma,junit和ant没有运行时覆盖

时间:2013-04-18 09:08:16

标签: java ant junit emma

我有以下项目结构:

  • src / com / dummy / abc.java
  • src_tests / come / dummy / abcTest.java
  • 的build.xml

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

  1. 编译'src'
  2. 编译'src_tests'
  3. 仪器编译'src_tests'=> 'instrumented_src_tests'
  4. 使用额外的jvmarg
  5. 在'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" />
    

3 个答案:

答案 0 :(得分:3)

自2005年以来,Emma一直没有稳定版本,并且在较新版本的JDK中表现不佳。自2011以来,Cobertura没有做任何新的发展。 因此,我不再建议开发人员使用Emma或Cobertura。

我已切换到JaCoCo以获取代码覆盖率。它由Emma Eclipse团队发起,并且正在积极开发中。

如JaCoCo的mission statement所述。

  

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

     

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

JaCoCo的优点在于它适用于各种环境,您无需在编译后检测代码。在执行测试时进行检测。它看起来像这样:

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

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

你必须使用艾玛吗?如果没有,你可能更幸运的是使用JaCoCo使一切工作。

答案 1 :(得分:1)

Emma依赖于字节码注入(如果内存对我很好);但是,使用Java 7时,代码尚未更新,因为JVM现在具有调试接口。

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

我建议你“升级”到JaCoCo。

答案 2 :(得分:0)

使用错误的命令生成报告时出现此错误。 大多数在线教程都提倡错误(可能是旧的)命令,即使我使用下面的命令生成报告时出现此错误:

{JAVA_HOME} \ jre \ lib \ ext&gt; 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&gt; 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] ......