低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

滴滴开源 Super-jacoco:java 代码覆盖率收集平台文档

2021 年 5 月 14 日

滴滴开源Super-jacoco:java代码覆盖率收集平台文档

分析、产品迭代工作都要围绕它进行,这样一来移动端上的操作行为就显得格外重要,运用好了就可以带来效率提升,创造用户价值和商业价值,那我们如何才能更好的运用它们呢


背景


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


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


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


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


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


Super-jacoco 简介


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


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

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


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

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


可视化报告:

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


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 个方法进行覆盖率统计与显示:



特性


  • 通用:既支持单元测试覆盖率收集,也支持手工测试覆盖率收集;既支持全量覆盖率收集,也支持 diff 覆盖率收集;

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

  • 高可用:分布式架构,任务机可无限扩展,避免任务机 down 机或者任务过多时出现性能瓶颈;

  • 可视化:提供 html 格式的覆盖率报告,可读性高。


架构



总结


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



头图:Unsplash

作者:Super-jacoco

原文:https://mp.weixin.qq.com/s/3a8ki3GiW0Rk0lBzN4cnHw

原文:滴滴开源 Super-jacoco:java 代码覆盖率收集平台文档

来源:滴滴技术 - 微信公众号 [ID:didi_tech]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021 年 5 月 14 日 15:072

评论

发布
暂无评论
发现更多内容

医院HIS故障,险引发人命关天大危机,竟被程序员轻松解决!

Marilyn

百度人工智能OCR调用调试过程

tuuezzy

WSDM Cup 2020大赛金牌参赛方案全解析

华为云开发者社区

大数据 搜索 信息

Lindorm云原生数据库 - 让数字时代IT运维系统“灵动”起来

许力

DevOps APM Data Lake AIOPS

有了TA,领域外企业里的小IT团队,也能轻松搞定大型项目

Marilyn

敏捷开发 快速开发

JVM-技术专题-深入理解内存结构

李浩宇/Alex

Java JVM

数字货币交易所开发,币币交易源码

135深圳3055源中瑞8032

年轻人大企打拼多年,刚升迁便遇巨大阻力难以解决,到底如何才能在职场中幸存?

Marilyn

敏捷开发 快速开发

架构师训练营 1 期第 4 周:系统架构 - 作业

piercebn

极客大学架构师训练营

Go语言内存管理三部曲(一)内存分配原理

网管

go 内存管理 内存布局

区块链USDT支付系统开发需要多少费用?USDT跨境支付

135深圳3055源中瑞8032

企业开发遇到瓶颈,何不换个新思路?快速开发了解一下

Marilyn

敏捷开发 快速开发

阿里P8大牛呕心沥血总结整理的《Java面经手册》,通过实践的方式向你深度讲解Java核心知识点

Java成神之路

Java 阿里巴巴 程序员 面试 编程语言

JVM-技术专题-对象的实例化过程

李浩宇/Alex

Java JVM

图扑软件联手阿里Lindorm数据库开启工业物联超融合存储模式

许力

IoT AIOT

JVM-技术专题-Java类文件结构

李浩宇/Alex

Java JVM

阿里内部《Java架构进阶宝典》,总结了基础、进阶、架构三个阶段的知识点

Java架构之路

Java 程序员 面试 算法 编程语言

合约跟单交易系统开发,一键智能跟单软件

135深圳3055源中瑞8032

一线城市年轻人生活工作录(业务员篇)

Marilyn

敏捷开发 快速开发

为什么巨头都在布局SaaS生态?

ToB行业头条

SASS

TensorFlow 篇 | TensorFlow 2.x 基于 Keras 的模型保存及重建

Alex

tensorflow keras model save model restore tensorflow hub

区块链钱包软件开发费用,区块链多币种钱包

135深圳3055源中瑞8032

一线城市年轻人生活工作实录(程序员篇)

Marilyn

敏捷开发 开发者工具 快速开发

用友政务表格技术应用开发实践:预算一体化产品核心功能搭建

Geek_Willie

SpreadJS 用友

MySQL-技术专题-性能优化—索引篇

李浩宇/Alex

Redis Sharding集群跟一致性哈希有什么瓜葛?

Man

一致性哈希 Jedis redis cluster

阿里面试官纯手打:金九银十跳槽必会Java核心知识点笔记整理

Java架构追梦

Java 数据库 架构 面试 微服务

医疗AI系统构建(1)one-hot编码

刘旭东

人工智能 学习 医疗AI one-hot

有一说一,大型信息化企业的软件系统,还是用自研的好

Marilyn

敏捷开发 快速开发 开发工具 软件设计

五年Java开发经验,4面阿里成功拿下offer,分享一下个人面经!

Java架构之路

Java 程序员 面试 算法 编程语言

微前端之如何拆解React巨石应用 qiankun

SugarTurboS

项目管理 架构 React 微前端 前端性能优化

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

滴滴开源Super-jacoco:java代码覆盖率收集平台文档-InfoQ