常见覆盖率统计工具

  • emma
  • cobertura
  • jacoco

emma 与 cobertura 是为单元测试而设计的覆盖率统计,jacoco 与 emma 同属于一家公司,但是是为了 更广泛的覆盖率统计而设计的工具。

Jacoco

jacoco 的文档中有个 mission 章节,里面对 jacoco 的定位描述的很好

There are several open source coverage technologies for Java available. While implementing the Eclipse plug-in EclEmma the observation was that none of them are really designed for integration. Most of them are specifically fit to a particular tool (Ant tasks, command line, IDE plug-in) and do not offer a documented API that allows embedding in different contexts. Two of the best and widely used available open source tools are EMMA and Cobertura. Both tools are not actively maintained by the original authors any more and do not support the current Java versions. Due to the lack of regression tests maintenance and feature additions is difficult.

Therefore we started the JaCoCo project to provide a new standard technology for code coverage analysis in Java VM based environments. The focus is providing a lightweight, flexible and well documented library for integration with various build and development tools. Ant tasks, a Maven plug-in and the EclEmma Eclipse plug-in are provided as reference usage scenarios. Also many other tool vendors and Open Source projects have integrated JaCoCo into their tools.

大意是说其他的工具没有得到积极有效的维护,而且其他的工具都是为了单一任务而设计,他们不是为 了“集成”而生。从这一点上我们就可以看出 jacoco 的设计理念。

得益于 jacoco 的设计理念,以及良好的 api 设计,它可以轻松的与已有的工具集成,甚至进行平台 化。它也可以同时用于单元测试与集成测试,所以是一款非常优秀的覆盖率统计工具,很多公司的精准 化测试,就是重度依赖了 jacoco。

覆盖率分析原理

要了解代码覆盖率的统计原理,我们就需要去深入了解 jvm 的机制。这方面的知识是 java 领域的高端 进阶知识,限于篇幅,我们只讲解下大概的原理,完整内容请参考 VM 虚拟机系列的书籍,以及 newrelic 早年发布的若干代码插桩的资料。

简单说下原理,java 源代码会被 javac 编译为 class 文件,class 文件保存了 class 的基本信息与 jvm 的 指令集。java 的底层 runtime,也就是 jvm 在解析 class 的时候,会把文件格式的 class 读取到内存并 运行。android 也是借鉴了这一整套的设计理念,android 上的 runtime 其实是 dalvik 与 art。

当我们要统计代码覆盖率的时候,就需要在代码的执行路径上加入探针分析。通常是在读取类的时候, 在关键的指令块的出口与入口增加标记。当指令块被执行后,就会命中探针并完成记录。

要修改最底层的 jvm 字节码往往是比较麻烦的,需要精通 jvm 的各种指令以及 java class 结构。这方 面的处理目前已有有非常成熟的开源项目可以做大了,如下就是一些知名的字节码修改工具。

ASM

JavaAssist

ByteBuddy、BTrace、JVM-Sandbox

其中 ASM 是所有字节码操作的底层基础,是最底层的字节码修改工具。其他工具是它之上的一些高级 封装。借助于这些工具与 JVM 自身的一些调试特性,我们就可以对 jvm 代码或者进程进行便捷的操纵 了。

插装方式

插桩方式有很多种,常见的方式如下

  • 源代码插桩:offline 插桩,支持 android
  • 字节码插桩:offline 插桩,支持 android
  • javaagent 模式:脱离代码在运行时插桩,on the fly 模式

jacoco 支持字节码插桩与 javaagent 这两种插桩方式。也就是就算没有源代码也可以统计到覆盖率数 据,但是最后分析的时候,还是要结合源代码才能获得更多的覆盖率细节数据。毕竟覆盖率的统计,并 不是只是简单的覆盖率数据本身的指标高低。

jacoco 的工作方式

jacoco 支持四种工作模式

  • file:进程结束的时候在本地生成文件
  • tcpserver:开启端口等待客户端获取覆盖率
  • tcpclient:主动把覆盖率数据发送出去
  • none:不生成覆盖率

很多人都会使用 file 模式,但是 tcp server 模式才是最易用的。因为不需要申请服务器的文件访问权限 就可控制覆盖率数据。你可以根据自己公司的部署情况选择合适的工作模式。

on the fly 插桩模式

on the fly 插桩模式是使用最多的。首先需要在你的被测 java 程序启动的时候,加入 jvm 的一些 javaagent 参数。

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
destfile
output:file、tcpserver、tcpclient、none
address
port

你可以自己设置适合的工作模式。 离线插桩模式,适合 android 的覆盖率统计,需要借助于 maven、gradle 等构建工具的 instrument 指 令。

jacoco-cli jacoco-cli 是 jacoco 的一个组件,可以在不依赖 maven、gradle 构建工具的情况下完成对代码的分析。 主要用于 tcpserver 工作模式下 用法如下

java -jar jacococli.jar dump [--address <address>] --destfile <path> [--help] \
[--port <port>] [--quiet] [--reset] [--retry <count>]

