SpringBoot接入JaCoCo实践

总述

SpingBoot可以通过2种方式接入JaCoCo:
Maven和Agent。Maven方式是静态接入,在编译时计算代码覆盖率。Agent方式是动态接入,服务启起来以后,能实时根据代码命中情况计算代码覆盖率。
jacoco 支持四种工作模式
1、file:进程结束的时候在本地生成文件
2、tcpserver:开启端口等待客户端获取覆盖率
3、tcpclient:主动把覆盖率数据发送出去
4、none:不生成覆盖率

1、agent-file方式(报告只能获取一次,需要停止应用服务,才可获取最新报告)

1、下载jacoco
2、打包springboot项目,生成jar包:mvn package
3、以命令行方式带agent启动springboot
java -javaagent:D:\02QaTools\jacoco-0.8.8\lib\jacocoagent.jar -jar .\target\spring3-0.0.1-SNAPSHOT.jar
4、执行测试
5、生成报告

java -jar D:\02QaTools\jacoco-0.8.8\lib\jacococli.jar report .\jacoco.exec --classfiles .\target\classes\  --sourcefiles .\src\main\java\ --html ./report

缺点:只能生成一次,需要停止应用,重启后才可再次生成新的报告

2、agent-tcpserver模式(不需要停止应用服务,即可再次生成并获取最新报告)

2.1启动jacoco agent进行插桩

2.1.1 编译代码,生成jar包
	mvn package
2.1.2 使用agent 启动应用
java -javaagent:D:\02QaTools\jacoco-0.8.8\lib\jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=10.201.1.29,append=true -jar ./target\spring3-0.0.1-SNAPSHOT.jar

关键参数说明:
-javaagent:C:\工具\jacoco-0.8.6\lib\jacocoagent.jar=includes=*,这个参数就是启用jacoco代理参数,其中C:\工具\jacoco-0.8.6\lib\jacocoagent.jar就是之前下载jacoco解压后的jacocoagent.jar的绝对路径,includes表示对要插桩的包进行过滤,代表所有的class都要进行插桩,也可以根据情况进行过滤,如includes=com.mycompany.

output=tcpserver,这里不需要改动,表示以TCP Server方式启动应用并插桩
port=6300,Jacoco开启的TCP Server的端口,不能被占用
address=localhost,对外开放的地址,也可以指定IP地址
demo-0.0.1-SNAPSHOT.jar,就是示例代码构建后target目录生成的jar包,需要根据实际情况更新

特别提醒:为了对比实时统计代码覆盖率的效果,此时请先不要请求上面提到的任何一个URL,切记!

2.2 获取报告

2.2.1 dump生成覆盖率文件 .exec(java命令调用)

保持服务启动,再打开一个cmd窗口同样cd到target目录,执行如下命令从上一步开启的TCP Server中dump出覆盖率文件

java -jar C:\工具\jacoco-0.8.6\lib\jacococli.jar dump --address localhost --port 6300 --destfile ./jacoco_tcp_01.exec

参数说明:

  1. –destfile ./jacoco_tcp.exec,其中./jacoco_tcp.exec为生成exec文件名,表示在当前目录生成
  2. 其他参数和上一步类似,不再特别说明,注意需要更新jacococli.jar的绝对路径
  3. 执行成功后,会在target目录生成相应的.exec文件
2.2.2 分析exec文件生成html报告(java命令调用)

dump命令生成的.exec文件为二进制文件,需要进行解析,以生成html报告为例,执行如下的命令分别将两个.exec文件解析成html报告

java -jar D:\02QaTools\jacoco-0.8.8\lib\jacococli.jar report ./jacoco_tcp_01.exec --classfiles .\classes --sourcefiles ..\src\main\java --html report01
java -jar D:\02QaTools\jacoco-0.8.8\lib\jacococli.jar report .\jacoco_tcp_02.exec --classfiles .\target\classes\ --sourcefiles .\src\main\java --html
report02
  1. ./jacoco_tcp_01.exec,表示要解析的exec文件的相对路径
  2. –classfiles .\classes,需要指定生成的classes文件目录
  3. –sourcefiles …\src\main\java,需要指定源码的文件目录
2.2.3 分别获取2次报告,并对比,查看jacoco report的动态实时性
  1. 首次dump:此时系统未进行测试,覆盖率为0
  2. 访问页面,执行手工测试
  3. 第2次dump:已进行部分测试,覆盖率非0
2.2.4 结果对比,验证jacoco报告的实时性

分别打开2个报告目录下的index.html文件,查看覆盖率结果
1、第1次的报告
在这里插入图片描述

2、第2次的报告
在这里插入图片描述

可通过定时执行,动态获取实时报告

2.3 使用ant命令生成exec文件和report

2.3.1 Ant环境变量配置
我的电脑----属性-----高级----环境变量    如:ANT_HOME:C:\apache-ant-1.8.1    PATH:%ANT_HOME%\bin (为了方便在dos环境下操作)
实验了总是失败,没办法换成地址 C:/ apache-ant-1.8.1/bin,而不再使用变量。。。成功了。。 
2.3.2 验证ant安装成功

为了验证ant是否成功安装,可以进行如下操作:
依次选择:开始->运行->cmd,输入如下命令:ant
如果出现如下内容,说明安装成功:

