emma linux代码覆盖率,EMMA对功能测试进行代码覆盖率的统计

EMMA,一个用于检测和报告 JAVA 代码覆盖率的开源工具,我们很多情况下在单元测试中用它来代码的用例覆盖率,今天我们讲一下如何在功能测试的时候用emma统计我们的测试用例覆盖了多少java代码。

Emma工作原理分析:EMMA对编译过的class文件作一个叫做插装(instrument)的处理,并生成一个插装信息文件coverage.em,这个文件记录了代码的版本信息,包、类、方法、块、行信息等;被插装过的class文件,在运行时,会触发EMMA中的方法运行,将代码运行的信息记录在JVM中,当JVM关闭时,EMMA将JVM中的代码运行信息输出到外部文件(如coverage.ec),然后用EMMA的生成覆盖率报告功能生成报告。

前提条件: 将emma.java加入到CLASSPATH环境变量中,即:set CLASSPATH=%CLASSPATH%;/*/*emma.jar

set CLASSPATH=%CLASSPATH%;D:\code.sources\emma-2.0.5312\lib\emma.jar

第一步:插装

EMMA 中提供了 “instr” 命令完成插装操作。对文件插装:java emma instr -m overwrite -ip fileDericty -Dmetadata.out.file=/home/xxx/emma/coverage.em

对Jar包插装:和对文件插装大致一样 java emma instr -m overwrite -cp xxxx.jar -Dmetadata.out.file=/home/xxx/emma/coverage.em

D:\code\demo01\target>java emma instr -m overwrite -cp demo01.jar -Dmetadata.out.file=coverage.em

EMMA: processing instrumentation path ...

EMMA: instrumentation path processed in172 ms

EMMA: [2 class(es) instrumented, 4 resource(s) copied]

EMMA: metadata merged into[D:\code\demo01\target\coverage.em] {in203 ms}

对War包进行插装:试了几次都是EMMA: [0 class(es) instrumented, 0 resource(s) copied]不知道为何,暂时无解

选择性的插装:java emma instr -m overwrite -cp xxx.jar -ix +org.wstest.service.* -Dmetadata.out.file=/xxxx/emma/coverage.em。其中在 “+” 符号后的文件为包含进的文件, “-” 后面的内容为排除在外的文件

合并源数据的命令:java emma merge -input /coverage1.em,/coverage.em -out /coverage2.em

第二步:收集覆盖率信息(产生ec文件)

java emma ctl -connect localhost:port -command coverage.get,/xxxx/emma/coverage.ec

执行java -jar demo01.jar 时,产生异常。分析确认由于java加载demo01.jar包时ClassLoader顺序非预期,通过-Xbootclasspath/p:-Xbootclasspath/p:D:\code.sources\emma-2.0.5312\lib\emma.jar  强制优先加载emma.jar。

D:\code.temp\demo01\target>java -jar demo01.jar

Exception inthread"main"java.lang.NoClassDefFoundError: com/vladium/emma/rt/RT

atcom.alibaba.demo.Demo01.$VRi(Demo01.java)

atcom.alibaba.demo.Demo01.(Demo01.java)

Caused by: java.lang.ClassNotFoundException: com.vladium.emma.rt.RT

atjava.net.URLClassLoader$1.run(URLClassLoader.java:202)

atjava.security.AccessController.doPrivileged(Native Method)

atjava.net.URLClassLoader.findClass(URLClassLoader.java:190)

atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)

atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

atjava.lang.ClassLoader.loadClass(ClassLoader.java:248)

... 2 more

Could notfind the main class: com.alibaba.demo.Demo01. Program will exit.

解决方案如下:

D:\code.temp\demo01\target>java -Xbootclasspath/p:D:\code.sources\emma-2.0.5312\lib\emma.jar -jar demo01.jar

EMMA: collecting runtime coverage data ...

zhangsan

lisi

wangwu

zhaoliu

shenqi

EMMA: runtime coverage data merged into[D:\code.temp\demo01\target\coverage.ec] {in62 ms}

针对assembly生成的jar, 样例如下:

D:\code.temp\demo02.client\target>java -Xbootclasspath/p:D:\code.sources\emma-2.0.5312\lib\emma.jar -jar demo02.client-jar-with-dependencies.jar

EMMA: collecting runtime coverage data ...

welcome you, Hessian, fromremote!

EMMA: runtime coverage data merged into[D:\code.temp\demo02.client\target\coverage.ec] {in46 ms}

java -Xbootclasspath/p:-Xbootclasspath/p:emma.jar emma instr -m overwrite -cp demo01.jar -Dmetadata.out.file=coverage.em

java  -Xbootclasspath/p:-Xbootclasspath/p:emma.jar emma ctl -connect localhost:47653 -command coverage.get,coverage.ec

Authority:

/home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.authority.deploy/target/web-deploy/lib

pc2.authority.deploy-1.1.2.jar

pc2.common-1.1.2.jar

pc2.server.biz-1.1.2.jar

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47654.jar emma instr -m overwrite -cp pc2.server.biz-1.1.2.jar -Dmetadata.out.file=coverage_biz.em

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47654.jar emma instr -m overwrite -cp pc2.common-1.1.2.jar -Dmetadata.out.file=coverage_common.em

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47654.jar emma instr -m overwrite -cp pc2.authority.deploy-1.1.2.jar -Dmetadata.out.file=coverage_authority.em

Delivery:

/home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.delivery.deploy/target/web-deploy/lib

pc2.common-1.1.2.jar

pc2.delivery.deploy-1.1.2.jar

pc2.server.biz-1.1.2.jar

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47655.jar emma instr -m overwrite -cp pc2.server.biz-1.1.2.jar -Dmetadata.out.file=coverage_biz.em

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47655.jar emma instr -m overwrite -cp pc2.common-1.1.2.jar -Dmetadata.out.file=coverage_common.em

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47655.jar emma instr -m overwrite -cp pc2.delivery.deploy-1.1.2.jar -Dmetadata.out.file=coverage_delivery.em

Subscription:

/home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.subscription.deploy/target/web-deploy/lib

pc2.common-1.1.2.jar

pc2.server.biz-1.1.2.jar

pc2.subscription.deploy-1.1.2.jar

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47656.jar emma instr -m overwrite -cp pc2.server.biz-1.1.2.jar -Dmetadata.out.file=coverage_biz.em

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47656.jar emma instr -m overwrite -cp pc2.common-1.1.2.jar -Dmetadata.out.file=coverage_common.em

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47656.jar emma instr -m overwrite -cp pc2.subscription.deploy-1.1.2.jar -Dmetadata.out.file=coverage_subscription.em

多个文件打包:

java -Xbootclasspath/p:-Xbootclasspath/p:emma-47655.jar emma instr -m overwrite -ip pc2.server.biz-1.1.2.jar -ip pc2.common-1.1.2.jar -ip pc2.delivery.deploy-1.1.2.jar -Dmetadata.out.file=coverage_all.em

【注意】针对war包的情况, 先用jar xvf *.war进行解包,再进行emma针对里面lib下面的jar文件进行插装, 将生产的emma文件放到外面,再打回成war包即可

第三步:生成覆盖率报告

java emma report -r html -sp /xxxx/xxxx/javaSources -in /xxx/xxx/coverage.em,/xxx/xxx/coverage.ec -Dreport.html.out.file=/xxxx/xxxx/coverage.html

使用命令生成报告:

java emma report -r html -incoverage.em,coverage.ec -Dreport.html.out.file=coverage.html

D:\code.temp\demo01\target>java emma report -r html -incoverage.em,coverage.ec -Dreport.html.out.file=coverage.html

EMMA: processing input files ...

EMMA: 2 file(s) readandmergedin16 ms

EMMA: writing [html] report to[D:\code.temp\demo01\target\coverage\coverage.html] ...

如果没有-sp参数和相应的java源代码路径,产生的报告将没有源代码显示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值