软件测试 | 常见覆盖率统计工具相关推荐

  1. 测试覆盖率统计工具_使用测试工具和方法进行测试覆盖率

    测试覆盖率统计工具 概述: 要定义"测试覆盖率",我们必须谈论以下主题: 测试覆盖的目的. 不同类型的测试覆盖率标准. 测试覆盖率指标 单元测试范围 测试覆盖率工具 测试覆盖范围的 ...

  2. 温故而知新:gtest单元测试工具和lcov覆盖率统计工具的结合使用

    一.简介   之所以叫温故而知新,是因为将这两个工具结合起来作为单元测试工具的想法在上一个项目中应用了,好像还没有人将这两种工具结合使用,或者没有写成博客供大家参考,现在重新温习下将想法写下来. gt ...

  3. 多环境多需求并行下的代码测试覆盖率统计工具实现

    个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 测试覆盖率常被用来衡量测试的充分性和完整性,也是测试有效性的一个度量.「敏捷开发」的大潮之下,如何在快速迭代的同时保证对被测代码的覆 ...

  4. coverage.py - python 单元测试覆盖率统计工具

    前提: 1.假定已经安装好coverage.py(ubuntu 10.10+python.2.7+coverage3.5.1) 2.项目里有模块do.py以及测试它的单元测试模块doTEST.py 命 ...

  5. 最常见的6种网站流量统计工具介绍

    1.CNZZ 服务统计 由国际著名风险投资商IDG 投资的网络技术服务公司,是中国互联网目前最有影响力的免费流量统计技术服务提供商,专注于为互联网各类站点提供专业.权威.独立的第三方数据统计分析. 同 ...

  6. coverity代码检测工具介绍_FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具...

    FOREPOST:一种使用反馈驱动学习软件测试的性能检测工具 摘要 性能测试的一个目标是找出某些特定情况,在这些情况下对于某些输入值组合,应用程序意外地展示出更糟糕的特性.性能测试的一个基本问题是如何 ...

  7. 覆盖率测试工具(coverage tool)

    覆盖率测试工具(coverage tool) java: Emma:优点:1 开源软件:2 支持ANT TASK;Emma 是开源的,同时它对应用程序执行速度的影响非常小. 缺点:1 ANT TASK ...

  8. 【数据竞赛】盘点Kaggle中常见的AutoEDA工具库

    在完成竞赛和数据挖掘的过程中,数据分析一直是非常耗时的一个环节,但也是必要的一个环节. 能否使用一个工具代替人来完成数据分析的过程呢,现有的AutoEDA工具可以一定程度上完成上述过程.本文将盘点常见 ...

  9. python接口测试覆盖率统计_从 jacoco 报告数据分析,python 脚本实现增量覆盖率统计...

    jacoco的增量覆盖率报告实现的逻辑和一些个人想法. jacoco报告分析 从jacococli.jar的使用方法可以看到,导出的文件格式有csv,xml,html等多种格式. 进行尝试后,可以看到 ...

最新文章

  1. sdut-1118 C语言实验——从大到小输出a、b、c(选择结构)
  2. Ubuntu安装Samba实现跟windows文件共享
  3. HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)
  4. 数不清的Gmail邀请发放中……
  5. https理论与实践
  6. 巧妙检查WinXP系统漏洞
  7. 【渝粤教育】国家开放大学2018年秋季 8660-22T (1)农科化学基础知识 参考试题
  8. 知识竞赛现场管理系统安装配置及使用疑难问题汇编
  9. linux视频教程百度网盘分享
  10. python继电器控制
  11. php常用字体大小,推荐:PHP编辑器常用的几种字体下载
  12. 数学建模学习(101):车辆路线规划问题
  13. 360如何清理注册表
  14. 地图选择区域遮罩层自定义控件实现
  15. 后台管理系统,前端框架
  16. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)
  17. shell脚本:删除文本中的字母、找单词、筛选,匹配,删除,替换
  18. 电影 控方证人 + 勇敢者游戏
  19. 计算机作文+300字,有关电脑作文300字六篇
  20. python排序算法——归并排序(附代码)

热门文章

  1. 【模型压缩】(二)—— 剪枝
  2. 数据结构(八) -- C语言版 -- 栈和队列 - 队列的设计与实现
  3. 现在就业到底有多难?
  4. 解决网站出现"百度提示您:该页面可能因heike侵入而存在安全风
  5. Spring源码之getBean(获取 bean)方法(二)解读
  6. Excel整行拆分可实现间隔插入不同的N行!
  7. 【逆向知识】单机游戏去启动广告
  8. PhoneGap(Cordova) :js调用native(2) ------Android篇
  9. php pcntl sigterm,php – 如果pcntl_signal()被设置,我可以依靠在SIGTERM上调用register_shutdown_function()吗?...
  10. Android调用自带文件管理器,文件管理器(com.zsorg.piyell.filemanager) - 2.4.3 - 应用 - 酷安...