2023拉

代码覆盖率-EMMA,质量可视化

上一篇 / 下一篇  2015-09-22 12:51:31 / 个人分类:测试环境部署

 一、 出了什么问题?
 对于测试人员 测试完一个项目后,如何确保所有的功能都被测试到?
 对于开发人员 辛辛苦苦写的代码如何知道有没有运行过?
 代码优化从何处开始?

二、 EMMA是什么?
 EMMA 是一个用于检测和报告 JAVA 代码覆盖率的开源工具。
 它不但能很好的用于小型项目,很方便得得出覆盖率报告,而且适用于大型企业级别的项目。
 EMMA 有许多优点,首先你能免费得到它,并把它用于自己项目的开发。
 它支持许多种级别的覆盖率指标:包,类,方法,语句块(basic block)和行,特别是它能测出某一行是否只是被部分覆盖,如条件语句短路的情况。
 它能生成 text,xml,html 等形式的报告,以满足不同的需求,其 html 报告提供下钻功能,我们能够从 package 开始一步步链接到我们所关注的某个方法。
 EMMA 能和 Makefile 和 Ant 集成,便于应用于大型项目。特别还须指出的一点是,EMMA 的效率很高,这对于大型项目来说很重要。

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

四、 可以怎么用EMMA

 On-the-fly 模式
 Offline 模式
使用emma基本步骤
1、插装字节码到想要测试覆盖率的文件-> 生成coverage.em 文件
插装操作可以面向 JAR 包、 WAR 包、 WAR 包、类文件和目录
2、按正常的工作流程启动服务器,测试程序。
3、收集覆盖率信息->生成coverage.ec文件
可以在本机收集,也可以从远程机器收集
4、生成覆盖率报告->通过coverage.em 和 coverage.ec文件

五、 看一个例子

(一) (准备环境)

 下载EMMA 目前最新开发版本[emma-stable-2.1.5320-lib.zip 2005-06-22 463.2 KB]
http://sourceforge.net/projects/emma/files/emma-testing/2.1.5320/
注意:当前的release版本并不支持  主动收集覆盖率信息  的功能;
 下载的文件 emma-stable-2.1.5320-lib.zip
emma.jar    (EMMA 核心功能模块的实现和 EMMA 运行时所需的类文件)
emma_ant.jar     (emma与ant 结合使用的辅助包)
 把emma.jar 设置到 classpath中,或者扩展到Java 虚拟机中(即将 emma.jar 放到被测组件运行使用的JRE 目录下)


(二) (插装)

 EMMA 中提供了 “instr” 命令完成插装操作
1、插装目录和类文件
对于类文件,通过指定类文件所在的目录实现
java emma instr -m overwrite –ip [文件路径或class文件] -Dmetadata.out.file=[文件路径和文件名] .em
java emma instr -m overwrite –ip  classes -Dmetadata.out.file=c:\coverage.em

2、插装 JAR
JAR 包可以作为一个整体进行插装。通过对整个 JAR 进行插装,可以避免对 JAR 包进行解压和压缩的过程,提高插装效率。
java emma instr -m overwrite –cp   [文件路径和文件名].jar  Dmetadata.out.file=[文件路径和文件名].em
java emma instr -m overwrite -ip  lib\lib1.jar;lib\lib2.jar -Dmetadata.out.file=c:\coverage.em
3、插装 WAR/EAR 包
由于 WAR/EAR 包需要运行在特定的环境中,所以在进行插装之前,需要先将其安装在特定的 J2EE 容器中,然后将其看作目录进行插装。
java emma instr -m overwrite \ -ip [文件路径和文件名].war -Dmetadata.out.file=[文件路径和文件名].em
java emma instr -m overwrite \ -ip  test.war -Dmetadata.out.file=c:\coverage.em

