当前位置: 首页 > news >正文

Spring Boot框架下的单元测试

1. 什么是单元测试

1.1 基本定义

  • 单元测试(Unit Test) 是对软件开发中最小可测单位(例如一个方法或者一个类)进行验证的一种测试方式。
  • 在 Java 后端的 Spring Boot 项目中,单元测试通常会借助 JUnitMockito 等框架对代码中核心逻辑进行快速且隔离的验证,保证功能正确性。

目的:及早发现并修复 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_PORTDEFINED_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 testgradle 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 后生成覆盖率报告,看你的测试是不是覆盖到了主要逻辑。
  • 测试很慢怎么办?
    • 如果你的逻辑不是必须要Spring,就尽量用纯Mock,不用 @SpringBootTest
    • 如果只是测Controller,就用 @WebMvcTest,不要启动全部。

相关文章:

Spring Boot框架下的单元测试

1. 什么是单元测试 1.1 基本定义 单元测试(Unit Test) 是对软件开发中最小可测单位&#xff08;例如一个方法或者一个类&#xff09;进行验证的一种测试方式。在 Java 后端的 Spring Boot 项目中&#xff0c;单元测试通常会借助 JUnit、Mockito 等框架对代码中核心逻辑进行快…...

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用&#xff0c;构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖&#xff1a; 打开终端或命令行&#xff0c;执行以下命令安装 Flask 和 OpenAI SDK&#xff1a; pip i…...

xss-labs靶场

xss-labs靶场 xss攻击类型 反射型xss 即攻击者将恶意脚本嵌入到url或者表单中&#xff0c;当用户访问特定的url或者提交表单时&#xff08;用户端请求时)&#xff0c;恶意脚本会执行 攻击需要用户点击恶意链接或访问包含恶意参数的url触发 存储型xss 即攻击者将恶意脚本提交…...

Eigen::Tensor使用帮助

0 引言 用python实现了某些算法之后&#xff0c;想转成C来获取更高的性能。但是python数组的操作太灵活了&#xff0c;尤其是3维、4维、5维等高维数组&#xff0c;以及它们的广播、数组坐标、切片等机制。还有numpy的pad、where等操作更是给C转换带来了更多的麻烦。 查阅了相…...

高阶开发基础——快速入门C++并发编程4

目录 使用call_once来确保调用的唯一性 先看我们的原始的单例模式 使用call_once来确保调用的唯一性 一个相似的概念是——单例模式&#xff0c;笔者找到的是stack_overflow的一个问答&#xff0c;如果不喜欢看英文&#xff0c;可以考虑看一下这个CSDN回答&#xff1a; c - H…...

C++基础day1

前言&#xff1a;谢谢阿秀&#xff0c;指路阿秀的学习笔记 一、基础语法 1.构造和析构: 类的构造函数是一种特殊的函数&#xff0c;在创建一个新的对象时调用。类的析构函数也是一种特殊的函数&#xff0c;在删除所创建的对象时调用。 构造顺序&#xff1a;父类->子类 析…...

Deepseek:网页版OR本地部署版本?

使用本地部署的 DeepSeek 还是网页版的 DeepSeek&#xff0c;取决于具体需求和使用场景。以下是两者的对比及推荐建议&#xff1a; 响应速度 网页版 DeepSeek&#xff1a;响应速度受网络状况和服务器负载影响较大。如果网络不稳定或服务器繁忙&#xff0c;可能会出现延迟甚至…...

【文件上传】

目录 一. 介绍二. 本地存储三. 阿里云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…...

股票入门知识

股票入门&#xff08;更适合中国宝宝体制&#xff09; 股市基础知识 本文介绍了股票的基础知识&#xff0c;股票的分类&#xff0c;各板块发行上市条件&#xff0c;股票代码&#xff0c;交易时间&#xff0c;交易规则&#xff0c;炒股术语&#xff0c;影响股价的因素&#xf…...

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开发一个电商项目&#xff1b; Hbuidler 首选uni-app官方推荐工具&#xff1a;https://www.dcloud.io/hbuilderx.htmlhttps://dev.dcloud.net.cn/pages/app/list 微信小程序 管理后台&#xff1a;htt…...

