基于tomcat | emma的代码覆盖率检查工具
EMMA 介绍
EMMA 是一个开源、面向 Java 程序测试覆盖率收集和报告工具。它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率结果进行展示。
EMMA可以统计几种覆盖率:class,method,block, line。支持版本迭代的覆盖率统计
EMMA 使用
EMMA基本是四步曲:
插桩(instr),运行,收集(ctl),报告(report)。
Emma的下载
环境搭建
Step1、部署emma的jra
上传emma-2.1.5320.jar文件到系统java环境下:
a. 在linux下查看java在哪里:$JAVA_HOME$
b.进入java目录下的jre/lib/ext/
c.把emma的jar包放上去 :
rz 选择emma-2.1.5320.jar
Step2、给jar包赋777权限
chmod -R 777 emma-2.1.5320.jar
Step3、进入tomcat 的bin 目录,修改catalina.sh
1). cp catalina.sh catalina_bak.sh
2). vim catalina.sh
3). 修改JAVA_OPTS值( 红色字体的为添加的内容):
-Xbootclasspath/p:/***/***/***/java/jre/lib/ext/emma-2.1.5320.jar -XX:-UseSplitVerifier -Demma.rt.control.port=39123
Step4、杀掉tomcat进程
kill -9 线程号
插桩
java emma instr -m overwrite -ip /要插桩的jar包绝对地址 -Dmetadata.out.file=/存放地址/文件名.em
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.*:-指排除
支持多个+和-,用逗号分隔
启动tomcat并查看日志,
./tomcat/bin/startup.sh;tail -f ../logs/catalina.out
备注:一般情况下,直接运行应用程序即可。EMMA会启动一个监听端口,用来后面收集信息(ctl)。这个端口是固定的,47653。
如果我们的应用是多进程的或者虚拟机发布应用的情况,就会出现启动失败。
其实EMMA也提供了一个命令,进行端口设置:-Demma.rt.control.port=39123
还有host指定,-Demma.rt.control.host=你想指定的Ip地址. default is localhost
这个参数需要加在程序启动命令里
执行测试
执行:功能测试 | 自动化测试 |等其他测试
数据收集
一般有两种收集信息方法:
程序退出,自动收集,在当前运行目录下生成coverage.ec
命令行:
java emma ctl -connect localhost:47653 -command coverage.get,/存放收集数据的绝对路径/文件名.ec
合并.ec文件
自动合并。如果生成的.ec文件名字相同,自动合并。
命令行合并:
java emma merge -input SM1.ec, SM2.ec -outfile SM.ec
清除执行统计信息
重启应用
命令行:reset
java emma ctl -connect localhost:47653 -command coverage.reset
报告
转换成html格式查看
java -cp emma.jar emma report -r html -in -Dreport.html.out.file=D:\apache-tomcat-8.0.14\webapps\tcmt.html
java -cp emma.jar emma report -r html -in /存放地址/文件名.em,/存放收集数据的绝对路径/文件名.ec -Dreport.html.out.file=/存放地址/文件名.html