jacoco代码覆盖率管理

jacoco-maven-plugin 中,覆盖率阈值可以设置为行覆盖率(Line Coverage)和分支覆盖率(Branch Coverage),甚至可以设置类、方法、指令等不同类型的覆盖率。可以通过 check 目标对每个类型的覆盖率进行精细化控制。

行覆盖率 vs. 分支覆盖率

  1. 行覆盖率 (Line Coverage):表示测试执行中,代码的每一行是否被执行。
  2. 分支覆盖率 (Branch Coverage):表示控制流语句(如 if-elseswitch)的所有分支是否被执行,包括 true 和 false 分支。

设置覆盖率阈值

jacoco-maven-plugin 提供了灵活的配置方式,可以针对不同类型的覆盖率(如行、分支、类等)设置阈值,并在代码未达到设定的覆盖率时使构建失败。

详细配置示例

下面是一个配置示例,包含行覆盖率和分支覆盖率的设置。

<build><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.10</version><executions><execution><id>prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>report</id><goals><goal>report</goal></goals></execution><execution><id>check</id><goals><goal>check</goal></goals><configuration><rules><!-- 定义规则:检测所有的包 --><rule><element>BUNDLE</element><limits><!-- 设置行覆盖率的最低阈值 --><limit><counter>LINE</counter><value>COVEREDRATIO</value><minimum>0.80</minimum> <!-- 行覆盖率最低要求 80% --></limit><!-- 设置分支覆盖率的最低阈值 --><limit><counter>BRANCH</counter><value>COVEREDRATIO</value><minimum>0.75</minimum> <!-- 分支覆盖率最低要求 75% --></limit></limits></rule></rules></configuration></execution></executions></plugin></plugins>
</build>

解释:

    • LINE:代表行覆盖率,即代码每一行的覆盖情况。
    • BRANCH:代表分支覆盖率,即条件语句的分支覆盖情况。
    • COVEREDRATIO:表示覆盖率的比例(即已覆盖/总量)。
    • 用于设定最低覆盖率的阈值,如果覆盖率低于这个值,则构建失败。

其他覆盖率类型

除了行覆盖率和分支覆盖率,jacoco-maven-plugin 还允许针对其他指标设置阈值,例如:

  • INSTRUCTION:指令覆盖率(字节码指令)。
  • COMPLEXITY:代码复杂度覆盖率。
  • METHOD:方法覆盖率。
  • CLASS:类覆盖率。

示例:

<limits><limit><counter>METHOD</counter><value>COVEREDRATIO</value><minimum>0.85</minimum> <!-- 方法覆盖率最低要求 85% --></limit><limit><counter>CLASS</counter><value>COVEREDRATIO</value><minimum>0.90</minimum> <!-- 类覆盖率最低要求 90% --></limit>
</limits>

完整配置示例(行、分支、类、方法覆盖率)

<build><plugins><plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.8.10</version><executions><execution><id>prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>report</id><goals><goal>report</goal></goals></execution><execution><id>check</id><goals><goal>check</goal></goals><configuration><rules><!-- 规则1:检测所有的包 --><rule><element>BUNDLE</element><limits><!-- 行覆盖率最低要求 80% --><limit><counter>LINE</counter><value>COVEREDRATIO</value><minimum>0.80</minimum></limit><!-- 分支覆盖率最低要求 75% --><limit><counter>BRANCH</counter><value>COVEREDRATIO</value><minimum>0.75</minimum></limit><!-- 方法覆盖率最低要求 85% --><limit><counter>METHOD</counter><value>COVEREDRATIO</value><minimum>0.85</minimum></limit><!-- 类覆盖率最低要求 90% --><limit><counter>CLASS</counter><value>COVEREDRATIO</value><minimum>0.90</minimum></limit></limits></rule></rules></configuration></execution></executions></plugin></plugins>
</build>