软件测试02----用例设计方法

今天目标 1.能对穷举场景设计测试点 2.能对限定边界规则设计测试点 3.能对多条件依赖关系进行设计测试点 4.能对项目业务进行设计测试点 一、解决穷举场景 重点&#xff1a;使用等价类划分法 1.1等价类划分法 重点&#xff1a;有效等价和单个无效等价各取1个即可。 步骤&#…...

分享半导体Fab 缺陷查看系统,平替klarity defect系统

分享半导体Fab 缺陷查看系统&#xff0c;平替klarity defect系统&#xff1b;开发了半年有余。 查看Defect Map&#xff0c;Defect image&#xff0c;分析Defect size&#xff0c;defect count trend. 不用再采用klarity defect系统&#xff08;license 太贵&#xff09; 也可以…...

C语言-----数据结构从门到精通

1.数据结构基本概念 数据结构是计算机中存储、组织数据的方式&#xff0c;旨在提高数据的访问和操作效率。它是实现高效算法和程序设计的基石。 目标:通过思维导图了解数据结构的知识点,并掌握。 1.1逻辑结构 逻辑结构主要四种类型: 集合&#xff1a;结构中的数据元素之…...

存储器知识点3

1.只读存储器中内容断电后不会丢失&#xff0c;通常存储固定不变的内容&#xff0c;不需要定时刷新。 2.虚拟存储器将主存和辅存地址空间统一编址&#xff0c;其大小受到辅助存储器容量的限制。使得主存空间得到了扩充&#xff0c;需要硬件支持&#xff0c;并由操作系统调度。…...

Weevely代码分析

亲测php5和php8都无效&#xff0c;只有php7有效 ailx10 1949 次咨询 4.9 网络安全优秀回答者 互联网行业 安全攻防员 去咨询 上一次做weevely实验可以追溯到2020年&#xff0c;当时还是weevely3.7&#xff0c;现在的是weevely4 生成php网页木马依然差不多…… php菜刀we…...

leetcode解题思路分析(一百六十三)1409 - 1415 题

查询带键的排列 给定一个正整数数组 queries &#xff0c;其取值范围在 1 到 m 之间。 请你根据以下规则按顺序处理所有 queries[i]&#xff08;从 i0 到 iqueries.length-1&#xff09;&#xff1a; 首先&#xff0c;你有一个排列 P[1,2,3,…,m]。 对于当前的 i &#xff0c;找…...

【MATLAB例程】TOA和AOA混合的高精度定位程序,适用于三维、N锚点的情况

代码实现了一个基于到达角&#xff08;AOA&#xff09;和到达时间&#xff08;TOA&#xff09;混合定位的例程。该算法能够根据不同基站接收到的信号信息&#xff0c;自适应地计算目标的位置&#xff0c;适用于多个基站的场景 文章目录 主要功能代码结构运行结果程序代码 主要功…...

PyTorch框架——基于深度学习YOLOv8神经网络学生课堂行为检测识别系统

基于YOLOv8深度学习的学生课堂行为检测识别系统&#xff0c;其能识别三种学生课堂行为&#xff1a;names: [举手, 读书, 写字] 具体图片见如下&#xff1a; 第一步&#xff1a;YOLOv8介绍 YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的 YOLOv5 的下一个重大更新版本…...

智慧园区系统对比不同智能管理模式提升企业运营效率与安全性

内容概要 在当今竞争激烈的市场中&#xff0c;企业需要不断提高运营效率与安全性&#xff0c;以应对复杂的环境。这时&#xff0c;“智慧园区系统”应运而生&#xff0c;成为一种有效的解决方案。智能管理模式的多样性让企业在选择系统时有了更多的选择&#xff0c;而在这些模…...

读书笔记 | 《最小阻力之路》:用结构思维重塑人生愿景

一、核心理念&#xff1a;结构决定行为轨迹 橡皮筋模型&#xff1a;愿景张力的本质 书中提出&#xff1a;人类行为始终沿着"现状"与"愿景"之间的张力路径运动&#xff0c;如同橡皮筋拉伸产生的动力。 案例&#xff1a;音乐家每日练习的坚持&#xff0c;不…...

