EMMA 覆盖率工具

1. EMMA 介绍

EMMA 是一个开源、面向 Java 程序测试覆盖率收集和报告工具。它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率结果进行展示。EMMA可以统计几种覆盖率:class,method,block, line。支持版本迭代的覆盖率统计

2. EMMA 使用

EMMA基本是四步曲:插桩(instr),运行,收集(ctl),报告(report)。下面分别详细的介绍下

2.1 安装

下载地址:http://sourceforge.net/projects/emma/files/emma-testing/

目前流行使用的是v2.1.*,因为支持ctl命令

将emm.jar cp /usr/local/jdk/jre/lib/ext 下面,安装完成

2.2 插桩

command:java emma instr -cp /usr/local//anrs/lib/anrs.jar -m overwrite -ix +com.* -Dmetadata.out.file=test.em

参数介绍:

-cp,指定插桩的路径,多个jar包可以用,分割

-m:输出模式

overwrite:重新jar包,anrs.jar

default:copy, 需要加上-d参数,指定输出路径。有插桩,才cp一份class到指定路径

fullcopy:需要加上-d参数,指定输出路径。 不管有没有插桩,都cp一份class到指定路径

-merge:合并。

default:yes。 如果metadata指定输出的文件一样,将两次插桩信息进行合并

no。不合并两次插桩信息

-ix:指定需要插桩的class

+com.*: + 指包含

-com.*:-指排除

支持多个+和-,用逗号分隔

这个功能对我们关注被改动的代码很有作用

-Dmetadata.out.file: 指定元数据(metadata)输出路径。默认是当前路径

我们在测试过程中, 一般都会去更新几次jar包,并且我们希望统计出这个版本测试的覆盖率,我们就需要把几次的元数据进行合并

2.3 运行

一般情况下,直接运行应用程序即可。EMMA会启动一个监听端口,用来后面收集信息(ctl)。这个端口是固定的,47653。

如果我们的应用是多进程的,就会出现启动失败。

其实EMMA也提供了一个命令,进行端口设置:-Demma.rt.control.port=39123

还有host指定,-Demma.rt.control.host=192.168.22.22. default is localhost

这个参数需要加在程序启动命令里

EMMA还有简单的配置文件:java -Demma.properties=my.properties

my.properties format: tag=value

可以配置的参数参考:http://emma.sourceforge.net/reference/ch03s02.html#prop-ref.tables

2.4 收集

一般有两种收集信息方法:

1. 程序退出,自动收集,在当前运行目录下生成coverage.ec

2. 命令行:

java -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

合并.ec文件

由于 EMMA 中测试覆盖率是通过与 “*.em” 文件关联获得代码信息的,因此当代码发生变化时,已经运行过的测试不必完全重复,只需将得到的 “*.ec” 文件合并(新得到的 “*.ec” 文件放在后面),然后关联最新的 “*.em” 文件即可得到代码变化后的覆盖率信息,这方便了 EMMA 支持版本变化的测试。在生成新的测试报告的时候,需要注意 “*.ec” 的时间一定要晚于 “*.em” 文件。

1. 自动合并。如果生成的.ec文件名字相同,自动合并。

2. 命令行合并:java  -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma merge -input SM1.ec, SM2.ec -outfile SM.ec

.ec 文件需要按照时间从前到后排列,才能保证合并信息正确(参考网上说法。但我测试的结果发现,自动合并与merge合并的结果不一致,自动合并的结果更准确。所以最好使用自动合并)

默认合并为coverage.es。

貌似现在的版本outfile参数不起作用,都会合并为coverage.es

清除执行统计信息

如果我们想要每个测试用例的独立覆盖率报告,需要将内存中的执行信息清除掉。

目前有两种清除方法:

1. 重启应用

2. 命令行:reset

java  -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.reset

reset只能清除内存中记录的方法、块、行的执行信息,但是无法清除类覆盖信息。

2.5 report

command:

java -cp /usr/jdk/jdk1.6.0_29/jre/lib/ext/emma.jar emma report -r html -in anrs.em coverage.ec –sp src/-Dreport.html.out.file=coverage.html