使用技巧和最佳实践

  1. 动态调整阈值:根据项目的不同阶段和实际需要,可以动态调整不同的覆盖率阈值。例如,在早期项目中可能会设定较低的覆盖率要求(如 50%),随着项目的成熟再提高到 80% 或更高。

  2. 逐步提升覆盖率:如果项目初期覆盖率不高,可以逐步提升覆盖率标准,使用工具如 SonarQube 或 CI 系统来监控覆盖率的提升过程。

  3. 排除不必要的类:对于一些生成的代码或第三方库,可以通过 excludes 将它们排除在覆盖率统计之外,确保报告准确反映实际开发代码的覆盖情况。


总结

  1. 设置覆盖率阈值jacoco-maven-plugin 提供了灵活的覆盖率阈值配置,支持行覆盖率和分支覆盖率的设置。通过 check 目标可以根据项目需求定义最低标准,确保代码质量。
  2. 详细配置:行覆盖率、分支覆盖率、方法覆盖率、类覆盖率等指标都可以单独设定阈值,灵活控制构建流程中的覆盖率标准。
  3. 实践应用:通过逐步提升覆盖率阈值,结合 CI/CD 工具进行自动化检测,可以有效保证代码的质量和可测试性。

通过这些配置和实践建议,你可以轻松配置和使用 Jacoco 进行全面的代码覆盖率管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146055.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

spark之不同序列化对比

一&#xff0c;spark的rdd的序列话不同介绍 下面是使用不同序列化后的占用资源和数据大小 2&#xff0c;sparksql中序列化的区别 sparksql中使用序列化和不使用差别不大&#xff0c;英文sparksql中默认使用了encode自己实现的序列化方法&#xff0c;加上与不加序列化差别不大…

C++ day03

思维导图 头文件 #ifndef SEQLIST_H #define SEQLIST_Husing datatype int;class seqlist { private:datatype *ptr; // 动态数组指针int size; // 顺序表最大容量int len 0; // 当前长度public:void init(int n); // 初始化顺序表bool empty(); …

RflySim工具链常见问题答疑

1. RflySim结合硬件能不能实现无人机颜色巡线呢&#xff1f; 可以&#xff0c;内置有一个通过相机识别来攻击小球的实验&#xff0c;可见&#xff1a;【RflySim安装路径】\RflySimAPIs\8.RflySimVision\1.BasicExps\1-VisionCtrlDemos\e3_ShootBall&#xff0c;不过要想实现无人…

elasticsearch同步mysql方案

文章目录 1、1. 使用数据库触发器2. 使用定时任务3. 监听MySQL二进制日志&#xff08;binlog&#xff09;4. 使用数据管道5. 使用第三方工具或服务6. 编写自定义脚本注意事项 2、1. 使用Logstash步骤&#xff1a;示例配置&#xff1a; 2. 使用Debezium步骤&#xff1a; 3. 自定…

ES6标准---【九】【学习ES6标准看这一篇就够了!!!】

目录 以往ES6文章 JavaScript在浏览器中的加载 传统方法 加载规则 注意 顶部变量外部不可用 this关键字返回undefined JavaScript的循环加载 ES6模块的循环加载 块级作用域 let取代var 全局变量和线程安全 以往ES6文章 ES6标准---【一】【学习ES6看这一篇就够了&…

小小扑克牌算法

1.定义一个扑克牌类Card&#xff1a; package democard; public class Card {public String suit;//表示花色public int rank;//表示牌点数Overridepublic String toString() {return "{"suit rank"}";}//实例方法&#xff0c;初始化牌的点数和花色public…

【Redis入门到精通三】Redis核心数据类型(List,Set)详解

目录 Redis数据类型 ​编辑 1.List类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 2.Set类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 Redis数据类型 查阅Redis官方文档可知&#xff0c;Redis提供给用户的核…

【类型黑市】指针

大家好我是#Y清墨&#xff0c;今天我要介绍的是指针。 意义 指针就是存放内存地址的变量。 分类 因为变量本身是分类型的&#xff0c;我们学过的变量类型有 int, long long, char, double, string, 甚至还有结构体变量。 同样&#xff0c;指针也分类型&#xff0c;如果指针指向…

完美转发、C++11中与线程相关的std::ref