257. 二叉树的所有路径

二叉树的所有路径 已解答 简单 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;[“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微控制器上实现安时积分法&#xff08;Coulomb Counting&#xff09;来估算电池的SOC&#xff08;State of Charge&#xff09;&#xff0c;需要完成以下几个步骤&#xff1a; 硬件配置&#xff1a; 使用STM32的ADC模块测量电池的电流。使用定时器模块进行时间积分。配置…...

基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构

每个服务使用一台独立的服务器的可行部署方案&#xff0c;尤其是在高并发、高可用性要求较高的场景中。这种方案通常被称为分布式部署或微服务架构。以下是针对您的VoIP管理系统&#xff08;基于Kamailio、MySQL、Redis、Gin、Vue.js&#xff09;的详细分析和建议。 1. 分布式部…...

Unity 粒子特效在UI中使用裁剪效果

1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体&#xff0c;添加Sprite Mask组件&#xff0c;将其的Layer设置为UI相机渲染的UI层&#xff0c; 并将其添加到Canvas子物体中&#xff0c;调整好大小&#xff0c;并选择合适的Sprite&#xff…...

Android 开发:新的一年,新的征程

回顾 2023 年&#xff0c;Android 开发领域可谓成果斐然。这一年&#xff0c;Android 系统不断迭代&#xff0c;新技术、新工具层出不穷&#xff0c;为开发者们带来了前所未有的机遇与挑战。如今&#xff0c;我们站在新的起点&#xff0c;怀揣着对技术的热爱与追求&#xff0c;…...

手写MVVM框架-环境搭建

项目使用 webpack 进行进行构建&#xff0c;初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server&#xff0c;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 - 输入有序数组 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &…...

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数据&#xff0c;本篇文章将通过JDBC存储Kafka性能数据存储于数据库&#xff0c;并通过Grafana 和 Prometheus进行展示&#xff0c;实现开发中常用的可视化监控 1. 环境准备 Kafka&#xff1a;运行中的 Kafka 集群&#xff0c;确保可以…...

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

Skyeye 云 VUE 版本 v3.15.6 发布

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…...

25.2.3 【洛谷】作为栈的复习不错(学习记录)

今天学习的东西不算多&#xff0c;放了一个星期假&#xff0c;感觉不少东西都没那么清楚&#xff0c;得复习一下才行。今天搞个栈题写&#xff0c;把栈复习一下&#xff0c;明天进入正轨&#xff0c;边复习边学习新东西&#xff0c;应该会有二叉树的学习等等... 【洛谷】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就像是一个“长大公式”&#xff0c;用来预测当一个东西&#xff08;比如模型&#xff09;变大&#xff08;比如增加参数、数据量&#xff09;时&#xff0c;它的性能&#xff08;比如准确率&#xff09;会怎么变化。 它能帮助我们提前知道&#xff0c;增加多少资源…...

用FormLinker实现自动调整数据格式,批量导入微软表单

每天早上打开Excel时&#xff0c;你是否也经历过这样的噩梦&#xff1f; 熬夜调整好的问卷格式&#xff0c;导入微软表单后全乱套 客户发来的PDF反馈表&#xff0c;手动录入3小时才完成10% 200道题库要转为在线测试&#xff0c;复制粘贴到手指抽筋 微软官方数据显示&#xf…...

C#,shell32 + 调用控制面板项(.Cpl)实现“新建快捷方式对话框”(全网首发)

Made By 于子轩&#xff0c;2025.2.2 不管是使用System.IO命名空间下的File类来创建快捷方式文件&#xff0c;或是使用Windows Script Host对象创建快捷方式&#xff0c;亦或是使用Shell32对象创建快捷方式&#xff0c;都对用户很不友好&#xff0c;今天小编为大家带来一种全新…...

洛谷 P11626 题解

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] 给定长度为 n n n 的数组 A 1 ⋯ n A_{1 \cdots n} A1⋯n​&#xff0c;求 ∑ 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博客 以下直接上代码和效果视频&#xff0c;esp01S的收发硬件代码目前没有分享&#xff0c;但是可以通过另一个手机网络调试助手进行模拟。也可以直接根据我的代码进行改动…...

