java代码覆盖实战
Jacoco原理
代码插桩
On-the-fly插桩:
JVM中通过-javaagent参数指定特定的jar文件启动Instrumentation的代理程序,代理程序在通过Class Loader装载一个class前判断是否转换修改class文件,将统计代码插入class,测试覆盖率分析可以在JVM执行测试代码的过程中完成。
Offline模式:
在测试前先对文件进行插桩,然后生成插过桩的class或jar包,测试插过桩的class和jar包后,会生成动态覆盖信息到文件,最后统一对覆盖信息进行处理,并生成报告。
两种方式对比:
On-the-fly无需提前进行字节码插桩。
On-the-fly无需停机(Offline需要停机),可以实时获取覆盖率。
On-the-fly更加方便获取代码覆盖率,但是代理服务会有一定的性能损耗。
springboot集成jacoco实现覆盖率统计
1.被测项目的部署与插桩操作
执行jacoco的配置,包含jacoco地址 ,端口 ,获取方法
-javaagent:H:/xx/xx/jacocoagent.jar=includes=*,output=tcpserver,port=7703,address=localhost,dumponexit=false
2.获取被测服务的覆盖率数据(jacoco-dump)
启动后点击 jacoco插件的dump会生成jacoco源文件
3.生成可视化html报告(jacoco-report)
点击jacoco的report 生成覆盖率报告
覆盖率报告
访问接口后再次生成覆盖率
分布式覆盖率报告合成使用 merge
jacocomerge底层会读取后缀为exec文件将其合成为新的文件
在企业中会将exec动态上传到版本服务器进行管理,在固定路径中动态合成
java代码覆盖实战