分析、产品迭代工作都要围绕它进行,这样一来移动端上的操作行为就显得格外重要,运用好了就可以带来效率提升,创造用户价值和商业价值,那我们如何才能更好的运用它们呢
背景
在软件生产交付过程中,我们通过单元测试、接口测试、功能测试等手段来保障软件质量;无论哪种测试手段,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]
转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论