Buildfile: build.xml does not exist!
Build failed
2.3.3 ant 方式获取jacoco报告
  1. 配置ant命令:在ant\bin目录下新建build.xml文件,配置build.xml中相关信息为自己PC上的所属路径,附件如下:

  2. 启动jacoco agent进行插桩

java -javaagent:D:\02QaTools\jacoco-0.8.8\lib\jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1 -jar G:\00 workspace\00 Test\spr
ing3\target\spring3-0.0.1-SNAPSHOT.jar
  1. 执行dump:
    进入ant\bin目录:执行ant dump,生成数据收集文件,exec
如:D:\02QaTools\apache-ant-1.9.16\bin> ant dump

4、获取报告report

D:\02QaTools\apache-ant-1.9.16\bin> ant report

2.4 将多份覆盖率报告合并-merge

2.4.1 合并多个exec文件, 生成merge .exec,并配置ant merge 命令
   <property name="jacocomergeexecPath" value="D:\02QaTools\jacocoReport\target\jacoconew.exec"/>
<!--merge 命令配置-->
<target name="merge">
        <jacoco:merge destfile="${jacocomergeexecPath}">
            <fileset dir="D:\02QaTools\jacocoReport\target" includes="*.exec"/>
        </jacoco:merge>
    </target>
2.4.2 生成merge report,通过merge exec文件
<!--生成覆盖率merge报告的路径-->
  <property name="mergereportfolderPath" value="D:\02QaTools\jacocoReport\reportmerge"/>
  
<!--配置ant report_mereg 命令,生成聚合报告-->
  <target name="report_mereg">
        <jacoco:report>
            <executiondata>
                <file file="${jacocomergeexecPath}"/>
            </executiondata>

           <structure name="JaCoCo Report2">
              <group name="Launch related">   
             <!--此处配置classes文件地址 -->        
                  <classfiles>
                      <fileset dir="${webClasspath}" />
                  </classfiles>
                  <!--此处配置源码地址-->
                    <sourcefiles encoding="gbk">
                      <fileset dir="${webSrcpath}" />
                  </sourcefiles>
              </group>

          </structure>
            <!-- report文件保存地址 -->
            <html destdir="${mergereportfolderPath}"   encoding="utf-8"/>
        </jacoco:report>
    </target>

4、spring 多模块报告(待续)
5、jacoco 单元测试(待续)

参考链接:

  1. 只懂黑盒测试也能学会的代码覆盖率及精准化测试:https://xie.infoq.cn/article/5fda6c72b54134777e3edf4b9
  2. ant 详解:https://blog.csdn.net/qq997404392/article/details/76986978
  3. 命令行方式启动springboot:https://wuyaogexing.com/70/524742.html
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 和 Jacoco 是两个独立但常一起使用的工具。Spring Boot 是一个用于简化新Spring应用初始搭建以及开发过程的框架,而 Jacoco 是一个 Java 动态代码覆盖率工具,用于测量源代码的执行覆盖率。 在 Spring Boot 项目中使用 Jacoco 配置,你可以执行单元测试和集成测试的同时收集代码覆盖率数据。以下是基本的步骤: 1. 添加依赖:首先,在你的 `pom.xml` 或 `build.gradle` 文件中添加 Jacoco 和相关插件的依赖。例如,如果你使用 Maven,可以添加: ```xml <dependency> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> </dependency> ``` 如果是 Gradle,添加: ```groovy implementation 'org.jacoco:org.jacoco.core:0.8.7' testImplementation 'org.jacoco:org.jacoco.junit:junit-platform-engine:0.8.7' testRuntimeOnly 'org.jacoco:org.jacoco.report:0.8.7' ``` 2. 配置 JaCoCo:在 `application.properties` 或者 `application.yml` 中,添加JaCoCo的配置。例如: ```properties spring.factories= org.springframework.boot.test.web.client.TestRestTemplate=org.springframework.boot.test.web.client.MockRestTemplateFactory org.springframework.boot.test.web.client.ResourceExtractor=org.springframework.boot.test.web.client.TestResourceExtractor org.springframework.boot.test.web.server.LocalServerPort@0=org.springframework.boot.test.web.server.LocalServerPort@8080 org.springframework.boot.test.system.captured.output.CapturedOutputReporter=@org.springframework.boot.test.system.captured.output.CapturedOutputReporter@ org.springframework.boot.test.system.junit.platform.CapturedOutputListener=@org.springframework.boot.test.system.junit.platform.CapturedOutputListener@ reporting: output: file details: true html: true ``` 这里配置了输出覆盖报告的方式(文件和HTML),并将日志输出捕获到报告中。 3. 配置测试:确保你的测试类使用了 `@SpringBootTest` 或 `@RunWith(SpringRunner.class)` 并且包含 `@TestExecutionListeners` 注解,指定包含 JaCoCo 的监听器。 4. 执行测试并生成报告:运行测试后,Maven 或 Gradle 将自动生成 JaCoCo 报告,通常会在 `target` 目录下。 相关问题-- 1. 如何在Spring Boot中集成JaCoCo? 2. Jacoco报告在哪里查看? 3. 使用JaCoCo时如何配置测试类?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值