emma介绍
什么是EMMA
<small>EMMA 是一个开源、面向 Java代码覆盖率收集和报告的工具。它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率结果进行展示。 EMMA 所使用的字节码插装不仅保证 EMMA 不会给源代码带来“脏代码”,还确保 EMMA 摆脱了源代码的束缚,这一特点使 EMMA 应用于功能测试成为了可能。</small>
emma的特点
<small>
- 100%纯Java编写,不依赖与任何第三方库。
- 和其他代码覆盖率测试工具不同,EMMA支持大型项目的团队开发,每个开发人员都可以从中受益。
- EMMA通过对Class文件进行增强以测试覆盖率,它提供了Offline和Fly两种模式,在Fly模式下,EMMA不改动编译后的Class文件,仅仅在Class文件被ClassLoader装载时才进行增强。
- EMMA支持对类,方法,代码行和基本的分支语句的覆盖率测试,并提供了多种格式的报告,包括纯文本,HTML和XML,所有的报告都可以进行详细设置以获得定制报告。
- 使用EMMA时,不需要获得源代码就可进行覆盖率测试,此外,EMMA还支持对整个jar文件测试。
- EMMA默认提供了对Ant的集成,通过扩展EMMA还可以提供对Maven和Eclipse的支持。
- 在不同的工具或测试运行中获取到的覆盖数据可以合并在一起
</small>
EMMA工作原理
<small>
EMMA 是通过向 .class 文件中插入字节码的方式来跟踪记录被运行代码信息的。
EMMA 支持两种模式:On the fly 和 Offline 模式。
On the fly 模式往加载的类中加入字节码,在程序运行中,用 EMMA 实现的classLoader 替代应用默认的 Custom classLoader,动态加载类文件,并向类中加入一些统计测试的字节码,这样运行结束后,测试数据也就通过这些临时加入的字节码分析出来。
Offline 模式在类被加载前,在编译生成的class文件中加入字节码。
On the fly 模式比较方便,缺点也比较明显,如它不能为被 boot class loader 加载的类生成覆盖率报告,也不能为像 J2EE 容器那种自己有独特 class loader 的类生成覆盖率报告。
而maven只支持Offline模式</small>
注意
<small>
虽然很容易达到100%的测试覆盖率,但是并不能保证全部覆盖,因为EMMA不支持决策覆盖和路径覆盖</small>
在maven中使用
<small>
maven中集成了emma插件,只需要配置maven-surefire-plugin插件即可。
- 在pom.xml文件中添加依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<skipTests>false</skipTests>
<junitArtifactName>junit:junit</junitArtifactName>
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/*_Roo_*</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
指定maven-surefire-plugin的版本为2.8.1,false不跳过测试,/Test.java****只测试以Test.java为文件名结尾的文件,而且不测试*/Roo文件名包含Roo的文件。更多的配置可以去查看maven-surefire-plugin的配置说明
配置成功后,reimport
- 在终端执行:
mvn emma:emma
首次执行默认会去download maven的插件

执行完成后,如果显示BUILD SUCCESS 说明成功
同时在项目target目录下可以看到有报告生成,/target/site/,打开index.html即可以查看

</small>
实例
<small>
public class emmaExm {
private Logger logger = LoggerFactory.getLogger(emmaExm.class);
public void publicTest(){
logger.info("public method test...");
for (int i = 0; i < 10; i++) {
privateTest();
if(i==4){
continue;
}
if(i==3){
break;
}
if(i==5){
protectedTest();
return;
}
}
}
protected void protectedTest(){
logger.info("protected method test....");
}
private void privateTest(){
logger.info("private method test....");
}
public void printTest(){
logger.info("print method test...");
}
}
测试代码写好后,直接在终端再次执行mvn emma:emma
,执行完成后,会生成新的测试报告。</small>
生成的报告
<small>报告中包括类覆盖率、方法覆盖率、块覆盖率以及行覆盖率


进入具体的类中可以看到未被执行到的地方会被标记出来,绿色是覆盖的,红色是未覆盖的

在maven中EMMA的工作步骤
- 字节码插装并生成插装的元信息文件coverage.em

- 运行测试
- 每次当 JVM 停止时,内存中记录的执行信息将被清除并被保存到 “coverage.ec” 的文件中
即converage-*.ec文件中保存的是覆盖率信息

- 生成测试报告
根据.em文件和.ec文件转换成html

</small>
网友评论