最近在调查几个代码覆盖率的工具,其中就用到了Emma。发现Emma还挺好用的。它有Eclipse的插件,Maven插件,并且有emma_ant.jar提供对ant的支持。
1.最简单的Eclipse Emma插件
先说最简单的,在Eclipse中利用Emma插件:eclemma。
官网:http://www.eclemma.org
eclipse插件安装地址: http://update.eclemma.org/
在Eclipse中安装完后,就可以在工具栏中看到emma的按钮。
工程下的测试类跑完Junit后,点击该按钮,即可在代码中显示覆盖情况。
当然,需要的话也可以导出覆盖率报告,
从上图中可以看到,Export中已经存在导出覆盖率报告的选项。点击Next后,会列出最近的test session,如下图:
选中需要导出报告的session,设置报告的导出类型(如:HEML report)和目标路径后,点击finish即可导出。
2.Maven中利用emma也很简单
Maven中有emma的插件,所以使用起来也非常方便。
官网:http://mojo.codehaus.org/emma-maven-plugin/
关于pom文件的配置,可以直接参照官方网站的文章:http://mojo.codehaus.org/emma-maven-plugin/usage.html
其中有一点需要注意,在eclipse中使用m2eclipse的时候,很多情况下不能正确识别maven插件中<execution>的内容,为了解决这个问题,需要在<plugins>标签的外部再套上<pluginmanagement>标签(具体原因不清楚,不过能解决pom文件报错的问题)。
配置完以后,在之前的maven命令中插入emma:emma即可生成emma的测试报告,如:clean emma:emma package。
生成的报告默认是在target/site下。
3.喜欢自己动手就用Ant吧
ant中利用emma稍微有点复杂,不过也更加灵活,便于各种非maven工程的使用。
首先,需要下载emma的jar包,包括emma.jar和emma_ant.jar。在souceforge上就能找到(不过版本比较老):emma.sourceforge.net/
下载的emma包中还包含了文档和sample,学习起来还是比较方便的。
下面列出build.xml的中比较关键的配置:
1.设置emma的property:
<!-- Emma properties -->
<property name="emma.enabled" value="true" />
<property name="emma.filter" value="" />
其中emma.filter的value中,+开头即表示include,-开头即表示exclude,如
<property name="emma.filter" value="-*test*" />
2.导入emma的jar包:
<!-- Emma jar path -->
<path id="emma-classpath">
<pathelement location="${external-lib.dir}/emma.jar" />
<pathelement location="${external-lib.dir}/emma_ant.jar" />
</path>
<taskdef resource="emma_ant.properties" classpathref="emma-classpath" />
3.运行junit:
<!-- Emma Instrumentation -->
<emma enabled="${emma.enabled}">
<instr instrpath="${test.class.dir}" mode="overwrite" metadatafile="${test.report.dir}/metadata.emma" merge="true">
<filter value="${emma.filter}" />
</instr>
</emma>
<junit printsummary="true" fork="yes">
<classpath refid="test-classpath" />
<formatter type="plain" usefile="false" />
<formatter type="xml" />
<batchtest todir="${test.report.dir}">
<fileset dir="${test.class.dir}">
<patternset>
<include name="**/*Test.class" />
</patternset>
</fileset>
</batchtest>
<!-- For Emma -->
<jvmarg value="-XX:-UseSplitVerifier" />
<jvmarg value="-Demma.coverage.out.file=${test.report.dir}/coverage.emma" />
<jvmarg value="-Demma.coverage.out.merge=true" />
</junit>
emma的
Instrumentation有3中mode,这里由于测试的class不会在之后用来打包,所以直接使用了overwrite模式,默认mode为copy。
junit的配置中有几点需要注意,首先fork属性必须为true,否则不能加载jvm的参数。其次,如果jre为1.7的情况下,由于emma对java7的支持不是很好,需要加入以下参数:
<jvmarg value="-XX:-UseSplitVerifier" />
4.生成report:
<!-- Emma Report -->
<emma enabled="${emma.enabled}" >
<report sourcepath="${src.dir}"
sort="+block,+name,+method,+class"
metrics="method:70,block:80,line:80,class:100"
>
<fileset dir="${test.report.dir}" >
<include name="*.emma" />
</fileset>
<txt outfile="${test.report.dir}/coverage.txt"
depth="package"
columns="class,method,block,line,name"
/>
<xml outfile="${test.report.dir}/coverage.xml"
depth="package"
/>
<html outfile="${test.report.dir}/coverage.html"
depth="method"
columns="name,class,method,block,line"
/>
</report>
</emma>
配置完成之后,运行build.xml就可以生成覆盖率报告了。