如何通过功能自动化测试(非单元测试)获取Spring Boot应用代码覆盖率
功能自动化测试统计Spring Boot应用代码覆盖率实现方案
可行性结论
完全可以实现。Jacoco支持对独立运行的Java进程做动态覆盖率采集,不需要自动化测试代码和应用源码存放在同一仓库,适配你当前TestNG/RestAssured的自动化测试技术栈。
具体实现步骤
步骤1:准备Jacoco运行依赖
提前下载对应版本的jacocoagent.jar和jacococli.jar,保证两个Jar包版本和你应用构建用的Jacoco插件版本一致,避免兼容性问题。步骤2:启动插桩模式的Spring Boot应用
启动Spring Boot应用时添加Jacoco Agent启动参数,开启覆盖率采集TCP服务:
核心参数说明:java -javaagent:/本地路径/jacocoagent.jar=output=tcpserver,address=0.0.0.0,port=6300,includes=com.你的业务包名.* -jar 你的应用.jar- output=tcpserver:Jacoco以TCP服务模式运行,支持外部指令触发覆盖率数据导出
- includes:指定需要统计覆盖率的业务包路径,过滤第三方依赖类减少采集开销
- port:自定义Jacoco服务端口,后续导出数据需要用到
步骤3:执行功能自动化测试用例
调整测试配置,将所有接口请求地址指向上述启动的插桩版Spring Boot应用,正常执行全量TestNG测试用例即可,Jacoco会自动记录所有运行到的代码路径。步骤4:导出覆盖率原始数据
测试执行完成后,不要关闭Spring Boot应用,执行jacococli命令导出采集到的覆盖率数据:
执行完成后会在当前目录生成java -jar /本地路径/jacococli.jar dump --address <应用部署IP> --port 6300 --destfile ./jacoco.execjacoco.exec二进制覆盖率数据文件。步骤5:生成可视化覆盖率报告
将jacoco.exec文件拷贝到Spring Boot源码项目根目录,执行对应构建命令生成报告:- Maven项目执行:
mvn jacoco:report -Djacoco.dataFile=./jacoco.exec - Gradle项目执行:
gradle jacocoTestReport -PjacocoDataFile=./jacoco.exec
生成的报告默认存放在target/site/jacoco(Maven)或build/reports/jacoco/test(Gradle)目录下,打开index.html即可查看各包、类、方法的代码覆盖率数据。
- Maven项目执行:
常见问题注意点
- 生成报告用的应用编译后class文件,必须和插桩运行的应用class文件版本完全一致,否则会出现覆盖率统计缺失、类匹配失败的问题
- 如果需要合并多轮测试、多节点部署的覆盖率数据,可以在dump时添加
--append参数追加数据,也可以用jacococli merge命令合并多个exec文件 - 生产环境不要使用该插桩参数运行,会带来一定的性能损耗,仅在测试环境使用
内容的提问来源于stack exchange,提问作者Vikas Thange
相关产品推荐
相关产品推荐

