使用 JaCoCo 生成测试覆盖率报告
0、为什么要生成测试覆盖率报告
在我们实际的工作中,当完成程序的开发后,需要提交给测试人员进行测试,经过测试人员测试后,代码才能上线到生产环境。
有个问题是:怎么能证明程序得到了充分的测试,程序中所有代码都被走到了。当然,代码覆盖率只能作为测试后的一个参照,如果最开始的需求都理解错了,那么再高的代码覆盖率,都失去了意义。
那么这时就需要引入代码覆盖率这个东东了,要统计 C++ 的代码覆盖率有 GCover,统计 Java 的代码覆盖率则有 JaCoCo 可以实现。
JaCoCo 是一个免费的Java代码覆盖率检测工具,可以统计到测试对以下内容的覆盖情况:
- 指令覆盖率
- 分支覆盖率
- 圈复杂度覆盖
- 行覆盖
- 方法覆盖
- 类覆盖
对各种覆盖率的具体含义可以参考官方文档:https://www.jacoco.org/jacoco/trunk/doc/counters.html
使用 JaCoCo 生成覆盖率时,可以使用 on-the-fly 方式,对程序的原代码是无侵入式的,只是在启动 jar 包时,增加一个参数就行,可确保测试人员测试的代码,和上线到生产环境的代码一致。
1、创建测试类并打包成服务
为了简单起见,这里直接基于 springboot 创建被测试的类,使用了 RequestMapping 注解。
package com.test.JacocoTest.controler;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping
public class Athytics {@GetMapping("/+/{a}/{b}")public int add(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){int result = 0;if(param1 < 0 || param1 > 1000){result = b - param1;}else{result = param1 + b - 1000;}return result;}@GetMapping("/-/{a}/{b}")public int minus(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return param1 - b;}@GetMapping("/*/{a}/{b}")public int multiply(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return param1 * b;}@GetMapping("///{a}/{b}")public int divide(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return param1 / b;}@GetMapping("/c/{a}/{b}")public String power(@PathVariable("a") Integer param1, @PathVariable("b") Integer b){return String.valueOf(Math.round(Math.pow(param1, b)-1));}@GetMapping("/abs/{a}")public String abs(@PathVariable("a") Integer param1){return String.valueOf(Math.round(Math.abs(param1)));}
}
创建 SpringBoot 的启动类:
package com.test.JacocoTest;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class JacocoTestApplication {public static void main(String[] args) {SpringApplication.run(JacocoTestApplication.class, args);}
}
代码结构非常简单

2、启动 JaCoCo
2.1 下载 JaCoCo 工具包
可以进入到官方页面下载 https://search.maven.org/search?q=g:org.jacoco
下载其中需要用到的两个包即可

Jacoco 工具包及被测试包如下

2.2 启动被测服务,并在启动语句中添加 JaCoCo
指定需要检查测试对代码覆盖情况的包名,采集Jacoco覆盖率文件的ip及端口
java -javaagent:jacocoagent.jar=includes=com.test.*,output=tcpserver,port=6301,address=localhost,append=false -jar JacocoTest-1.0-SNAPSHOT.jar
3、执行测试用例
因为是使用的 Springboot 开发框架,可以直接打开浏览器进行测试。
输入如下URL: http://localhost:9999/+/12/25

4、生成 dump,并重置覆盖率统计
指定要从何处获取jacoco统计数据,地址及端口应与 2.2 中的启动参数中一致
java -jar jacococli.jar dump --address localhost --port 6301 --destfile jacoco.exec --reset
参数说明:
--reset 生成覆盖率数据后,重置之前的统计,想要重新获取统计数据,需要删除之前生成的exec文件
--address 运行jacocoagent.jar的主机IP
--port 运行jacocoagent.jar的主机监控端口
执行后,将在目录下生成指令中指定的 exec 文件 jacoco.exec
5、生成覆盖率报告
想要生成报告,需要同时指定源文件及编译后的字节码文件。
指定类文件及源代码路径,并生成格式为 html 的报告样式。
java -jar jacococli.jar report jacoco.exec --classfiles D:\Spring\JacocoTest\target\classes --sourcefiles D:\Spring\JacocoTest\src\main\java --html log

点击目录下的 index.html 将打开覆盖率信息

进入到测试类中,可以看到各方法的覆盖情况

进入到方法中,可以看到代码的覆盖情况。