目录 模板中的万能引用 std::forward实现完美转发 C11中与线程相关的std::ref 线程函数参数 用函数指针作为线程函数 用lambda表达式作为线程函数 模板中的万能引用 void Func(int& x) {cout << "左值引用" << endl; } void Func(int&&am…

3. Internet 协议的安全性

3. Internet 协议的安全性 (1) 常用网络协议的功能、使用的端口及安全性 HTTP协议 功能:用于从服务器传输超文本到本地浏览器。端口:默认是80端口。安全性:不提供数据加密,存在数据泄露和中间人攻击风险。使用HTTPS协议(443端口)可以增强安全性。FTP协议 功能:实现文件的…

IPv6(四)

文章目录 Path MTUIPv6配置 Path MTU IPv4 对于数据过大的数据包会执行切片操作&#xff0c;但是切片有可能会造成设备性能的降低 IPv6使用Path MTU来传递数据过大的数据包 依次会协商最小的 MTU 单元为了减少中间转发设备的压力&#xff0c;中间转发设备不对 IPv6 报文进行分片…

re题(36)BUUCTF-[WUSTCTF2020]Cr0ssfun

BUUCTF在线评测 (buuoj.cn) 查一下壳&#xff0c;64位elf文件 ctrle找到main()函数 只进行了一个比较函数&#xff0c;看一下check() 猜测是a1中存放的flag&#xff0c;往下继续查看函数 把a1中存的数据都给出来了 写个脚本&#xff0c;输出一下a1&#xff0c;直接就是我们要的…

Python 找到给定点集的简单闭合路径(Find Simple Closed Path for a given set of points)

给定一组点&#xff0c;将这些点连接起来而不相交 例子&#xff1a; 输入&#xff1a;points[] {(0, 3), (1, 1), (2, 2), (4, 4), (0, 0), (1, 2), (3, 1}, {3, 3}}; 输出&#xff1a;按以下顺序连接点将 不造成任何交叉 {(0, 0), (3, …

CSS - 通用左边图片,右边内容,并且控制长度溢出处理模板(vue | uniapp | 微信小程序)

前言 通用模板&#xff0c;可适用于任意前端项目。 如下图所示&#xff0c;手机电脑通用。 示例代码 根据自己的需求修改即可。 <body><div class"container"><!-- 头像图片 --><img class"avatar" src"https://cdn.uviewui.com…

OpenSSH从7.4升级到9.8的过程 亲测--图文详解

一、下载软件 下载openssh 下载地址&#xff1a; Downloads | Library 下载openssl Index of /pub/OpenBSD/OpenSSH/ zlib Home Site 安装的 openssl-3.3.1.tar.gz ,安装3.3.2有问题 安装有问题&#xff0c; 二、安装依赖 yum install -y perl-CPAN perl-ExtUtils-CB…

手动部署并测试内网穿透

文章目录 手动部署并测试内网穿透1、原理2、下载 frp 文件3、配置对应的配置文件4、启动 frp 服务5、效果 手动部署并测试内网穿透 1、原理 原理就是让你需要访问的内网可以被其他内网访问到。 其实就是让内网经过一个公网服务器的转发&#xff0c;使得能够被访问。 这里我们需…

【Python报错已解决】ModuleNotFoundError: No module named ‘tensorflow‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

物联网开发+充电桩管理系统+充电桩系统源码

简述 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充…

半导体器件制造5G智能工厂数字孪生物联平台,推进制造业数字化转型

半导体器件制造行业作为高科技领域的核心驱动力&#xff0c;正积极探索和实践以5G智能工厂数字孪生平台为核心的新型制造模式。这一创新不仅极大地提升了生产效率与质量&#xff0c;更为制造业的未来发展绘制了一幅智能化、网络化的宏伟蓝图。 在半导体器件制造5G智能工厂中&a…

每天五分钟计算机视觉:将人脸识别问题转换为二分类问题

本文重点 在前面的课程中,我们学习了两种人脸识别的网络模型,这两种人脸识别网络不能算是基于距离或者Triplet loss等等完成的神经网络参数的学习。我们比较熟悉的是分类任务,那么人脸识别是否可以转变为分类任务呢? 本节课程我们将介绍一种全新的方法来学习神经网络的参…