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,如需转载请自行联系原作者

相关文章
|
6月前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
139 7
|
2月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文为基于FPGA的4-ASK调制与帧同步系统硬件测试版,采用Verilog实现,包含ILA在线采集与VIO SNR设置模块,支持高斯信道误码统计,适用于通信系统教学与实践。
43 2
|
3月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2FSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文基于FPGA实现2FSK+帧同步系统,采用Verilog开发,包含Testbench、高斯信道、误码统计及可设置SNR功能。硬件版本新增ILA在线数据采集与VIO在线SNR设置模块,验证调制解调过程。理论部分介绍FSK调制解调原理、功率谱特性及帧同步机制,代码实现FSK信号生成与处理,适合数字通信学习与实践。
112 1
|
5月前
|
数据采集 移动开发 算法
【硬件测试】基于FPGA的QPSK调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现QPSK调制与软解调系统,包含Testbench、高斯信道、误码率统计模块,并支持不同SNR设置。硬件版本新增ILA在线数据采集和VIO在线SNR设置功能,提供无水印完整代码及测试结果。通过VIO分别设置SNR为6dB和12dB,验证系统性能。配套操作视频便于用户快速上手。 理论部分详细解析QPSK调制原理及其软解调实现过程,涵盖信号采样、相位估计、判决与解调等关键步骤。软解调通过概率估计(如最大似然法)提高抗噪能力,核心公式为*d = d_hat / P(d_hat|r[n])*,需考虑噪声对信号点分布的影响。 附Verilog核心程序代码及注释,助力理解与开发。
144 5
|
5月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2ASK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR
本文分享了基于FPGA的2ASK+帧同步系统硬件测试版本,包含ILA数据采集、VIO SNR设置及数据源模块。通过调整SNR(如45dB和10dB),实现对调制解调性能的验证。2ASK调制将数字信号转为二进制码,通过载波振幅变化传输;帧同步用于确定帧起始位置,确保数据正确解调。附带操作视频与核心Verilog代码,便于理解和复现。
148 9
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的MSK调制解调系统系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现MSK调制解调系统,采用Verilog开发,包含同步模块、高斯信道模拟、误码率统计等功能。相比仿真版本,新增ILA数据采集与VIO在线SNR设置模块。通过硬件测试验证,展示不同SNR(如10dB和16dB)下的性能表现。研究聚焦软件无线电领域,优化算法复杂度以适应硬件限制,利用MSK恒定包络、相位连续等特性提升频谱效率。核心代码实现信号生成、调制解调、滤波及误码统计,提供完整的硬件设计与分析方案。
197 19
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
146 17
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
150 13
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
125 7
|
6月前
|
数据采集 算法 数据处理
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
119 2