软件测试 | 常见覆盖率统计工具

518 篇文章 3 订阅
514 篇文章 2 订阅

常见覆盖率统计工具

  • 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>]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
logcover 是一款非常便捷的统计测试用例异常日志覆盖率工具。可清晰地分析出程序源代码中异常日志的覆盖情况,检验测试充分度,指导测试用例完善。 使用场景: 度量异常分支测试覆盖率,覆盖单元测试、模块测试、集成测试  背景: 异常测试是软件测试中非常重要的一环,异常测试充分与否直接影响到测试质量和产品线上稳定性。logcover是Baidu质量部推出的一款专门用于度量异常测试覆盖率的轻量级工具,通过度量异常日志的测试覆盖率来反应异常测试覆盖率,因为打印异常日志的程序分支往往更需要测试覆盖的异常分支。原理: 结合程序源代码和测试执行产生的日志,计算程序异常日志的测试覆盖率。例如: 源代码中有100处异常日志(warning、fatal、error)打印点,程序在测试过程中,产生了100条日志,对应源代码中50处日志打印点,则异常日志覆盖率是50%,同时,logcover会给出覆盖日志和未覆盖日志的所有信息,包括文件名、行号等,便于快速识别未覆盖异常日志。实现:• 根据svn,对源代码进行轻量级静态分析,获得代码中异常日志打印的原始信息• 收集单机/多机测试日志,并对日志文件进行parse、filter、merge等处理,得到实际覆盖的日志信息• 根据代码中的原始日志信息和实际测试产生的日志信息,做diff计算,得出异常log覆盖率和覆盖信息• 覆盖率报告邮件推送logcover使用说明:1: 下载logcover2: 修改对应 logcover.cfg文件    logcover_type =0 表示单机模式;logcover_type=1表示多机模式。   选择多机模式时,对应填写 machines、user、password、log_paths和script_path 3: 执行 sh logcover.sh $svn $log_cover_log_dir $mail_list -s $mail_subject    $svn : 被测程序svn源码路径   $log_cover_log_dir: log文件存放路径   $mail_list : 覆盖率报告推送邮件列表,多邮件中间以空格分隔。例如:zhangsan@xx.com li@xx.com   -s $mail_subject : 推送邮件自定义主题logcover执行环境依赖:1: perl v5.8.5 2: python v2.7 3: svn client v1.6.5 标签:logcover

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值