Spring Boot框架下的单元测试
1. 什么是单元测试
1.1 基本定义
- 单元测试(Unit Test) 是对软件开发中最小可测单位(例如一个方法或者一个类)进行验证的一种测试方式。
- 在 Java 后端的 Spring Boot 项目中,单元测试通常会借助 JUnit、Mockito 等框架对代码中核心逻辑进行快速且隔离的验证,保证功能正确性。
目的:及早发现并修复 BUG,使后续迭代功能或重构时能迅速验证不会破坏已实现的功能。
1.2 单元测试在 Spring Boot 中的地位
- Spring Boot 提供了非常方便的测试支持,如
@SpringBootTest
、@TestConfiguration
等注解,让开发者可以快速地在带有 Spring 容器上下文的环境中执行测试。 - Spring Boot 本身也对 JUnit、Mockito、AssertJ 等常用测试框架或库提供了开箱即用的整合或依赖。
1.3 单元测试与其他测试的区别
- 单元测试:聚焦在一个方法或者一个类层面,不涉及过多外部依赖,能极快地发现逻辑错误。
- 集成测试:多个模块或组件交互时的测试,通常依赖真实数据库、消息队列等外部资源。
- 端到端测试(E2E):关注的是整个系统的完整流程,包括前端、后端、数据库、外部接口等。
- 在 Spring Boot 环境中,可以使用
@SpringBootTest
搭配 Mock 或者内存数据库来实现集成测试,但这通常已经不只是“单元”级别了。
2. 为什么要写单元测试?
- 快速发现 Bug:写完代码马上测,不用等到上线才被发现问题。
- 减少回归成本:以后代码改动或升级,只要一键跑测试,就能知道改动有没有影响其他功能。
- 保证代码质量:养成单元测试的习惯,会促使你把代码设计得更简洁和更容易测试。
简单说:花小时间写单元测试,能为你省下大时间修 Bug。
3. 环境准备
3.1 依赖
在一个常规的 Spring Boot 项目中,只要在 pom.xml
(Maven)或 build.gradle
(Gradle) 里加上:
<!-- 如果是 Maven -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>
- JUnit 5:最常用的Java测试框架(写
@Test
方法) - Mockito:常用的“模拟”库(用来Mock其他依赖)
- AssertJ / Hamcrest:更好用的断言库
- Spring Test / Spring Boot Test:Spring官方提供的测试辅助
这也就够了,一般不需要额外安装别的。
3.2 项目结构
Spring Boot常见的目录结构(Maven示例):
src├─ main│ └─ java│ └─ com.example.demo│ ├─ DemoApplication.java│ └─ service│ └─ MyService.java└─ test└─ java└─ com.example.demo├─ DemoApplicationTests.java└─ service└─ MyServiceTest.java
src/main/java
放你的业务代码。src/test/java
放你的测试代码。- 通常测试类的包路径要和被测类一致,这样在IDE里能很快对上号,也方便管理。
4. 最最简单的单元测试示例(不依赖Spring)
先从“纯JUnit”说起,最简单的情况就是:
- 我有一个普通的工具类/方法
- 我就想测试它的输入输出对不对
- 不用装载Spring,也不用什么复杂注解
代码示例
假设我们有一个简单的工具类:
public class MathUtil {public static int add(int a, int b) {return a + b;}
}
那我们写一个测试类(路径:src/test/java/.../MathUtilTest.java
):
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;public class MathUtilTest {@Testvoid testAdd() {int result = MathUtil.add(2, 3);Assertions.assertEquals(5, result, "2 + 3 应该等于 5");}
}
@Test
表示这是一个测试方法。Assertions.assertEquals(期望值, 实际值, "提示信息")
用来断言。- 如果断言不通过,测试就失败;通过则测试成功。
运行方法:
- 在 IDE(如 IntelliJ/ Eclipse)里,右键这个
MathUtilTest
类 -> Run 'MathUtilTest' - 或者在命令行里运行
mvn test
(Maven) /gradle test
(Gradle)。
这就是最最基础的单元测试。
5. 在 Spring Boot 里测试 - Service层
当你要测试一个 Service(业务逻辑类) 时,它可能依赖其他Bean(例如 Repository、Dao 等)或者需要 Autowired。在 Spring Boot 里,有两种主要方法:
方法1:纯Mock(不启动Spring Context)
适合只想测试这个Service逻辑本身,不需要真的连数据库,也不需要整个Spring环境。速度最快。
- 用 Mockito 来创建一个假的(Mock)依赖。
- 注入到要测的Service里,这样你可以控制依赖的行为。
示例
UserRepository.java (假设它是个接口,用来访问数据库):
public interface UserRepository {User findByName(String name);// ... 其他方法
}
UserService.java (我们要测这个类):
public class UserService {private UserRepository userRepository;// 通过构造注入依赖public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public String getUserNickname(String name) {User user = userRepository.findByName(name);if (user == null) {return "UNKNOWN";}return user.getNickname();}
}
UserServiceTest.java (测试类,不依赖 Spring):
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
import org.mockito.Mockito;
import org.mockito.Mock;
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;@ExtendWith(MockitoExtension.class) // JUnit5 启用Mockito
public class UserServiceTest {@Mockprivate UserRepository userRepository; // Mock出来的依赖@InjectMocksprivate UserService userService; // 要测试的对象,会把上面这个Mock自动注入进来@Testvoid testGetUserNickname_found() {// 1. 假设我们模拟一个“数据库中查到的用户”:User mockUser = new User();mockUser.setName("alice");mockUser.setNickname("AliceWonder");// 2. 定义假数据的返回行为Mockito.when(userRepository.findByName("alice")).thenReturn(mockUser);// 3. 调用被测方法String nickname = userService.getUserNickname("alice");// 4. 断言结果Assertions.assertEquals("AliceWonder", nickname);}@Testvoid testGetUserNickname_notFound() {// 没有设置when,则默认返回nullString nickname = userService.getUserNickname("bob");Assertions.assertEquals("UNKNOWN", nickname);}
}
- 使用了
@Mock
注解声明要模拟的依赖userRepository
。 - 使用了
@InjectMocks
注解告诉 Mockito,要把所有标记@Mock
的对象注入进UserService
。 - 这样就能让
UserService
这个对象在执行时使用模拟过的userRepository
而不访问真实数据库。 - 然后通过
Mockito.when(...)
来定义依赖方法的返回值,用于测试用例的前提条件设置。 - 通过
Assertions
来验证执行结果是否符合预期。
这样就只测 UserService
的逻辑,不会真的访问数据库,也不需要启动Spring,执行很快。
方法2:使用 @SpringBootTest
(集成上下文)
适合你想在测试时使用Spring管理Bean,比如自动注入
@Autowired
,或想测试和别的Bean的连接配置是否正常。
- 在测试类上加
@SpringBootTest
。 - 这样Spring容器会启动,你也能
@Autowired
你的Service或者别的Bean。
示例
UserService.java (类似前面,只不过换成了 Spring注入):
@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public String getUserNickname(String name) {User user = userRepository.findByName(name);if (user == null) {return "UNKNOWN";}return user.getNickname();}
}
UserServiceSpringTest.java (测试类,使用Spring上下文):
@SpringBootTest
public class UserServiceSpringTest {@Autowiredprivate UserService userService;@MockBeanprivate UserRepository userRepository; // @MockBean的意思:Spring 启动时,// 把真正的UserRepository替换成一个Mock对象,// 我们就可以定义它的返回值,而不会真的连数据库@Testvoid testGetUserNickname_found() {User mockUser = new User();mockUser.setName("alice");mockUser.setNickname("AliceWonder");Mockito.when(userRepository.findByName("alice")).thenReturn(mockUser);String result = userService.getUserNickname("alice");Assertions.assertEquals("AliceWonder", result);}@Testvoid testGetUserNickname_notFound() {// 不设置when就会返回nullString result = userService.getUserNickname("unknown");Assertions.assertEquals("UNKNOWN", result);}
}
@SpringBootTest
会启动一个小型Spring环境,让@Autowired
能起作用。@MockBean
可以让你把某个Bean(比如UserRepository
)变成一个模拟对象。- 整体执行依然比较快,但比纯Mock稍微慢一点,因为要先启动Spring容器。
6. 测试 Controller 层
在 Spring Boot 里,Controller 是对外的 HTTP 接口。最常见的两种测试方式:
- 用
@WebMvcTest
+MockMvc
:不启动整个应用,只启动Web层,速度较快;- 用
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+TestRestTemplate
:会真正启动一个内嵌服务器,发起真实HTTP请求,更贴近实际环境。
6.1 @WebMvcTest
示例
@WebMvcTest(UserController.class) // 表示只测 UserController 相关
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc; // 用来模拟HTTP请求@MockBeanprivate UserService userService; // Mock掉Service层@Testvoid testGetUser() throws Exception {// 假设Service返回一个User对象User mockUser = new User();mockUser.setName("test");mockUser.setNickname("TestNick");// 定义service行为Mockito.when(userService.getUserNickname("test")).thenReturn("TestNick");// 用MockMvc发起GET请求,对应Controller的 /user/{name} 路径mockMvc.perform(MockMvcRequestBuilders.get("/user/test")).andExpect(MockMvcResultMatchers.status().isOk()).andExpect(MockMvcResultMatchers.content().string("TestNick"));}
}
@WebMvcTest
只会扫描和加载 Web 层相关的组件,不会启动整个 Spring Boot 应用,测试速度更快。mockMvc.perform(get("/users/1"))
可以模拟一次 GET 请求到/users/1
,并断言返回的 JSON 结构和内容。
6.2 @SpringBootTest
+ TestRestTemplate
如果你想做一个更真实的集成测试(包括 Controller、Service、Repository 等所有层),可以使用 @SpringBootTest
并设置 webEnvironment = RANDOM_PORT
或 DEFINED_PORT
来启动内嵌服务器,然后注入 TestRestTemplate
来请求:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class UserControllerIntegrationTest {@Autowiredprivate TestRestTemplate restTemplate; // 可以真的发请求@Testvoid testGetUser() {// 假设数据库里已经有对应数据,或者你用 @MockBean 替换依赖String result = restTemplate.getForObject("/user/test", String.class);Assertions.assertEquals("TestNick", result);}
}
- 这里会真正启动一个随机端口的Tomcat,然后
TestRestTemplate
真的去请求本地这个/user/test
接口。 - 非常贴近真实部署,只是适合做集成测试,比前面的MockMvc测试稍慢一点。
7. 常见的断言与技巧
7.1 断言
Assertions.assertEquals(期望, 实际)
:断言二者相等。Assertions.assertTrue(条件)
:断言条件为真。Assertions.assertThrows(异常类型, 代码块)
:断言执行代码块会抛出指定异常。
例如:
@Test
void testThrowException() {Assertions.assertThrows(IllegalArgumentException.class, () -> {// 假设调用了一个会抛出异常的方法someMethod(null);});
}
7.2 Mock时常用的 Mockito 方法
Mockito.when( mockObj.方法(...) ).thenReturn(返回值);
Mockito.when( mockObj.方法(...) ).thenThrow(异常);
Mockito.verify( mockObj, Mockito.times(1) ).某方法(...)
; // 验证是否调用了某方法
8. 测试运行与整合
8.1 在本地IDE里运行
- 右键单个测试类或测试方法 -> Run
- 或者在项目主目录运行
mvn test
/gradle test
8.2 与持续集成(CI)整合
- 在 Jenkins、GitLab CI、GitHub Actions 等环境里,一般只要执行
mvn test
或gradle test
就可以跑所有测试用例。 - 如果测试全部通过,就说明代码基本没问题;如果测试挂了,说明你这次提交的改动有Bug或者破坏了原有逻辑。
9. 流程小结(简版“使用指南”)
-
新手首次写单元测试:
- 在
src/test/java
下创建和源代码同包路径的测试类:XXXTest.java
。 - 在类里加
@Test
注解的方法,里面写Assertions.assertXXX(...)
。 - 右键运行,看输出是否通过。
- 在
-
要测Service逻辑,但不想连数据库:
- 在测试类上写:
@ExtendWith(MockitoExtension.class) public class MyServiceTest {@Mockprivate MyRepository myRepository;@InjectMocksprivate MyService myService;... }
- 用
Mockito.when(...)
来模拟依赖。 - 用
assertEquals(...)
来判断结果。
- 在测试类上写:
-
要测Service逻辑,并用Spring上下文:
- 在测试类上加
@SpringBootTest
。 - 注入 Service:
@Autowired private MyService myService;
- 如果你不想真的连数据库,那就用
@MockBean MyRepository myRepository;
- 在测试类上加
-
要测Controller:
- 用
@WebMvcTest(MyController.class)
+@MockBean MyService myService;
+MockMvc
做单元测试,速度较快; - 或者用
@SpringBootTest(webEnvironment = ... )
+TestRestTemplate
做近似真实的集成测试。
- 用
10. 其他常见问题
- 测试和生产环境的配置冲突了怎么办?
- 可以在
application-test.yml
里放测试专用配置,然后在测试时用spring.profiles.active=test
。
- 可以在
- 需要数据库的测试怎么办?
- 可以用
@DataJpaTest
+内存数据库(比如 H2),只测JPA相关逻辑,不影响真数据库。
- 可以用
- 想看覆盖率怎么办?
- 可以集成 Jacoco 插件,跑
mvn test
后生成覆盖率报告,看你的测试是不是覆盖到了主要逻辑。
- 可以集成 Jacoco 插件,跑
- 测试很慢怎么办?
- 如果你的逻辑不是必须要Spring,就尽量用纯Mock,不用
@SpringBootTest
。 - 如果只是测Controller,就用
@WebMvcTest
,不要启动全部。
- 如果你的逻辑不是必须要Spring,就尽量用纯Mock,不用
相关文章:
Spring Boot框架下的单元测试
1. 什么是单元测试 1.1 基本定义 单元测试(Unit Test) 是对软件开发中最小可测单位(例如一个方法或者一个类)进行验证的一种测试方式。在 Java 后端的 Spring Boot 项目中,单元测试通常会借助 JUnit、Mockito 等框架对代码中核心逻辑进行快…...
OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关
目标 学习将 OpenAI 接入 Web 应用,构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖: 打开终端或命令行,执行以下命令安装 Flask 和 OpenAI SDK: pip i…...
xss-labs靶场
xss-labs靶场 xss攻击类型 反射型xss 即攻击者将恶意脚本嵌入到url或者表单中,当用户访问特定的url或者提交表单时(用户端请求时),恶意脚本会执行 攻击需要用户点击恶意链接或访问包含恶意参数的url触发 存储型xss 即攻击者将恶意脚本提交…...
Eigen::Tensor使用帮助
0 引言 用python实现了某些算法之后,想转成C来获取更高的性能。但是python数组的操作太灵活了,尤其是3维、4维、5维等高维数组,以及它们的广播、数组坐标、切片等机制。还有numpy的pad、where等操作更是给C转换带来了更多的麻烦。 查阅了相…...
高阶开发基础——快速入门C++并发编程4
目录 使用call_once来确保调用的唯一性 先看我们的原始的单例模式 使用call_once来确保调用的唯一性 一个相似的概念是——单例模式,笔者找到的是stack_overflow的一个问答,如果不喜欢看英文,可以考虑看一下这个CSDN回答: c - H…...
C++基础day1
前言:谢谢阿秀,指路阿秀的学习笔记 一、基础语法 1.构造和析构: 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 构造顺序:父类->子类 析…...
Deepseek:网页版OR本地部署版本?
使用本地部署的 DeepSeek 还是网页版的 DeepSeek,取决于具体需求和使用场景。以下是两者的对比及推荐建议: 响应速度 网页版 DeepSeek:响应速度受网络状况和服务器负载影响较大。如果网络不稳定或服务器繁忙,可能会出现延迟甚至…...
【文件上传】
目录 一. 介绍二. 本地存储三. 阿里云OSS3.1 准备工作3.2 入门程序3.3 案例集成3.4 程序优化 \quad 一. 介绍 \quad 三要素缺一不可 \quad 二. 本地存储 \quad 解决相同命名覆盖问题 \quad 三. 阿里云OSS \quad \quad 3.1 准备工作 \quad \quad 3.2 入门程序 \quad \quad 3.3…...
股票入门知识
股票入门(更适合中国宝宝体制) 股市基础知识 本文介绍了股票的基础知识,股票的分类,各板块发行上市条件,股票代码,交易时间,交易规则,炒股术语,影响股价的因素…...
Debezium Oracle Connector SCN处理优化指南
Debezium Oracle Connector SCN处理优化指南 📌 问题场景 SCN跳跃场景: 起始SCN:15,000(含数据变更)结束SCN:1,000,000(无中间数据)默认批次大小:10,000 → 需执行985次无效查询🚀 优化方案 1. 自适应批次调整 代码位置:LogMinerStreamingChangeEventSource.j…...
2021版小程序开发5——小程序项目开发实践(1)
2021版小程序开发5——小程序项目开发实践(1) 学习笔记 2025 使用uni-app开发一个电商项目; Hbuidler 首选uni-app官方推荐工具:https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后台:htt…...
软件测试02----用例设计方法
今天目标 1.能对穷举场景设计测试点 2.能对限定边界规则设计测试点 3.能对多条件依赖关系进行设计测试点 4.能对项目业务进行设计测试点 一、解决穷举场景 重点:使用等价类划分法 1.1等价类划分法 重点:有效等价和单个无效等价各取1个即可。 步骤&#…...
分享半导体Fab 缺陷查看系统,平替klarity defect系统
分享半导体Fab 缺陷查看系统,平替klarity defect系统;开发了半年有余。 查看Defect Map,Defect image,分析Defect size,defect count trend. 不用再采用klarity defect系统(license 太贵) 也可以…...
C语言-----数据结构从门到精通
1.数据结构基本概念 数据结构是计算机中存储、组织数据的方式,旨在提高数据的访问和操作效率。它是实现高效算法和程序设计的基石。 目标:通过思维导图了解数据结构的知识点,并掌握。 1.1逻辑结构 逻辑结构主要四种类型: 集合:结构中的数据元素之…...
存储器知识点3
1.只读存储器中内容断电后不会丢失,通常存储固定不变的内容,不需要定时刷新。 2.虚拟存储器将主存和辅存地址空间统一编址,其大小受到辅助存储器容量的限制。使得主存空间得到了扩充,需要硬件支持,并由操作系统调度。…...
Weevely代码分析
亲测php5和php8都无效,只有php7有效 ailx10 1949 次咨询 4.9 网络安全优秀回答者 互联网行业 安全攻防员 去咨询 上一次做weevely实验可以追溯到2020年,当时还是weevely3.7,现在的是weevely4 生成php网页木马依然差不多…… php菜刀we…...
leetcode解题思路分析(一百六十三)1409 - 1415 题
查询带键的排列 给定一个正整数数组 queries ,其取值范围在 1 到 m 之间。 请你根据以下规则按顺序处理所有 queries[i](从 i0 到 iqueries.length-1): 首先,你有一个排列 P[1,2,3,…,m]。 对于当前的 i ,找…...
【MATLAB例程】TOA和AOA混合的高精度定位程序,适用于三维、N锚点的情况
代码实现了一个基于到达角(AOA)和到达时间(TOA)混合定位的例程。该算法能够根据不同基站接收到的信号信息,自适应地计算目标的位置,适用于多个基站的场景 文章目录 主要功能代码结构运行结果程序代码 主要功…...
PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统
基于YOLOv8深度学习的学生课堂行为检测识别系统,其能识别三种学生课堂行为:names: [举手, 读书, 写字] 具体图片见如下: 第一步:YOLOv8介绍 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本…...
智慧园区系统对比不同智能管理模式提升企业运营效率与安全性
内容概要 在当今竞争激烈的市场中,企业需要不断提高运营效率与安全性,以应对复杂的环境。这时,“智慧园区系统”应运而生,成为一种有效的解决方案。智能管理模式的多样性让企业在选择系统时有了更多的选择,而在这些模…...
读书笔记 | 《最小阻力之路》:用结构思维重塑人生愿景
一、核心理念:结构决定行为轨迹 橡皮筋模型:愿景张力的本质 书中提出:人类行为始终沿着"现状"与"愿景"之间的张力路径运动,如同橡皮筋拉伸产生的动力。 案例:音乐家每日练习的坚持,不…...
257. 二叉树的所有路径
二叉树的所有路径 已解答 简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [1,2,3,null,5] 输出:[“1->2->5”,“…...
Vulkan 学习(13)---- Vulkan Framebuffercommand buffer
目录 Vulkan Framebuffer创建 VkFramebufferVkFrameBuffer 创建示例 Vulkan command buffercommand buffer pool分配指令缓存池释放指令缓存池录制 command buffer提交 command buffer Vulkan Framebuffer Vulkan 帧缓冲区(FrameBuffer) 是一个容器对象(资源管理类的对象)&…...
从零开始学习安时积分法(STM32实现程序)
在STM32微控制器上实现安时积分法(Coulomb Counting)来估算电池的SOC(State of Charge),需要完成以下几个步骤: 硬件配置: 使用STM32的ADC模块测量电池的电流。使用定时器模块进行时间积分。配置…...
基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构
每个服务使用一台独立的服务器的可行部署方案,尤其是在高并发、高可用性要求较高的场景中。这种方案通常被称为分布式部署或微服务架构。以下是针对您的VoIP管理系统(基于Kamailio、MySQL、Redis、Gin、Vue.js)的详细分析和建议。 1. 分布式部…...
Unity 粒子特效在UI中使用裁剪效果
1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体,添加Sprite Mask组件,将其的Layer设置为UI相机渲染的UI层, 并将其添加到Canvas子物体中,调整好大小,并选择合适的Spriteÿ…...
Android 开发:新的一年,新的征程
回顾 2023 年,Android 开发领域可谓成果斐然。这一年,Android 系统不断迭代,新技术、新工具层出不穷,为开发者们带来了前所未有的机遇与挑战。如今,我们站在新的起点,怀揣着对技术的热爱与追求,…...
手写MVVM框架-环境搭建
项目使用 webpack 进行进行构建,初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server,html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...
SQL进阶实战技巧:某芯片工厂设备任务排产调度分析 | 间隙分析技术应用
目录 0 技术定义与核心原理 1 场景描述 2 数据准备 3 间隙分析法 步骤1:原始时间线可视化...
[HOT 100] 0167. 两数之和 ||
文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 167. 两数之和 II - 输入有序数组 - 力扣(LeetCode) 2. 题目描述 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 &…...
CSS整体回顾
一. 邂逅CSS和常见的CSS 1.1. CSS的编写方式 1.2. 常见的CSS font-size/color/width/height/backgroundColor 二. 文本属性 2.1. text-decoration 2.2. text-indent 2.3. text-align 三. 字体属性 3.1. font-family 3.2. font-style 3.3. font-weight 3.4. font-size 3.5. …...
使用 Grafana 和 Prometheus展现消息队列性能
引言 上篇文章通过JMX提取Kafka数据,本篇文章将通过JDBC存储Kafka性能数据存储于数据库,并通过Grafana 和 Prometheus进行展示,实现开发中常用的可视化监控 1. 环境准备 Kafka:运行中的 Kafka 集群,确保可以…...
openssl 生成证书 windows导入证书
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
Skyeye 云 VUE 版本 v3.15.6 发布
Skyeye 云智能制造,采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程,CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...
25.2.3 【洛谷】作为栈的复习不错(学习记录)
今天学习的东西不算多,放了一个星期假,感觉不少东西都没那么清楚,得复习一下才行。今天搞个栈题写,把栈复习一下,明天进入正轨,边复习边学习新东西,应该会有二叉树的学习等等... 【洛谷】P1449 …...
【C++】线程池实现
目录 一、线程池简介线程池的核心组件实现步骤 二、C11实现线程池源码 三、线程池源码解析1. 成员变量2. 构造函数2.1 线程初始化2.2 工作线程逻辑 3. 任务提交(enqueue方法)3.1 方法签名3.2 任务封装3.3 任务入队 4. 析构函数4.1 停机控制 5. 关键技术点解析5.1 完美转发实现5…...
大模型领域的Scaling Law的含义及作用
Scaling Law就像是一个“长大公式”,用来预测当一个东西(比如模型)变大(比如增加参数、数据量)时,它的性能(比如准确率)会怎么变化。 它能帮助我们提前知道,增加多少资源…...
用FormLinker实现自动调整数据格式,批量导入微软表单
每天早上打开Excel时,你是否也经历过这样的噩梦? 熬夜调整好的问卷格式,导入微软表单后全乱套 客户发来的PDF反馈表,手动录入3小时才完成10% 200道题库要转为在线测试,复制粘贴到手指抽筋 微软官方数据显示…...
C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)
Made By 于子轩,2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件,或是使用Windows Script Host对象创建快捷方式,亦或是使用Shell32对象创建快捷方式,都对用户很不友好,今天小编为大家带来一种全新…...
洛谷 P11626 题解
[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定长度为 n n n 的数组 A 1 ⋯ n A_{1 \cdots n} A1⋯n,求 ∑ a 1 n ∑ b a 1 n ∑ c b 1 n ∑ d c 1 n ∑ e d 1 n ∑ f e 1 n ∑ g f 1 n ( gcd …...
Android学习制作app(ESP8266-01S连接-简单制作)
一、理论 部分理论见arduino学习-CSDN博客和Android Studio安装配置_android studio gradle 配置-CSDN博客 以下直接上代码和效果视频,esp01S的收发硬件代码目前没有分享,但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…...
一文读懂 RAG:LLM 借助检索打开思路
一、引言 在自然语言处理(NLP)领域,随着深度学习技术的飞速发展,大型语言模型(LLMs)展现出了强大的语言理解和生成能力。然而,LLMs也存在一些局限性,如容易产生幻觉、知识更新不及时…...
使用istio实现权重路由
istio概述 **概述:**Istio 是一个开源的 服务网格(Service Mesh)解决方案,主要用于管理、保护和监控微服务架构中的服务通信。它为微服务提供了基础设施层的控制功能,不需要更改应用程序的代码,从而解决服…...
DeepSeek发布新模型,遭遇大规模攻击,梁文锋回应证实为假,吴恩达盛赞DeepSeek!AI Weekly 1.27-2.2
📢本周AI快讯 | 1分钟速览🚀 1️⃣ 🖼️Janus-Pro-7B:DeepSeek发布7B开源多模态模型,视觉理解&生成能力超越DALL-E 3! 2️⃣ 🚨DeepSeek遭遇大规模攻击:DDoS暴力破解ÿ…...
20250202在Ubuntu22.04下使用Guvcview录像的时候降噪
20250202在Ubuntu22.04下使用Guvcview录像的时候降噪 2025/2/2 21:25 声卡:笔记本电脑的摄像头自带的【USB接口的】麦克风。没有外接3.5mm接口的耳机。 缘起:在安装Ubuntu18.04/20.04系统的笔记本电脑中直接使用Guvcview录像的时候底噪很大! …...
直方图:摄影中的视觉数据指南
目录 一、直方图基础:揭开它的神秘面纱 二、解读直方图类型:亮度与色彩的密码 (一)亮度直方图 (二)RGB 直方图 三、拍摄中巧用直方图:优化曝光与效果 (一)精准判断曝…...
OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
文章目录 摄像机/观察空间/视图变换LookAt矩阵移动相机(处理键盘输入)移动速度欧拉角移动视角(处理鼠标输入)缩放场景(处理滚轮输入)Camera类 摄像机/观察空间/视图变换 在上一节变换中,我们讨…...
冲刺一区!挑战7天完成一篇趋势性分析GBD DAY1-7
Day1. 公开数据库的挖掘太火热了,其中GBD数据库的挖掘又十分的火爆.那我就来挑战一篇GBD、一篇关于趋势性分析的GBD! GBD数据库挖掘是目前的四大刊常客,经常出现在顶级期刊上面。这个数据库亮点就是:可视化,统计学简单、而数据可…...
解锁数据结构密码:层次树与自引用树的设计艺术与API实践
1. 引言:为什么选择层次树和自引用树? 数据结构是编程中的基石之一,尤其是在处理复杂关系和层次化数据时,树形结构常常是最佳选择。层次树(Hierarchical Tree)和自引用树(Self-referencing Tree…...
【AudioClassificationModelZoo-Pytorch】基于Pytorch的声音事件检测分类系统
源码:https://github.com/Shybert-AI/AudioClassificationModelZoo-Pytorch 模型测试表 模型网络结构batch_sizeFLOPs(G)Params(M)特征提取方式数据集类别数量模型验证集性能EcapaTdnn1280.486.1melUrbanSound8K10accuracy0.974, precision0.972 recall0.967, F1-s…...