EMMA是一个很好的组件,可以很方便地测试JAVA代码执行的覆盖率,执行的方法可以是JUNITTest,也可以是手工的UNITTEST。它通过在JAVACLASS文件里加字节码并不改变原代码的执行逻辑来实现统计执行情况。被注入EMMA字节码的代码在JVM上运行需要保证EMMA.jarCLASSPATH范围,另一个条件就是JVM运行参数需要emma.coverge.out.fileemma.coverage.out.merge来指明统计数据导出路径和导出是否合并。
-Demma.coverage.out.file=/mnt/ emma/coverage.emma  -Demma.coverage.out.merge=true
JVM
启动命令中加上述参数,其中emma.coverage.out.file设置为coverage result目标文件。如在JBOSS环境中,则在JBOSSrun.sh中加到JAVA_OPTS, JAVA程序加到JAVA命令行中。ANTJUNIT可以加jvmarg如下在batchtest前。
<jvmarg value="-Demma.coverage.out.file=/mnt/slim-emma/coverage.emma"/>
<jvmarg value="-Demma.coverage.out.merge=true"/>

下面的XML是一个ANTbuild.xml示例,需要emma.jaremma_ant.jar包,实验中,发现EMMAmerge任务中的fileset必须包含两个,一个为统计数据增量文件集,一个为元数据增量文件集,不知是否该限制是否是我哪儿错了。

<?xml version="1.0"?>
<project name="EMMA" default="all" basedir="." >
<property file="build.properties"/>
<property name="emma.enabled" value="true" />
<property name="coverage.dir" value="${emma.dir}/coverage" />
<property name="merge.dir" value="${coverage.dir}/merge" />

<path id="classpath">
<!-- ant lib -->
<fileset dir="${ant.home}/lib">
<include name="*.jar" />
</fileset>
</path>

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

<!-- this loads <emma> and <emmajava> custom tasks: -->
<taskdef resource="emma_ant.properties" classpathref="emma.lib" />

<target name="clean">
<delete file="${coverage.dir}/metadata*.emma" />
</target>

<target name="emma.instr" depends="clean">
<emma enabled="${emma.enabled}">
<instr instrpath="${out.instr.dir}/" mode="overwrite" destdir="${out.instr.dir}/"
metadatafile="${coverage.dir}/metadata.emma" merge="false">
</instr>
</emma>
</target>

<target name="merge">
<delete file="${merge.dir}/coverage.es" />

<emma enabled="true">
<merge outfile="${merge.dir}/coverage.es" basemetadatafile="${coverage.dir}/metadata.emma">
<fileset dir="${merge.dir}" >
<include name="metadata*.emma" />
</fileset>
<fileset dir="${merge.dir}" >
<include name="coverage*.emma" />
</fileset>
</merge>
</emma>
</target>

<target name="report" depends="merge">
<emma enabled="true">
<report sourcepath="${src.dir}" verbosity="verbose" depth="method">
<fileset dir="${merge.dir}" includes="coverage.es" />
<html outfile="${coverage.dir}/coverage.html" depth="method" columns="name,class,method,block,line"/>
</report>
</emma>
</target>
</project>