1、平台架构
覆盖率平台架构设计
2、流程
服务插桩及部署
Go为编译时插桩,采用goc的开源方案https://github.com/qiniu/goc,goc底层是基于go原生工具go tool cover来实现插桩,在此基础上封装了agent服务,运行在单独的协程中,实现不停服采集覆盖率数据,同时还有一套注册中心服务管理多个agent,适合于分布式服务场景下的测试覆盖率采集。
Go插桩原理说明
Java 为启动时插桩,采用原生的jacoco方案https://zhuanlan.zhihu.com/p/410955562,修改class字节码达到插桩目的,jacocoagent采集上报,注意依赖的jacocoagent.jar包需要提前打包到所部署的服务器中。
Java插桩原理
2. 覆盖率数据采集与报告生成
Go和Java分别通过goc和jacoco工具指令来采集覆盖率,并通过辅助工具将采集到的覆盖率数据转换为便于分析的xml格式。java生成report的时候,除源码外还需要提供编译产物的classfile。
3. 覆盖率数据合并与报告生成
每次采集数据生成原始报告后,会依据代码仓库的commitid来存储报告数据,同一个commid的数据会做合并。最终根据用户界面上指定的报告配置,合并多个commid的数据生成summary报告
增量覆盖率是依据git diff的结果找出增量行,基线版本由用户指定,然后结合已计算出的全量覆盖率报告数据,就可以得到增量覆盖率。
增量覆盖率计算逻辑示意图
4. 后记
基于代码版本覆盖率数据合并的方法,在与标准流水线打通后,还可实现功能测试和自动化覆盖率报告的分别生成,具体方法和流程下回分析。