Super-Jacoco是基于Jacoco、git二次开发打造的一站式JAVA代码全量/diff覆盖率收集平台,能够低成本、无侵入的收集代码覆盖率数据;Super-Jacoco除了支持JVM运行时间段的覆盖率收集外;还能够和环境无缝对接,收集服务端自定义时间段代码全量/增量覆盖率;并提供可视化的html覆盖率报表,协助覆盖率分析,支撑精准测试落地。

0. 背景

在软件生产交付过程中,我们通过单元测试、接口测试、功能测试等手段来保障软件质量;无论哪种测试手段,case设计是否全面、精简,显得尤为重要。在实际项目测试过程中,case的设计经常会出现以下问题:

1. 开发同学写了大量单测,一直重复执行一段代码逻辑,少数场景或异常代码逻辑并未执行到;

2. 测试同学设计的测试用例经过反复评审,仍然有未覆盖到的异常场景,出现漏测情况;

3. 接口自动化测试case作为日常回归手段,无法确定是否覆盖所有代码逻辑,其可靠性无法评估。

那么,如何才能用最精简的case来保障测试的全面性呢?目前业界比较认可的是手段是通过分析变更代码的覆盖率补充响应的case;我们调研了业界开源的java代码覆盖率统计工具jacoco和EMMA,发现jacoco和EMMA都只支持收集全量代码覆盖率,不能满足精准分析增量代码覆盖程度的诉求。因此,我们亟需一款能够收集变更代码覆盖率的工具。

1. Super-jacoco简介

Super-Jacoco是基于Jacoco、git二次开发打造的一站式JAVA代码全量/diff覆盖率收集平台,能够低成本、无侵入的收集代码覆盖率数据。Super-Jacoco除了支持JVM运行时间段的覆盖率收集外;还能够和环境无缝对接,收集服务端自定义时间段代码全量/增量覆盖率。并提供html格式的可视化覆盖率报表,协助覆盖情况精准分析,支撑精准测试落地。

单测代码全量/增量覆盖率收集:

on-the-fly模式,无需对开发代码做任何改造,即可收集覆盖率数据;

功能测试全量/增量覆盖率收集:

和环境部署平台ebase集成,只需要在JAVA启动命令中添加-javaagent:jacocoagent.jar=includes=com.*即可收集功能测试覆盖率数据;

可视化报告:

可视化的html覆盖率报表,协助覆盖情况精准分析,支撑精准测试落地。

2. Super-jacoco原理

▍2.1. 整体流程

为了支持增量覆盖率收集,我们需要做两件事情:**1)**获取不同版本代码diff文件;**2)**对jacoco进行二次开发,使其支持增量方法列表参数。

▍2.2. 获取增量代码

主要流程:拉取master(参照分支)和feature(提测分支)代码,再通过JGit对两个分支源码进行比对,获取增量代码。以下为部分代码片段:

▍2.3. jacoco 二次改造,支持增量方法列表参数

JaCoCo 对 exec 的解析主要是在 Analyzer 类的 analyzeClass(final byte[] source) 方法。这里面会调用 createAnalyzingVisitor 方法,生成一个用于解析的 ASM 类访问器,继续跟代码,发现对方法级别的探针计算逻辑是在 ClassProbesAdapter 类的 visitMethod 方法里面。所以我们只需要改造 visitMethod 方法,使它只对提取出的每个类的新增或变更方法做解析,非指定类和方法不做处理。改造后的核心代码片段如下:

▍2.4. 执行

只需要在执行的mvn命令中加入-Djacoco.diffFile=变更方法列表,即可收集变更方法的代码覆盖率。如果不传入-Djacoco.diffFile或者Djacoco.diffFile参数为空,则默认收集全量覆盖率。

▍2.5. 报告输出

覆盖率报告如下图,在图中是某个 service 的实现类,在最新的代码中有23个方法,但是只会对变更或新增的5个方法进行覆盖率统计与显示:

