EMMA
是一个很好的组件,可以很方便地测试
JAVA
代码执行的覆盖率,执行的方法可以是
JUNIT
的
Test
,也可以是手工的
UNITTEST
。它通过在
JAVA
的
CLASS
文件里加字节码并不改变原代码的执行逻辑来实现统计执行情况。被注入
EMMA
字节码的代码在
JVM
上运行需要保证
EMMA.jar
在
CLASSPATH
范围,另一个条件就是
JVM
运行参数需要
emma.coverge.out.file
和
emma.coverage.out.merge
来指明统计数据导出路径和导出是否合并。
-Demma.coverage.out.file=/mnt/ emma/coverage.emma -Demma.coverage.out.merge=true
JVM 启动命令中加上述参数,其中 emma.coverage.out.file 设置为 coverage result 目标文件。如在 JBOSS 环境中,则在 JBOSS 的 run.sh 中加到 JAVA_OPTS, JAVA 程序加到 JAVA 命令行中。 ANT 的 JUNIT 可以加 jvmarg 如下在 batchtest 前。
<jvmarg value="-Demma.coverage.out.file=/mnt/slim-emma/coverage.emma"/>
<jvmarg value="-Demma.coverage.out.merge=true"/>
JVM 启动命令中加上述参数,其中 emma.coverage.out.file 设置为 coverage result 目标文件。如在 JBOSS 环境中,则在 JBOSS 的 run.sh 中加到 JAVA_OPTS, JAVA 程序加到 JAVA 命令行中。 ANT 的 JUNIT 可以加 jvmarg 如下在 batchtest 前。
<jvmarg value="-Demma.coverage.out.file=/mnt/slim-emma/coverage.emma"/>
<jvmarg value="-Demma.coverage.out.merge=true"/>
下面的
XML
是一个
ANT
的
build.xml
示例,需要
emma.jar
和
emma_ant.jar
包,实验中,发现
EMMA
的
merge
任务中的
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>
本文转自 dannyy1026 51CTO博客,原文链接:
http://blog.51cto.com/dannyyuan/272659