远程代码覆盖率统计
Jococo通过Jacocoagent对代码进行动态插桩并统计代码覆盖率,Jacocogent提供了可以作为JVM代理实时统计在线服务的覆盖率情况,具体演示如下:
第一步 部署Java springboot服务,并启动Jacocoagent代理:
Jacocoagent以tcpserver方式启动,远程client可以随时连接到server dump覆盖率数据。具体agent配置参考Jacoco官网-Agent
第二步 可以访问环境进行手工测试,Jacoco可以统计测试覆盖率
第三步 在本机起TcpClient 连接JacocoAgent并获取覆盖率数据到本机
首先要保证本机具有远程Jacoco代理IP及端口的访问权限,具体代码可以参考JacocoApi事例-TcpClient,执行后会在本地相应目录输出覆盖率文件Jacocoagent.exec。
第四步 生产覆盖率报告
结合覆盖率文件Jacocoagent、编译后的class文件及源代码,可以生成html覆盖率报告。具体代码参考Jacoco生成覆盖率报告
通过以上步骤存在的问题:
- 覆盖率报告最外层没有bundle,二是罗列了所有package,需要改造生产覆盖率的事例代码;
- 统计的覆盖率不准确
后续做成平台需要考虑的问题:
- 获取编译文件:为了保证统计的准确性,最好采用运行时的编译代码;
- 多节点部署:服务往往是多节点部署的,涉及覆盖率合并;
- 多模块:现在服务都采用微服务,多模块划分,往往一次部署测试多个模块,涉及覆盖率合并或单个模块的覆盖率展示;
- 增量覆盖率:这个不用多说了;
- 覆盖率收集及管理:例子是采用tcpserver的方式请求获取覆盖率,平台最好采用tcpclient方式主动上报,但是现有模式貌似只支持启动和关闭的时候上报覆盖率(不准确),需要封装成定时上报模式;
- 覆盖率管理:同一服务,不同版本,不同部署环境如何进行管理,这应该是所有问题最大的痛点之一。
- 覆盖率叠加:对于代码有变动编译部署后之前的覆盖率会丢失,如何能保留代码变更前的覆盖率呢?有人问过此问题,貌似没有好的办法。