3. 特性

  • 通用:既支持单元测试覆盖率收集,也支持手工测试覆盖率收集;既支持全量覆盖率收集,也支持diff覆盖率收集;
  • 无侵入:采用on-the-fly模式,无需对开发代码做任何改造,即可收集覆盖率数据;
  • 高可用:分布式架构,任务机可无限扩展,避免任务机down机或者任务过多时出现性能瓶颈;
  • 可视化:提供html格式的覆盖率报告,可读性高。

4. 架构

5. 如何使用

▍5.1. 数据库安装和初始化

5.1.1 安装mysql数据库,创建数据库后执行sql/db.sql文件中的建表SQL

▍5.2. 编译打包

5.2.2 clone代码,更改application.properties文件中的数据库和gitlab配置:

spring.datasource.url=jdbc:mysql://IP:端口/数据库名?useUnicode=true&characterEncoding=utf8

spring.datasource.username=

pring.datasource.password=

gitlab.username=

gitlab.password=

5.2.3 执行mvn package -Dmaven.test.skip=true生成super-jacoco.jar

▍5.3. 部署

5.3.1 执行“nohup java -jar super-jacoco.jar &”启动代码覆盖率服务,默认端口为8899

▍5.4. 覆盖率收集接口

5.4.1 单测覆盖率接口

1)启动覆盖率收集URL:/cov/triggerUnitCover调用方法:POST参数(body方式传入):{"uuid":"uuid","type":1,"gitUrl":"git@git","subModule":"","baseVersion":"master","nowVersion":"feature","envType":"-Ptest"}返回:{"code":200,"data":true,"msg":"msg"}备注:2)获取覆盖率结果URL:/cov/getUnitCoverResult调用方法:GET参数:uuid(String)返回:{"code":200,"data":{"coverStatus":1,"errMsg":"msg","lineCoverage":100.0,"branchCoverage":100.0,"logFile":"file content","reportUrl":"http://"},"msg":"msg"}备注:复制代码

5.4.2 环境覆盖率接口

1)启动覆盖率收集URL:/cov/triggerEnvCov调用方法:POST参数(body方式传入):{"uuid":"uuid","type":1,"gitUrl":"git@git","subModule":"","baseVersion":"master","nowVersion":"feature","address":"127.0.0.1","port":"8088"}返回:{"code":200,"data":true,"msg":"msg"}备注:IP和port为模块部署服务器的IP和端口,在dump jacoco.exec时使用,需要提前把org.jacoco.agent-0.8.5-runtime.jar包拷贝到服务器:/home/xxx/目录,服务启动时需要添加启动参数:-javaagent:/home/xxx/org.jacoco.agent-0.8.5-runtime.jar=includes=*,output=tcpserver,address=*,port=18513 2)获取覆盖率结果URL:/cov/getEnvCoverResult调用方法:GET参数:uuid(String)返回:{"code":200,"data":{"coverStatus":1,"errMsg":"msg","lineCoverage":100.0,"branchCoverage":100.0,"logFile":"file content","reportUrl":"http://"},"msg":"msg"}备注:复制代码

6. 总结

在业务快速迭代的背景下,精准测试将是高效测试的发展趋势,代码覆盖率则是其中重要的一环,Super-jacoco将java的代码覆盖率统计做到方便、快捷有助于精准测试的推动和发展,欢迎加入!

7. GitHub项目地址

github.com/didi/super-jacoco

8. 开源团队

团队成员皆来自滴滴车服技术团队

推荐阅读

刷Github时发现了一本阿里大神的算法笔记!标星70.5K

阿里巴巴程序员为什么成长那么快?

