美文网首页
maven中使用EMMA测试代码覆盖率

maven中使用EMMA测试代码覆盖率

作者: 威武不能屈 | 来源:发表于2017-03-26 17:12 被阅读224次

emma介绍

什么是EMMA

<small>EMMA 是一个开源、面向 Java代码覆盖率收集和报告的工具。它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率结果进行展示。 EMMA 所使用的字节码插装不仅保证 EMMA 不会给源代码带来“脏代码”,还确保 EMMA 摆脱了源代码的束缚,这一特点使 EMMA 应用于功能测试成为了可能。</small>

emma的特点

<small>

  1. 100%纯Java编写,不依赖与任何第三方库。
  2. 和其他代码覆盖率测试工具不同,EMMA支持大型项目的团队开发,每个开发人员都可以从中受益。
  3. EMMA通过对Class文件进行增强以测试覆盖率,它提供了Offline和Fly两种模式,在Fly模式下,EMMA不改动编译后的Class文件,仅仅在Class文件被ClassLoader装载时才进行增强。
  4. EMMA支持对类,方法,代码行和基本的分支语句的覆盖率测试,并提供了多种格式的报告,包括纯文本,HTML和XML,所有的报告都可以进行详细设置以获得定制报告。
  5. 使用EMMA时,不需要获得源代码就可进行覆盖率测试,此外,EMMA还支持对整个jar文件测试。
  6. EMMA默认提供了对Ant的集成,通过扩展EMMA还可以提供对Maven和Eclipse的支持。
  7. 在不同的工具或测试运行中获取到的覆盖数据可以合并在一起
    </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的插件

图1

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


图2

</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>报告中包括类覆盖率、方法覆盖率、块覆盖率以及行覆盖率

图3 图4

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

图5

在maven中EMMA的工作步骤

  • 字节码插装并生成插装的元信息文件coverage.em
图6
  • 运行测试
  • 每次当 JVM 停止时,内存中记录的执行信息将被清除并被保存到 “coverage.ec” 的文件中
    即converage-*.ec文件中保存的是覆盖率信息
图7
  • 生成测试报告
    根据.em文件和.ec文件转换成html
图8

</small>

相关文章

网友评论

      本文标题:maven中使用EMMA测试代码覆盖率

      本文链接:https://www.haomeiwen.com/subject/mvekottx.html