一文读懂 RAG:LLM 借助检索打开思路

一、引言 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;随着深度学习技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;展现出了强大的语言理解和生成能力。然而&#xff0c;LLMs也存在一些局限性&#xff0c;如容易产生幻觉、知识更新不及时…...

使用istio实现权重路由

istio概述 **概述&#xff1a;**Istio 是一个开源的 服务网格&#xff08;Service Mesh&#xff09;解决方案&#xff0c;主要用于管理、保护和监控微服务架构中的服务通信。它为微服务提供了基础设施层的控制功能&#xff0c;不需要更改应用程序的代码&#xff0c;从而解决服…...

DeepSeek发布新模型,遭遇大规模攻击,梁文锋回应证实为假,吴恩达盛赞DeepSeek!AI Weekly 1.27-2.2

&#x1f4e2;本周AI快讯 | 1分钟速览&#x1f680; 1️⃣ &#x1f5bc;️Janus-Pro-7B&#xff1a;DeepSeek发布7B开源多模态模型&#xff0c;视觉理解&生成能力超越DALL-E 3&#xff01; 2️⃣ &#x1f6a8;DeepSeek遭遇大规模攻击&#xff1a;DDoS暴力破解&#xff…...

20250202在Ubuntu22.04下使用Guvcview录像的时候降噪

20250202在Ubuntu22.04下使用Guvcview录像的时候降噪 2025/2/2 21:25 声卡&#xff1a;笔记本电脑的摄像头自带的【USB接口的】麦克风。没有外接3.5mm接口的耳机。 缘起&#xff1a;在安装Ubuntu18.04/20.04系统的笔记本电脑中直接使用Guvcview录像的时候底噪很大&#xff01; …...

直方图:摄影中的视觉数据指南

目录 一、直方图基础&#xff1a;揭开它的神秘面纱 二、解读直方图类型&#xff1a;亮度与色彩的密码 &#xff08;一&#xff09;亮度直方图 &#xff08;二&#xff09;RGB 直方图 三、拍摄中巧用直方图&#xff1a;优化曝光与效果 &#xff08;一&#xff09;精准判断曝…...

OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)

文章目录 摄像机/观察空间/视图变换LookAt矩阵移动相机&#xff08;处理键盘输入&#xff09;移动速度欧拉角移动视角&#xff08;处理鼠标输入&#xff09;缩放场景&#xff08;处理滚轮输入&#xff09;Camera类 摄像机/观察空间/视图变换 在上一节变换中&#xff0c;我们讨…...

冲刺一区!挑战7天完成一篇趋势性分析GBD DAY1-7

Day1. 公开数据库的挖掘太火热了,其中GBD数据库的挖掘又十分的火爆.那我就来挑战一篇GBD、一篇关于趋势性分析的GBD&#xff01; GBD数据库挖掘是目前的四大刊常客&#xff0c;经常出现在顶级期刊上面。这个数据库亮点就是&#xff1a;可视化&#xff0c;统计学简单、而数据可…...

解锁数据结构密码:层次树与自引用树的设计艺术与API实践

1. 引言&#xff1a;为什么选择层次树和自引用树&#xff1f; 数据结构是编程中的基石之一&#xff0c;尤其是在处理复杂关系和层次化数据时&#xff0c;树形结构常常是最佳选择。层次树&#xff08;Hierarchical Tree&#xff09;和自引用树&#xff08;Self-referencing Tree…...

【AudioClassificationModelZoo-Pytorch】基于Pytorch的声音事件检测分类系统

源码&#xff1a;https://github.com/Shybert-AI/AudioClassificationModelZoo-Pytorch 模型测试表 模型网络结构batch_sizeFLOPs(G)Params(M)特征提取方式数据集类别数量模型验证集性能EcapaTdnn1280.486.1melUrbanSound8K10accuracy0.974, precision0.972 recall0.967, F1-s…...