参数介绍

-r: report type:html,txt,xml

-sp: sourcecode path

3. 会碰到的问题(来源于网上介绍,refer to

<http://www.51testing.com/?uid-170805-action-viewspace-itemid-87390>

3.1 issue1

"emma ctl:

coverage.get: RPC failure while executing [coverage.get]

Exception in thread "main" com.vladium.emma.EMMARuntimeException: coverage.get:

RPC failure while executing [coverage.get]

at com.vladium.emma.ctl.CtlProcessor._run(CtlProcessor.java:242)"

需要在应用执行目录下进行插桩,就可以解决这个issue

3.2 issue2

Exception in thread "main" java.lang.NoClassDefFoundError: com/vladium/emma/rt/R

T

at org.apache.jmeter.NewDriver.$VRi(NewDriver.java)

at org.apache.jmeter.NewDriver.<clinit>(NewDriver.java)

errorlevel=1

由于java加载ApacheJMeter.jar包时ClassLoader顺序非预期,通过-

Xbootclasspath/p:E:\alibaba\tools\emma-stable-2.1-lib\emma.jar  强制优先加载emma.jar。

故修改应用启动脚本为(以jemeter为例)

%JM_START% %JM_LAUNCH%  -Xbootclasspath/p:E:\alibaba\tools\emma-stable-2.1-lib\emma.jar  %

JVM_ARGS% %ARGS%   -jar "%JMETER_BIN%ApacheJMeter.jar" %JMETER_CMD_LINE_ARGS%

4. 项目应用

4.1 项目特点

应用程序会启动多个进程,启动脚本也会执行jar包。---需要解决emma端口冲突

测试过程中,由于bug会修改代码,版本迭代。希望统计这些版本的整个覆盖率信息---emma支持多个版本的覆盖率统计

希望每个case都有自己独立的覆盖率统计信息,同时也要有整个的覆盖统计信息。

4.2 应用

每个case执行的步骤:

1. 判断是否更新了jar包

1.1 更新:插桩,指定同个文件名合并到一起

1.1.1 stop app

1.1.2 设置 EMMAPORT 环境变量

1.1.3 启动一个应用进程,指定EMMAPORT:-Demma.rt.control.port=$EMMAPORT

1.1.4 循环1.1.2 & 1.1.3,启动完所有的进程

1.2 未更新:

1.2.1 清除执行信息:

java  -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.reset

2. 执行case

3. 收集执行信息

3.1 把所有进程的执行信息收集到一个文件里

java -cp /usr/jdk/jdk1.6.0_23/jre/lib/ext/emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

3.2 每个case需要有独立的执行信息

cp coverage.ec coverage_caseNo.ec

4. 生成报告

测试完这个版本后,生成报告

时间: 2024-11-06 07:27:24

EMMA 覆盖率工具的相关文章

测试覆盖率工具:EclEmma

测试覆盖率工具:EclEmma 2016-08-26 目录 1 测试覆盖率实现技术2 EclEmma介绍3 EclEmma测试覆盖率指标4 EclEmma安装5 示例项目介绍  5.1 创建项目  5.2 用Coverage as TestNG Suite跑用例  5.3 跑后结果  5.4 导出HTML报告   5.5 导入导出合并覆盖率Session  5.6 测试引用的jar包的覆盖率 1 测试覆盖率实现技术 返回 Instrumentation:代码注入,在产品代码的关键位置插入统计代码

Jacoco覆盖率工具使用

Jacoco介绍 Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第三方的工具提供了对Jacoco的集成,如sonar.Jenkins等. 官网地址:http://www.eclemma.org/jacoco/ Java Counters Jacoco包含了多种尺度的覆盖率计数器,包含指令级(Instructions,C0coverage),分支(Branches,

Java测试覆盖率工具----Cobertura,EclEmma

Cobertura 是一个与Junit集成的代码覆盖率测量工具 它是免费.开源的 它可以与Ant和Maven集成,也可以通过命令行调用 可以生成HTML或XML格式的报告 可以按照不同的标准对HTML结果进行排序 为每个类.包以及整个项目计算所覆盖的代码行与代码分支的百分比例 Eclipse插件地址: http://ecobertura.johoop.de/update/ (requires Eclipse 3.5+) 使用Ant来执行Cobertura 操作步骤: 1.添加核心依赖jar包--

测试覆盖率工具EclEmma安装与使用

此文来自于:https://www.cnblogs.com/cnsdhzzl/p/7638883.html EclEmma的简介 一个优秀的开源软件测试工具 eclipse的一个插件 能够对由 Java 语言编写的程序进行覆盖测试 能够在工作平台中启动 直接对代码覆盖进行分析 覆盖结果将立即被汇总并在Java源代码编辑器中高亮显示 也可程序运行的结果生成详尽的覆盖测试报告 可以结合JUnit使用 工作原理:Class Instrumentation(把统计代码插入编译好的.class文件) 测试

emma覆盖率

-Xbootclasspath/p:/home/admin/software/jdk1.7.0_79/jre/lib/ext/emma.jar 复制 /server/bin/mobileserver/runServer.sh 到 runServer_emma.sh   修改启动语句   nohup java -Xmx1800M -Xms800m -Xbootclasspath/p:/home/q/java/emmalib/emma.jar -Djava.nio.channels.spi.Sele

单元增量覆盖率工具设计

命令:进入拉取的代码的目标地址:cd /root/workspace/pipeline_demo/[email protected]/test-v2-changedir-pipeline 位置的变量名称:$PRO_HOME 命令:git diff 1d5ae618de8ca82f0bbd5b14c639366964b9b808  30db05a3c2e5d09f672dbaba83bdb36a755b639d bash-4.4# cd ..diff --git a/src/main/java/c

精准测试与开源工具Jacoco的覆盖率能力大P

导读:本文根据实际使用情况,简要分析了精准测试和类Jacoco等传统白盒工具在设计理念.功能和应用场景的异同点,并阐述了覆盖率技术如何在新型企业开发体系中,发挥应有的重要作用. 覆盖率技术可以说是测试理论中最基本的技术体系,但由于传统覆盖率并没有很好的适应新型软件开发模型,导致应用场景越来越窄.比如:Jacoco等同类工具,仍停留在传统白盒覆盖技术的技术演化层面,目前基本仅适用在瀑布模式的开发体系下.最新的测试黑马技术-"精准测试"覆盖率功能是企业级.面向敏捷迭代场景.全新的覆盖率技术

多环境多需求并行下的代码测试覆盖率统计工具实现

马蜂窝技术原创内容,更多干货请关注公众号:mfwtech 测试覆盖率常被用来衡量测试的充分性和完整性,也是测试有效性的一个度量.「敏捷开发」的大潮之下,如何在快速迭代的同时保证对被测代码的覆盖度和产品质量,是一个非常有挑战性的话题. 在马蜂窝大交通.酒店等交易相关业务中,项目的开发和测试实践同样遵循敏捷的原则,迭代周期短.速度快.因此,如何依据测试覆盖率数据帮助我们有效判断项目质量.了解测试状态.提升迭代效率,是我们一直很重视的工作. Part.1 测试覆盖率统计中的挑战 对于功能测试而言,通常

JAVA代码覆盖率工具JaCoCo-原理篇

1.2 JAVA覆盖率工具介绍 1.3.3 Apache Maven方式 1.3.4 Eclipse EclDmma Plugin方式 JAVA代码覆盖率工具JaCoCo-实践篇 一.覆盖率项目中使用介绍 1.5执行测试,收集覆盖率结果文件 1.5.1AndroidManifest文件的修改 1.5.2生成覆盖率的apk工具和jacoco-cov-sdk.jar包 二.覆盖率与BVT测试结合 2.1在BVT用例框架中插入覆盖率方法 2.2执行BVT用例,得到覆盖率 2.3批量生成覆盖率报告,解析