4、选择性的插装
EMMA 支持对整个 JAR 包和目录进行插装,但如果在 JAR 包或者目录中包含系统的文件或者测试过程中不关心的文件时,应该进行选择性插装,因为这些文件的存在会影响测试结果的百分比。 EMMA 提供了选择插装的选项,实现选择性插装。
java emma instr -m overwrite -cp test.jar -ix +com.test.* -Dmetadata.out.file=[文件路径和文件名].em
java emma instr -m overwrite -cp test.jar -ix +com.test.* -Dmetadata.out.file=c:\coverage.em 

 参数 “m”代表插装后文件输出的模式。有三个值可供选择: “copy” ,“overwrite” 和 “fullcopy” 。其中,“copy” 和 “ fullcopy” 这两种模式将会改变插装文件所在的目录,并需要测试人员手动为其生成所需的包,使用起来比较复杂。“overwrite” 模式直接用插装后的文件覆盖插装前文件,使用方便。但是由于同一时间生成的文件只能插装一次,在 “overwrite”模式下,插装前的文件已经丢失,测试人员无法重复插装操作,因此建议在插装之前先将需要插装的文件和包进行备份。
 参数 “ip” 和 “cp” 用来提供插装路径,其中 “cp” 用来指明一个文件夹, “ip” 指定单独的文件或者 JAR 包。
 参数 “Dmetadata.out.file” 用来指定插装得到的元数据文件保存的路径。
 EMMA 中通过 “ix” 参数指定文件的包含和排除关系,其中在 “+” 符号后的文件为包含进的文件, “-” 后面的内容为排除在外的文件。
__________________________________________________
这个不能用
import com.wyim.msg.csim_admin.thrift.CsimAdminService;

__________________________________________________

(三) (合并元数据)
 完成插装操作以后,在指定的路径下会产生一些名为 “*coverage.em” 的文件,这些文件保存了插装的元信息,这些信息主要是记录插装过程中的插装点在被测代码中的位置。如果在插装过程中,指定这些文件到同一文件的话, EMMA 默认将元数据进行合并。如果测试人员未指定路径,或者希望得到独立的元文件,这些文件将分别产生在默认或指定的目录下。测试人员还可以通过使用 “merge” 命令手动将这些元文件进行合并,保证生成的覆盖率报表的全面性。注意:合并操作不支持逆向操作。

 合并元数据命令
Java  emma  merge -input <path1>/coverage1.em,<path2>/coverage.em -out <path>/coverage2.em
Java  emma  merge -input  c:/coverage1.em,c:/coverage2.em -out c:/coverage.em
在 “input” 后面的参数为待合并的文件名,在 “out” 后面的参数为合并以后的结果文件。

(四) (运行测试用例

 完成插装工作以后,测试人员可以按照测试计划运行测试用例。
 EMMA 将在测试执行的过程中记录代码执行信息并将结果记录在内存中。
 每次当 JVM 停止时,内存中记录的执行信息将被清除并被保存到 “*.ec” 的文件中。
 实际测试的过程中, JVM 的停止很难控制,因此测试人员可以定时手动将内存中执行信息写出。在这种情况下,内存中的记录被输出,但是内存中的内容不被清除。

(五) (收集覆盖率信息)
 从远程机器上收集覆盖率信息
java  emma  ctl  –connect ip:47653 -command coverage.dump,[文件路径]/coverage.ec
java  emma  ctl  –connect 192.168.61.123:47653 -command coverage.dump, c:/coverage.ec
 从本地收集覆盖率信息
java emma ctl –connect [本机IP]:47653 -command coverage.get,[文件路径]/coverage.ec
java emma ctl -connect localhost:47653 -command coverage.get,c:\emma\coverage.ec   

注:收集信息时服务一定是开启状态,否则会报错:
emma ctl: coverage.get: RPC failure while executing [coverage.get]
(六) (生成覆盖率报告)
 测试报告可以以 HTML ,文本和 XML 三种格式输出
 java -cp emma.jar emma report -r txt,html,xml -in [文件路径和文件名].em, [文件路径和文件名].ec - Dreport.html.out.file=[报表路径和报表名].html -Dreport.metrics=class:[合格率](,method:[合格率])
java  emma report -r html -in c:/coverage.em,c:/coverage.ec - Dreport.html.out.file=c:/emma/coverage.html -Dreport.metrics=class:80,method:75
如下会在当面目录下生成报表文件
java emma report -r txt,html -in coverage.em -in coverage.ec 
 可以根据测试要求通过 “Dreport.metrics” 参数设定满意的覆盖率标准。在示例命令中设定了类覆盖率的满意度为80%。
 红颜色代表该覆盖率未达到满意的覆盖率标准

六、 ECLIPSE安装EMMA插件

Help→Software updates→Find and Install...→Search for new features to install→next→New Remote Site...

name:eclemma
URL:http://update.eclemma.org/



参考资料

 http://emma.sourceforge.net/
 http://www.ibm.com/developerworks/cn/opensource/os-cn-emma/index.html#download 

TAG: 覆盖率

 

评分:0

我来说两句

Open Toolbar