如何使用Ant生成Emma代码覆盖率报告?
时间:2020-03-05 18:50:22 来源:igfitidea点击:
如何设置Ant任务以生成Emma代码覆盖率报告?
解决方案
回答
要回答有关源目录和检测目录在哪里的问题(可以将它们切换到标准目录结构是什么):
<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>
回答
Emma 2.1引入了另一种获取运行时覆盖率信息(.ec文件)的方法。可以从运行检测应用程序的计算机的给定端口远程请求数据。因此,无需停止VM。
要获取包含运行时覆盖率数据的文件,我们需要在运行测试与生成覆盖率报告之间的Ant脚本中插入以下代码段:
<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。他们在上一篇文章中得到了完美的描述
有关Emma 2.1功能的更多信息:http://sourceforge.net/project/shownotes.php?group_id=108932&release_id=336859
回答
用户指南提供了一个很好的示例,说明如何设置构建脚本,这样我们不仅可以将执行的代码与执行分开,而且还包含在相同的<target>中,因此不必运行一系列不同的目标,但是相反,我们可以执行诸如" ant emma测试"之类的操作(例如,如果我们通常运行单元测试的方式是" 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>