Java代码覆盖率super-jacoco

开源项目地址

https://gitee.com/didiopensource/super-jacoco

项目流程

image

项目架构

image

部署步骤

注意:一定要用Linux服务器部署,不要用Windows

准备Linux服务器环境

  1. 安装好JDK1.8
  2. 安装好git
  3. 安装和配置好Maven3.6,或3.6以下
  4. 安装MySQL数据库(尽量不用8版本,就用5.7、5.8版本)

拉取super-jacoco开源项目

git clone https://gitee.com/didiopensource/super-jacoco.git

初始化MySQL

  1. 建立数据库:super-jacoco
  2. 建立数据表:执行 sql/db.sql 文件
    image
  3. 修改 application.properties 文件中的数据库配置
# 以下信息需要手动配置
spring.datasource.url=jdbc:mysql://IP:端口/super-jacoco?useUnicode=true&characterEncoding=utf8&verifyServerCertificate=false&useSSL=false
spring.datasource.username=super-jacoco的数据库账号
spring.datasource.password=super-jacoco的数据库密码
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#git username & password
gitlab.username=被测项目的的git账号
gitlab.password=被测项目的的git密码

编译super-jacoco开源项目

生成super-jacoco.jar

mvn package -Dmaven.test.skip=true

部署super-jacoco

  1. 进入super-jacoco项目,把 cli.jar 复制到用户主页
cd super-jacoco/jacoco
cp org.jacoco.cli-1.0.2-SNAPSHOT-nodeps.jar ~

image
image

  1. 把 runtime.jar 传送到被测项目服务器的 jar 包位置
scp org.jacoco.agent-0.8.5-runtime.jar root@被测项目服务器IP:/root/www/xxx/back/

image
image

  1. 启动super-jacoco
nohup java -jar super-jacoco.jar &

启动后的默认端口号为:8899

  1. super-jacoco服务器的防火墙规则自己设置

被测项目用 super-jacoco-runtime.jar 来启动

java -javaagent:/root/www/xxx/back/org.jacoco.agent-0.8.5-runtime.jar=includes=*,output=tcpserver,port=18513,address=*,append=true,destfile=/jacoco.exec -jar /root/www/xxx/back/springboot-0.0.1-SNAPSHOT.jar

附上 jacoco 启动参数

-executioindataonly: 仅生成执行数据,不生成报告。

-agentlib: 指定JaCoCo代理库,用于Java程序。

-agentpath: 指定JaCoCo代理库,用于C / C ++程序。

=destfile: 指定覆盖已有的执行数据文件的路径。

=append: 指定追加到现有执行数据文件的路径。

=includes: 指定哪些类的方法应包含在覆盖率分析中,使用逗号分隔。

=excludes: 指定哪些类的方法应排除在覆盖率分析之外,使用逗号分隔。

=classpath: 指定JaCoCo用于查找类文件的类路径。

=classpathfile: 指定包含类路径条目的文件。

=jmxfile: 指定JMX文件的路径,用于远程应用程序。

=output: 指定报告生成的目录。

=report-aggregate: 指定聚合报告的路径。

=dump-on-exit: 在JVM退出时转储执行数据。

使用覆盖率检测

全量代码覆盖率(type=1)

启动覆盖率检测(全量代码)

{
    "uuid": "准备一个不会重复的,没有使用过的 UUID",
    "type": 1(全量代码覆盖率),
    "gitUrl": "https://gitee.com/mua-mua/dorm_back.git",
    "subModule": "",  # 被测项目地址
    "baseVersion": "被测项目上一次代码的commitID、分支名称",
    "nowVersion": "被测项目目前代码的commitID、分支名称",
    "address": "被测项目地址",
    "port": "18513(被测项目的 super-jacoco-runtime.jar 的端口(按照上面的启动参数就是:18513))"
}

image

去被测项目进行测试,测试一段时间后,造成足够的代码覆盖

获取覆盖率收集(全量代码)

把启动覆盖率时的 UUID 拿来获取覆盖率

失败的场景

  1. 失败了也有日志文件
  2. 失败了的日志文件内容可能是空的,这种情况一般就是:下载项目代码后,编译失败了
    image

成功的场景

image

查看覆盖率报告(全量代码)

整个Java项目(全量代码)

image

Java实现类列表(全量代码)

image

Java实现类(全量代码)

image
image

覆盖分类(全量代码)

image

增量代码覆盖率(type=2)

启动覆盖率检测(增量代码)

{
    "uuid": "准备一个不会重复的,没有使用过的 UUID",
    "type": 2(增量代码覆盖率),
    "gitUrl": "https://gitee.com/mua-mua/dorm_back.git",
    "subModule": "",  # 被测项目地址
    "baseVersion": "被测项目上一次代码的commitID、分支名称",
    "nowVersion": "被测项目目前代码的commitID、分支名称",
    "address": "被测项目地址",
    "port": "18513(被测项目的 super-jacoco-runtime.jar 的端口(按照上面的启动参数就是:18513))"
}

image

去被测项目进行测试,测试一段时间后,造成足够的代码覆盖

获取覆盖率收集(增量代码)

把启动覆盖率时的 UUID 拿来获取覆盖率
image

查看覆盖率报告(增量代码)

整个Java项目(增量代码)

image

Java实现类列表(增量代码)

image

Java实现类(增量代码)

image
image
image

posted @ 2024-12-23 22:53  mua~mua~  阅读(205)  评论(0编辑  收藏  举报