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 jar包的下载位置:http://sourceforge.net/projects/emma/files/

 

第一步:插装

    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

 
 
  1. D:\code\demo01\target>java emma instr -m overwrite -cp demo01.jar -Dmetadata.out.file=coverage.em 
  2. EMMA: processing instrumentation path ... 
  3. EMMA: instrumentation path processed in 172 ms 
  4. EMMA: [2 class(es) instrumented, 4 resource(s) copied] 
  5. EMMA: metadata merged into [D:\code\demo01\target\coverage.em] {in 203 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 <path1>/coverage1.em,<path2>/coverage.em -out <path>/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。

 

 
 
  1. D:\code.temp\demo01\target>java -jar demo01.jar 
  2. Exception in thread "main" java.lang.NoClassDefFoundError: com/vladium/emma/rt/RT 
  3.         at com.alibaba.demo.Demo01.$VRi(Demo01.java) 
  4.         at com.alibaba.demo.Demo01.<clinit>(Demo01.java) 
  5. Caused by: java.lang.ClassNotFoundException: com.vladium.emma.rt.RT 
  6.         at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
  7.         at java.security.AccessController.doPrivileged(Native Method) 
  8.         at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
  9.         at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
  10.         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
  11.         at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
  12.         ... 2 more 
  13. Could not find the main class: com.alibaba.demo.Demo01. Program will exit. 

解决方案如下:

 
 
  1. D:\code.temp\demo01\target>java -Xbootclasspath/p:D:\code.sources\emma-2.0.5312\lib\emma.jar -jar demo01.jar 
  2. EMMA: collecting runtime coverage data ... 
  3. zhangsan 
  4. lisi 
  5. wangwu 
  6. zhaoliu 
  7. shenqi 
  8. EMMA: runtime coverage data merged into [D:\code.temp\demo01\target\coverage.ec] {in 62 ms} 

同时可以参考大师的文档:http://www.51testing.com/?uid-170805-action-viewspace-itemid-87390

 

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

 
 
  1. 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 
  2. EMMA: collecting runtime coverage data ... 
  3. welcome you, Hessian, from remote! 
  4. EMMA: runtime coverage data merged into [D:\code.temp\demo02.client\target\coverage.ec] {in 46 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

 

 
 
  1. Authority: 
  2. /home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.authority.deploy/target/web-deploy/lib 
  3. pc2.authority.deploy-1.1.2.jar 
  4. pc2.common-1.1.2.jar 
  5. pc2.server.biz-1.1.2.jar 
  6. 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 
  7. 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 
  8. 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 
  9.  
  10.  
  11. Delivery: 
  12. /home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.delivery.deploy/target/web-deploy/lib 
  13. pc2.common-1.1.2.jar 
  14. pc2.delivery.deploy-1.1.2.jar 
  15. pc2.server.biz-1.1.2.jar 
  16. 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 
  17. 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 
  18. 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 
  19.  
  20. Subscription: 
  21. /home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.subscription.deploy/target/web-deploy/lib 
  22. pc2.common-1.1.2.jar 
  23. pc2.server.biz-1.1.2.jar 
  24. pc2.subscription.deploy-1.1.2.jar 
  25. 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 
  26. 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 
  27. 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 -in  coverage.em,coverage.ec -Dreport.html.out.file=coverage.html 

 
 
  1. D:\code.temp\demo01\target>java emma report -r html -in  coverage.em,coverage.ec -Dreport.html.out.file=coverage.html 
  2. EMMA: processing input files ... 
  3. EMMA: 2 file(s) read and merged in 16 ms 
  4. EMMA: writing [html] report to [D:\code.temp\demo01\target\coverage\coverage.html] ... 

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

 同时可参考:http://www.365testing.com/bbs/thread-8428-1-1.html

 权威:

1、打桩多个jar包

 
  1. 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.authority.deploy-1.1.2.jar -Dmetadata.out.file=coverage_all.em 

2、运行测试

3、合并多个项目统计报告:

 
  1. [pc2@qa-qd-62-152 result]$ java emma report -r html -in coverage.em,coverage_all_Subscription.em,coverage_all.em,coverage.ec,coverage_all_Subscription.ec,coverage_all.ec -Dreport.html.out.file=coverage.html 
  2. Taobao TCC: processing input files ... 
  3. Taobao TCC: 6 file(s) read and merged in 149 ms 
  4. Taobao TCC: /home/pc2/result/_files/changedfiles.html 
  5. Taobao TCC: writing [html] report to [/home/pc2/result/coverage/coverage.html] ... 

 2010-12-17凌晨1.39分记录:

 
  1. Authority: 
  2. /home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.authority.deploy/target/web-deploy/lib 
  3. cp /home/pc2/emma/emma-47655.jar ./ 
  4.  
  5. pc2.authority.deploy-1.1.2.jar 
  6. pc2.common-1.1.2.jar 
  7. pc2.server.biz-1.1.2.jar 
  8. 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 
  9. 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 
  10. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47655.jar emma instr -m overwrite -cp pc2.authority.deploy-1.1.2.jar -Dmetadata.out.file=coverage_authority.em 
  11.  
  12. 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.authority.deploy-1.1.2.jar -Dmetadata.out.file=coverage_all.em 
  13.  
  14. java  -Xbootclasspath/p:-Xbootclasspath/p:emma-47655.jar emma ctl -connect localhost:47655 -command coverage.get,coverage_all.ec 
  15.  
  16.  
  17.  
  18.  
  19. Delivery: 
  20. /home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.delivery.deploy/target/web-deploy/lib 
  21. cp /home/pc2/emma/emma-47656.jar ./ 
  22.  
  23.  
  24. pc2.common-1.1.2.jar 
  25. pc2.delivery.deploy-1.1.2.jar 
  26. pc2.server.biz-1.1.2.jar 
  27. 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 
  28. 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 
  29. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47656.jar emma instr -m overwrite -cp pc2.delivery.deploy-1.1.2.jar -Dmetadata.out.file=coverage_delivery.em 
  30.  
  31. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47656.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 - 
  32.  
  33. Dmetadata.out.file=coverage_all_Delivery.em 
  34.  
  35.  
  36. java  -Xbootclasspath/p:-Xbootclasspath/p:emma-47656.jar emma ctl -connect localhost:47656 -command coverage.get,coverage.ec 
  37.  
  38.  
  39.  
  40.  
  41.  
  42. Subscription: 
  43. /home/pc2/stanley_sum/pc2-1.1.2-t/pc2.deploy/pc2.subscription.deploy/target/web-deploy/lib 
  44. cp /home/pc2/emma/emma-47657.jar ./ 
  45.  
  46. pc2.common-1.1.2.jar 
  47. pc2.server.biz-1.1.2.jar 
  48. pc2.subscription.deploy-1.1.2.jar 
  49. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47657.jar emma instr -m overwrite -cp pc2.server.biz-1.1.2.jar -Dmetadata.out.file=coverage_biz.em 
  50. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47657.jar emma instr -m overwrite -cp pc2.common-1.1.2.jar -Dmetadata.out.file=coverage_common.em 
  51. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47657.jar emma instr -m overwrite -cp pc2.subscription.deploy-1.1.2.jar -Dmetadata.out.file=coverage_subscription.em 
  52.  
  53. java -Xbootclasspath/p:-Xbootclasspath/p:emma-47657.jar emma instr -m overwrite -ip pc2.server.biz-1.1.2.jar -ip pc2.common-1.1.2.jar -ip pc2.subscription.deploy-1.1.2.jar -Dmetadata.out.file=coverage_all_Subscription.em 
  54.  
  55. java  -Xbootclasspath/p:-Xbootclasspath/p:emma-47657.jar emma ctl -connect localhost:47657 -command coverage.get,coverage_all_Subscription.ec 

  http://emma.sourceforge.net/faq.html

3.3. I have a large project consisting of several sub-projects. I would like to generate one coverage report for my entire project as well as individual reports for sub-projects -- is that possible?

^

As should be clear from Can you provide details on various intermediate data files used by EMMA ..., the key to making this possible is to keep EMMA metadata and coverage data files partitioned by sub-project:

  1. instrument all sub-projects and obtain separate metadata files prj1.emprj2.em, etc. That is, do not merge all of your metadata into a single global*.em file;

  2. similarly, run tests and obtain coverage data files prj1.ecprj2.ec, etc;

  3. now, to report on a selected project only, generate a report based on, say, {prj1.emprj1.ec} files. And to report on the entire codebase, report based on all available files {prj1.emprj2.em, ..., prj1.ecprj2.ec, ...}.

 

 4、在cmd中执行java emma

   在环境变量中设置:CLASSPATH=%JAVA_HOME%\jre\lib;D:\lib\emma.jar;   如果emma.jar没加,则上面-cp emma.jar可以去掉

  在tomcat的bin下的catalina.bat中设置:set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER% -Xbootclasspath/p:D:\lib\emma.jar

 

 

本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/426490,如需转载请自行联系原作者

相关文章
|
测试技术
IDEA创建单元测试与测试覆盖率统计
IDEA(IntelliJ IDEA)不仅支持快速基于当前类创建单元测试,还支持代码测试覆盖率的统计,以及生成报告和标记测试运行命中的代码。
1726 0
IDEA创建单元测试与测试覆盖率统计
|
SQL 弹性计算 关系型数据库
HTAP数据库 PostgreSQL 场景与性能测试之 3.1 - (OLAP) 大表JOIN统计查询-10亿 join 1亿 agg
标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能、性能、架构以及稳定性。 PostgreSQL社区的贡献者众多
1816 0
|
3月前
|
存储 测试技术
统计测试结果的代码实现接昨天
统计测试结果的代码实现接昨天
|
5月前
|
Java
100143. 统计已测试设备 --力扣 --JAVA
给你一个长度为 n 、下标从 0 开始的整数数组 batteryPercentages ,表示 n 个设备的电池百分比。 你的任务是按照顺序测试每个设备 i,执行以下测试操作: 如果 batteryPercentages[i] 大于 0: 增加 已测试设备的计数。 将下标在 [i + 1, n - 1] 的所有设备的电池百分比减少 1,确保它们的电池百分比 不会低于 0 ,即 batteryPercentages[j] = max(0, batteryPercentages[j] - 1)。 移动到下一个设备。 否则,移动到下一个设备而不执行任何测试。 返回一个整数,表示按顺序执行测试操作
31 0
|
5月前
|
存储 算法 异构计算
基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证
基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证
35-pytest-Hooks函数之统计测试结果
35-pytest-Hooks函数之统计测试结果
|
测试技术 BI
测试思想-测试总结 缺陷分析与统计浅析
测试思想-测试总结 缺陷分析与统计浅析
95 0
|
测试技术 BI
测试思想-测试总结 测试报告-关于关缺陷统计
测试思想-测试总结 测试报告-关于关缺陷统计
84 0
|
Java 测试技术
利用JaCoCo统计接口测试中代码覆盖率
做接口测试,很多时候都会听到,你接口测试的覆盖率是多少?很多人会回答80%,你怎么统计的,他说覆盖了80%的需求。这个回答没有错误,但是片面,我们不能只考虑需求的覆盖率,还有业务的覆盖率,场景的覆盖率,接口的覆盖率,代码的覆盖率等,本文介绍接口测试的代码覆盖率。那么我们来看看如何是实现的。
利用JaCoCo统计接口测试中代码覆盖率
|
算法
使用贝叶斯统计来进行更好更直观的A/B测试
使用贝叶斯统计来进行更好更直观的A/B测试
211 0
使用贝叶斯统计来进行更好更直观的A/B测试

热门文章

最新文章