最近在调查几个代码覆盖率的工具,其中就用到了Emma。发现Emma还挺好用的。它有Eclipse的插件,Maven插件,并且有emma_ant.jar提供对ant的支持。
先说最简单的,在Eclipse中利用Emma插件:eclemma。
官网:http://www.eclemma.org
eclipse插件安装地址: http://update.eclemma.org/
在Eclipse中安装完后,就可以在工具栏中看到emma的按钮。
工程下的测试类跑完Junit后,点击该按钮,即可在代码中显示覆盖情况。
当然,需要的话也可以导出覆盖率报告,
从上图中可以看到,Export中已经存在导出覆盖率报告的选项。点击Next后,会列出最近的test session,如下图:
选中需要导出报告的session,设置报告的导出类型(如:HEML report)和目标路径后,点击finish即可导出。
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下。
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就可以生成覆盖率报告了。