jacoco收集探针结果时机_滴滴开源Super-jacoco:java代码覆盖率收集平台相关推荐

  1. jacoco收集探针结果时机_Jacoco覆盖率使用总结

    tags: Java 前阵子使用 Jacoco 进行代码覆盖率测试,由于项目特殊遇到了不少坑,网上搜到的教程感觉也不够全面,特此记录. 所用到的工具软件的版本信息如下 Jacoco 版本:0.8.0 ...

  2. 图像处理 花屏_滴滴开源的 AoE:工程实践中的图像处理

    近期,滴滴开源了AOE项目,很多人还是一脸懵逼,不太清楚AOE 到底是干什么的,所以今天我们再来听听官方工程师是怎么介绍的吧,不信你还是听不懂:近期我们开发了一个银行卡 OCR 项目.需求是用手机对着 ...

  3. es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路

    前不久,滴滴ES团队将维护的30多个ES集群,3500多个ES节点,8PB的数据,从2.3.3跨大版本无缝升级到6.6.1.在对用户查询写入基本零影响和改动的前提下,解决了ES跨大版本协议不兼容.文件 ...

  4. xmindcore.java_滴滴开源AgileTC:敏捷测试用例管理平台

    [![](http://img.blog.itpub.net/blog/2020/09/23/2a4ae0a9fcb0dac6.png?x-oss-process=style/bb)](https:/ ...

  5. 滴滴人脸识别申诉照片怎么拍_滴滴司机理发被停账号,平台规则到底如何遵守才能避免踩坑?...

    在一喂接单久了,听到滴滴司机说的事情都觉得有些不可思议. 马上快到年关,司机们都想多些收入,全家一起开开心心过个好年,但是前段时间,车友群里的网约车司机徐师傅,突然被平台封号,至于原因,更是出乎意料. ...

  6. 滴滴开源AoE:一种快速集成AI的终端运行环境SDK

    作者:石臻臻, CSDN博客之星Top5.Kafka Contributor .nacos Contributor.华为云 MVP ,腾讯云TVP, 滴滴Kafka技术专家 . LogiKM PMC( ...

  7. 滴滴开源Android插件框架

     登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 返回通知列表 下一条 上一条 分享资讯传PPT/文档提问题写博客传资源创建项目创建代码片 wz ...

  8. 收集一些优秀的甲方安全开源项目

    这是一份开源安全项目清单,收集了一些比较优秀的开源安全项目,以帮助甲方安全从业人员构建企业安全能力.这些开源项目,每一个都在致力于解决一些安全问题. 项目收集的思路: 一个是关注互联网企业/团队的安全 ...

  9. 良心博客滴滴开源框架VirtualAPK插件化介绍加教程加DEMO加投入项目

    公司要实现一个这样的效果,类似于qq游戏大厅,我们可以下载斗地主,可以下载保皇,下载完成直接就可以玩,不需要安装,也就是说我们的这一款软件里面可以装载多款软件. 公司项目是一套系统管理软件,它里面包括 ...

最新文章

  1. 什么是滚动灯箱的全数字滚动系统?
  2. loj #6226. 「网络流 24 题」骑士共存问题
  3. vue 请求多个api_Vue 创建多人共享博客
  4. oracle dump 转储
  5. GIT入门笔记(18)- 标签创建和管理
  6. QQ空间说说的表情添加的代码
  7. Oracle:时间字段模糊查询
  8. vmware与windows共享文件夹
  9. Spring Boot 表单验证
  10. ajax点击事件click触发两次,jQuery点击click触发两次事件解决办法
  11. vue在调用摄像头扫码(vue-qrcode-reader)
  12. php文件对应的模板,wordpress模板文件对应说明关系(wp模板文件说明)
  13. leetcode881.救生艇(中等)
  14. CocosCreator实现粒子特效播放序列帧动画
  15. javascript 高级程序设计(第三版)读后归纳
  16. MATLAB_遗传神经网络
  17. kermit 安装 配置 使用
  18. 我的Photoshop大师之路(二)
  19. C# TCP/IP通信(存小问题/大体欧克)
  20. 嗯?你的VS2019运行黑框一闪而过嘛

热门文章

  1. 【TensorFlow2.0】(6) 数据统计,范数、最值、求和、均值、最值位置、唯一值、张量比较
  2. 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
  3. jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
  4. ts转换mp4 linux_佳佳MPEG4格式转换器官方版下载-佳佳MPEG4格式转换器v6.5.5.0下载
  5. 编译 ORB_SLAM2 (一)
  6. There's no Qt version assigned to this project for platform Win32/Win64
  7. Learn OpenGL (九):基础光照
  8. 将日志中的指定字段对齐显示输出
  9. ATS中的命令行工具解读
  10. 用composer安装laravel-bjyblog