使用 【jacoco】对基于 SpringBoot 和 Dubbo RPC 的项目生成测试覆盖率报告:实践+原理

基于 Dubbo RPC 的项目中有一个提供者项目backend、一个消费者项目gateway、以及注册中心nacos。本篇文章记录在windows本地对该框架的测试过程,以及介绍jacoco的基本原理

测试过程

  1. 官网下载安装包解压到本地,https://www.jacoco.org/jacoco/

  2. 只需要用到jacoco/lib 文件夹中的 jacocoagent.jar 以及jacococli.jar 这两个文件

  3. 创建一个backend,gateway目录,把他们各自的jar包以及jacoco上面提到的两个jar包复制两份放到这两个文件夹里面

  4. 正常启动nacos以及自己的interface项目

  5. 在backend中开一个cmd运行命令:java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar yuapi-backend-0.0.1-SNAPSHOT.jar 此时backend项目被启动

  6. 在gateway中开一个cmd运行命令:java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=6301,address=localhost,append=true -jar yuapi-gateway-0.0.1-SNAPSHOT.jar 此时gateway项目被启动

  7. 注意一个是6300端口,一个是6301端口,需要两个不一样的端口号

  8. 运行前端项目开始测试,或者使用postman,或者直接用Knife4j测试,测试完成后进行下一步

  9. 在backend中再开一个cmd(上一个可别管掉了啊)运行命令:java -jar jacococli.jar dump --address 127.0.0.1 --port 6300 --destfile jacoco-demo.exec 接着下一条命令:java -jar jacococli.jar report jacoco-demo.exec --classfiles D:\星球项目\yuapi-backend\target\classes --sourcefiles D:\星球项目\yuapi-backend\src\main\java --html html-report --xml report.xml --encoding=utf-8 --classfiles是本地项目classes所在的文件夹,--sourcefile是本地项目java所在的文件夹

  10. 此时jacoco\lib\backend\html-report会生成index.html,这就是backend代码覆盖率报告了

    绿色表示刚刚的测试覆盖到的代码,随便点进去一个,在登录的imple里面,测试到的正常登录的代码都已经是绿色了

  11. 同样的方法来生成gateway的覆盖率报告:在gateway中再开一个cmd(上一个可别管掉了啊)运行命令:java -jar jacococli.jar dump --address 127.0.0.1 --port 6301 --destfile jacoco-demo.exec 接着下一条命令:java -jar jacococli.jar report jacoco-demo.exec --classfiles D:\星球项目\yuapi-gateway\target\classes --sourcefiles D:\星球项目\yuapi-gateway\src\main\java --html html-report --xml report.xml --encoding=utf-8 --classfiles是本地项目classes所在的文件夹,--sourcefile是本地项目java所在的文件夹

  12. 此时jacoco\lib\gateway\html-report会生成index.html,这就是gateway代码覆盖率报告了

可以看到过滤器里面的正常逻辑都被覆盖到了

测试原理

以上介绍到了如何生成项目的测试覆盖率报告,接下来介绍一些理论知识

什么是单元测试覆盖度:

  • 单元测试覆盖度(Unit Test Coverage) 是一种衡量在单元测试中覆盖源代码的程度的指标。它表示在单元测试中执行了多少代码行、分支、语句或路径,以及在这些测试中检测到了多少错误。单元测试覆盖度有助于评估测试套件的质量和完整性,但并不总是反映出测试的质量。在 Java 项目中,可以使用 JaCoCo 工具来自动生成单元测试覆盖度报告,并且在报告中查看语句覆盖、分支覆盖、路径覆盖的比例。

jacoco的原理

  • jacoco通过字节码插桩实现代码覆盖率的统计
  • JVM通过 -javaagent参数指定jar文件启动代理程序,代理程序在ClassLoader装载一个class前判断是否修改class文件,并将探针插入class文件
  • 探针就是可以插入现有指令之间的一段其他指令,探针不改变原有方法的行为,只是记录是否已经执行。
  • jacoco插桩并不是每行,探针实现本身需要多个字节码指令,因此这将使类文件的大小增加数倍,并显着降低所检测类的执行速度。

对于这段代码:

java 复制代码
public static void example() {
    a();
    if (cond()) {
        b();
    } else {
        c();
    }
    d();

左图是它对应的字节码,右图是插桩后的字节码,可以看到只在分支的出口处进行了插桩

jacoco命令:

java 复制代码
1. java -javaagent:jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=localhost,append=true -jar user-center-0.0.1-SNAPSHOT.jar
2. 开始测试

3. java -jar jacococli.jar dump --address 127.0.0.1 --port 6300 --destfile jacoco-demo.exec

4. java -jar jacococli.jar report jacoco-demo.exec --classfiles D:\javacode\user-center\user-center\target\classes --sourcefiles D:\javacode\user-center\user-center\src\main\java --html html-report --xml report.xml --encoding=utf-8
5. 查看覆盖率报告
相关推荐
小林学习编程1 小时前
Springboot + vue + uni-app小程序web端全套家具商场
前端·vue.js·spring boot
ladymorgana2 小时前
【Spring boot】tomcat Jetty Undertow对比,以及应用场景
spring boot·tomcat·jetty
IT_10242 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
DCTANT2 小时前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.3 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
喜欢敲代码的程序员4 小时前
SpringBoot+Mybatis+MySQL+Vue+ElementUI前后端分离版:项目搭建(一)
spring boot·mysql·elementui·vue·mybatis
华子w9089258595 小时前
基于 SpringBoot+Vue.js+ElementUI 的 “花开富贵“ 花园管理系统设计与实现7000字论文
vue.js·spring boot·elementui
小时候的阳光6 小时前
SpringBoot3 spring.factories 自动配置功能不生效?
spring boot·spring·失效·factories·imports
大只鹅7 小时前
Springboot3整合ehcache3缓存--XML配置和编程式配置
spring boot·缓存
执笔诉情殇〆8 小时前
springboot集成达梦数据库,取消MySQL数据库,解决问题和冲突
数据库·spring boot·mysql·达梦