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. 生成报告
测试完这个版本后,生成报告
EMMA 覆盖率工具的更多相关文章
- 测试覆盖率工具:EclEmma
测试覆盖率工具:EclEmma 2016-08-26 目录 1 测试覆盖率实现技术2 EclEmma介绍3 EclEmma测试覆盖率指标4 EclEmma安装5 示例项目介绍 5.1 创建项目 5 ...
- iOS 覆盖率检测原理与增量代码测试覆盖率工具实现
背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久.如果在开发.测试阶段能够提前暴露问题,就有助于避免线上事故的发生.代码覆盖率检测正是帮助开发.测试同学提前发现 ...
- Jacoco覆盖率工具使用调研
JaCoCo Java Code Coverage Library Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以 ...
- Jacoco覆盖率工具使用
Jacoco介绍 Jacoco是一个开源的覆盖率工具.Jacoco可以嵌入到Ant .Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序.很多第 ...
- Jacoco覆盖率工具使用之maven篇
说明 之前的文章已经介绍过如何使用apacheant 执行jacoco工具,下面开始介绍如何使用maven使用jacoco工具. 1.首先新建一个maven项目 如图所示: ...
- Java測试覆盖率工具----Cobertura,EclEmma
Cobertura 是一个与Junit集成的代码覆盖率測量工具 它是免费.开源的 它能够与Ant和Maven集成.也能够通过命令行调用 能够生成HTML或XML格式的报告 能够依照不同的标准对HTML ...
- 测试覆盖率工具EclEmma安装与使用
此文来自于:https://www.cnblogs.com/cnsdhzzl/p/7638883.html EclEmma的简介 一个优秀的开源软件测试工具 eclipse的一个插件 能够对由 Jav ...
- JUNIT单元测试时统计代码的覆盖率工具eclemma安装
EclEmma是Eclipse里的一个插件,安装简单,覆盖率显示直观.安装EclEmma.打开Eclipse,点击Help → Software Updates → Find and Install, ...
- jacoco+maven 初次使用覆盖率工具
工作要搞覆盖率测试,看到公司平台上用的jacoco,就找了网上的demo自己跑了一下. 一.覆盖率测试是干什么的 http://www.open-open.com/lib/view/open14721 ...
随机推荐
- 《PyQt5 快速开发与实战》 第九章代码Bug修正 DataGrid.py 最后一页下翻页 仍可点击的错误
# -*- coding: utf-8 -*- import sys import re from PyQt5.QtWidgets import (QWidget , QHBoxLayout , QV ...
- JavaScript动态加载js文件
/********************************************************************* * JavaScript动态加载js文件 * 说明: * ...
- css3实现对radio和checkbox的美化
一,如何隐藏小程序中的很粗的滚动条,实现页面的美化? tit: 在开发小程序的过程中,无论是横向或者纵向当产生滚动条时,系统默认的滚动条会很粗,效果展示十分难看,我们可以通过设置如下wxss代码实 ...
- [转]blocks编程
原文地址:http://geeklu.com/2012/01/block/ 介绍 声明创建和调用 Block和变量 Block实际应用 1.介绍 Block是一个C Level的语法以及运行时的一个特 ...
- 使用SDWebImage加载大量图片后造成内存泄露的解决办法
SDWebImage的知名度就不用说了,github上近10k的star,国内外太多的App使用其进行图片加载. 但是最近在使用过程中发现,在UITableView中不断加载更多的内容,使用SDWeb ...
- js判断当前浏览类型
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isOpera = userAgent.indexOf("Opera ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
- 阿里云ECS 环境是CentOS 7.3安装mongodb3
CentOS安装mongodb https://www.cnblogs.com/zddzz/p/10069912.html CentOS安装mongodb 我的是阿里云ECS 环境是CentOS 7. ...
- 【angularJS】Service服务
AngularJS 中的服务是一个函数或对象.可以创建自己的服务,或使用内建服务. 内置服务 AngularJS 内建了30 多个服务. 1. $location 服务,它可以返回当前页面的 URL ...
- matlab rand, randn, randi
rand 生成均匀分布的伪随机数.分布在(0~1)之间 randn 生成标准正态分布的伪随机数(均值为0,方差为1) randi 生成均匀分布的伪随机整数