绿色是完全覆盖,红色是未覆盖,黄色是部分覆盖。
想要获取全新覆盖率数据,需要删除步骤3中生成的 exec 文件,否则是累计覆盖率。
6 使用帮助
jacococli.jar 使用帮助
Usage: java -jar jacococli.jar report [] [--encoding ] [--help] [--html
] [--name ] [--quiet] [--sourcefiles ] [--tabwith ] [--xml ]
: list of JaCoCo *.exec files to read
--classfiles : location of Java class files
--csv : output file for the CSV report
--encoding : source file encoding (by default platform encoding is
used)
--help : show help
--html
--name : name used for this report
--quiet : suppress all output on stdout
--sourcefiles : location of the source files
--tabwith : tab stop width for the source pages (default 4)
--xml : output file for the XML report
相关文章:
使用 JaCoCo 生成测试覆盖率报告
0、为什么要生成测试覆盖率报告 在我们实际的工作中,当完成程序的开发后,需要提交给测试人员进行测试,经过测试人员测试后,代码才能上线到生产环境。 有个问题是:怎么能证明程序得到了充分的测试,程序中所…...
windows下neo4j安装及配置,并绘制人物关系图谱
neo4j安装及配置,绘制人物关系图谱 先升级pip,安装py2neo pip install py2neo2021.0.1依赖 jdk1.8, neo4j 3.xx; 或者jdk18,neo4j 4.x,5.x; 官网下载了neo4j4.x,5.x 因为jdk版本原因都不行&am…...
【Spring6】IoC容器之基于XML管理Bean
3、容器:IoC IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容…...
Warshall算法求传递闭包及Python编程的实现
弗洛伊德算法-Floyd(Floyd-Warshall)-求多源最短路径,求传递闭包 Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法, 与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大…...
AcWing第 93 场周赛
4867. 整除数 给定两个整数 n,k,请你找到大于 n 且能被 k 整除的最小整数 x。 输入格式 共一行,包含两个整数 n,k。 输出格式 输出大于 n 且能被 k 整除的最小整数 x。 数据范围 前 4 个测试点满足 1≤n,k≤100。 所有测试点满足 1≤n,k≤109。 …...
计及需求响应的粒子群算法求解风能、光伏、柴油机、储能容量优化配置(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
利用Nginx给RStudio-Server配置https
前篇文档,我这边写了安装RStudio-Server的方法。默认是http的访问方式,现在我们需要将其改成https的访问方式。 1、给服务器安装Nginx:参照之前的安装Nginx的方法。 2、创建/usr/local/nginx/ssl目录: mkdir /usr/local/nginx/ss…...
YOLOv7实验记录
这篇博客主要记录博主在做YOLOv7模型训练与测试过程中遇到的一些问题。 首先我们需要明确YOLO模型权重文件与模型文件的使用 其实在github的readme中已经告诉我们使用方法,但我相信有很多像博主一样眼高手低的人可能会犯类似的错误。 训练 首先是训练时的设置&…...
用Python获取史瓦西时空中克氏符的分量
文章目录三维球面坐标史瓦西时空三维球面坐标 Einsteinpy中提供了克氏符模型,可通过ChristoffelSymbols获取。简单起见,先以最直观的三维球面为例,来用Einsteinpy查看其克氏符的表达形式。 三维球面的度规张量可表示为 g001g11r2g22r2sin…...
QML编码约定
QML中的国际化: QML使用以下函数来将字符串标记为可翻译的 qsTr()qsTranslate()qsTrld()QT_TR_NOOP()QT_TRANSLATE_NOOP()QT_TRID_NOOP最常用的还是qsTr() string qsTr(string sourceText, string disambiguation&…...
【Linux】安装Linux操作系统具体步骤
1). 选择创建新的虚拟机 2). 选择"典型"配置 3). 选择"稍后安装操作系统(S)" 4). 选择"Linux"操作系统,"CentOS7 64位"版本 5). 设置虚拟机的名称及系统文件存放路径 6). 设置磁盘容量 7). 自定义硬件信息 8). 启动上述创建的新虚拟机…...
前端ES6异步编程技术——Promise使用
Promise是什么 官方的定义是:Promise是ES6新推出的用于进行异步编程的解决方案,旧方案是单纯使用回调函数来解决的。对于开发人员来说,我们把promise当作一个普通的对象即可,使用它可以用来封装一个异步操作并可以获取其成功/失败…...
Kotlin实现简单的学生信息管理系统
文章目录一、实验内容二、实验步骤1、页面布局2、数据库3、登录活动4、增删改查三、运行演示四、实验总结五、源码下载一、实验内容 根据Android数据存储的内容,综合应用SharedPreferences和SQLite数据库实现一个用户信息管理系统,强化对SharedPreferen…...
413. 等差数列划分
413. 等差数列划分 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数…...
设计模式七大原则
一、设计模式概念 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1977年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫亚历山大(Christopher Alexander&#x…...
【Mybatis系列】Mybatis常见的分页方法以及源码理解
Mybatis-Plus的selectPage 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>添加分页插件 Configuration public class My…...
Java面向对象:多态特性的学习
本文介绍了Java面向对象多态特性, 多态的介绍. 多态的实现条件–1.发生继承.2.发生重写(重写与重载的区别)3.向上转型与向下转型.4.静态绑定和动态绑定5. 实现多态 举例总结多态的优缺点 避免在构造方法内调用被重写的方法… Java面向对象:多态特性的学习一.什么是多态?二.多态…...
id函数 / 可变类型变量 / 不可变类型变量 / +=操作
前言 再说正文之前,需要大家先了解一下对象,指针和引用的含义,不懂得同学可以参考我上一篇博客“(12条消息) 引用是否有地址的讨论的_xx_xjm的博客-CSDN博客” 正文 一:python中一切皆对象 “python中一切皆对象”这句话我相信…...
aws apigateway 使用apigateway集成lambda
参考资料 代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html非代理集成,https://docs.aws.amazon.com/zh_cn/apigateway/latest/developerguide/getting-started-…...
Linux SPI 驱动实验
目录 一、Linux 下 SPI 驱动框架简介 1、SPI 主机驱动 2、SPI 设备驱动 SPI 设备数据收发处理流程 3、SPI 设备和驱动匹配过程 二、添加SPI 设备信息 1、添加 ICM20608 所使用的 IO 2、 在 ecspi3 节点追加 icm20608 子节点 三、编写 ICM20608 驱动 1、修改makefile…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
用递归算法解锁「子集」问题 —— LeetCode 78题解析
文章目录 一、题目介绍二、递归思路详解:从决策树开始理解三、解法一:二叉决策树 DFS四、解法二:组合式回溯写法(推荐)五、解法对比 递归算法是编程中一种非常强大且常见的思想,它能够优雅地解决很多复杂的…...
