Spring Boot 测试:单元、集成与契约测试全解析
一、Spring Boot 分层测试策略
Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。
Spring Boot 分层架构:
Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] B -->|调用| C[Service 层] C -->|调用| D[Repository 层] D -->|操作| E[数据库] E -->|调用| F[外部服务接口]
分层测试策略:

测试策略核心原则:
•单元测试 (UT)
隔离验证单模块逻辑(Controller、Service、Repository)。
价值:快速反馈,精准定位代码缺陷。
•集成测试 (IT)
垂直集成测试(应用内全链路)与水平集成测试(跨服务交互)
价值:保证生产环境行为一致性。
•契约测试 (CT)
保障跨服务接口一致性,与水平集成测试互补。
价值:防止接口“暗坑”,提升协作效率。
二、单元测试:逐层击破,精准验证
单元测试专注于验证单一模块的逻辑,通过模拟其依赖项,快速获取反馈。
2.1 Controller 层:HTTP接口的靶向验证
测试目标: REST API 接口的独立测试,隔离业务逻辑与外部依赖。
测试工具:
•@WebMvcTest:轻量级切片测试,仅加载 Controller 层相关 Bean。
•MockMvc:模拟 HTTP 请求与响应,支持链式断言。
•@MockBean:Mock 依赖的 Service 层组件,隔离Service层依赖。
实战示例:
@WebMvcTest(UserController.class) //只加载UserController进行测试。
public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;//模拟UserService,用于提供预定义的行为。@MockBeanprivate UserService userService;@Testvoid getUserById_Returns200() throws Exception {// 模拟 Service 层返回when(userService.findById(1L)).thenReturn(new User(1L, "Test"));// 发起请求并断言mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(jsonPath("$.name").value("Test"));}
}
1.代码解析
•1L - 代表Long类型的 ID,符合User实体类的定义。
•/users/1 -为 HTTP 请求中的路径参数,Spring 会自动将其转换为Long类型。
•测试逻辑 -通过模拟UserService返回固定的数据,验证 Controller 层的输入输出行为。
2.注解解析
@WebMvcTest
•专注于Web 层的单元测试。只加载 Web 层相关的 Bean,如MockMvc。
•@WebMvcTest(UserController.class),表示只加载UserController进行测试。
@MockBean
•模拟服务层或其他依赖,避免与外部服务实际交互。
@Test
•标识一个单元测试方法。JUnit 会自动执行标记的方法,并报告结果。
MockMvc
•模拟 HTTP 请求并测试 Controller 行为及断言结果。
2.2 Service 层:业务逻辑深度验证
测试目标:验证业务规则的正确性、事务管理的行为符合预期。
测试工具:
@MockBean + @SpringBootTest(轻量模式)
@MockBean模拟数据库操作,结合@SpringBootTest提供的 Spring 应用上下文,进行Service层单元测试。
实战示例:
@SpringBootTest // 启动一个完整的 Spring 应用上下文
public class UserServiceTest {// 自动注入 UserService 实例@Autowired private UserService userService;// 创建一个模拟的 UserRepository Bean,替代真实的数据库操作@MockBeanprivate UserRepository userRepository;@Testvoid createUser_ValidInput_ReturnsUser() {// 1. 准备测试数据User user = new User("SpringBot");when(userRepository.save(user)).thenReturn(user);// 2. 调用业务方法User result = userService.createUser(user);// 3. 验证业务逻辑assertThat(result.getName()).isEqualTo("SpringBot");verify(userRepository).save(user); // 验证 Repository 方法被调用}@Testvoid createUser_NullName_ThrowsException() {// 验证业务规则:用户名为空时抛出异常User user = new User(null);assertThatThrownBy(() -> userService.createUser(user)).isInstanceOf(IllegalArgumentException.class).hasMessage("用户名不能为空");}
}
代码解析:
•@SpringBootTest
启动 Spring Boot类似真实的测试环境,加载整个应用上下文。通常用于集成测试。
与其他注解结合使用时,可用于单元测试。如结合@Autowired自动注入 Bean,或者@MockBean模拟服务进行单元测试。
•@Autowired
自动注入userService,用于测试业务逻辑。
•@MockBean
创建一个模拟的userRepository,替代真实的数据库操作。
2.3 Repository 层:数据操作基础校验
测试目标:验证JPA实体映射、基础查询逻辑。
工具:@DataJpaTest 默认使用内存数据库H2。
实战示例:
@DataJpaTest // 启动 JPA 相关的测试环境,通常用于测试 Repository 层public class UserRepositoryTest {@Autowired private TestEntityManager entityManager; // 用于与数据库进行交互,执行持久化操作@Autowired private UserRepository userRepository; // 自动注入 UserRepository,用于测试数据访问方法@Test // 标记为测试方法void findByEmail_ExistingEmail_ReturnsUser() {// 创建一个用户对象并持久化到数据库User user = new User("test@example.com");entityManager.persist(user);// 调用 UserRepository 方法,根据 email 查找用户User found = userRepository.findByEmail("test@example.com");// 断言返回的用户对象不为 nullassertThat(found).isNotNull();}}
关键点:
•TestEntityManager 手动管理测试数据。
•默认隔离真实数据库,确保快速执行。
单元测试的优势:
•快速执行,约 50 毫秒/测试。
•精准定位问题。
三、集成测试:全链路一致性保证
3.1 垂直集成测试(应用内全链路)
测试目标:验证应用内各层的完整调用链。
工具组合:
•@SpringBootTest:启动 Spring Boot 应用测试环境,进行全链路集成测试。
•@Testcontainers:通过 Docker 启动真实数据库容器(如 PostgreSQL)。
•@AutoConfigureMockMvc:自动配置MockMvc,用于模拟 HTTP 请求。
•@Container:定义 Testcontainers 容器,启动真实数据库实例。
•OrderRepository:验证数据是否已保存至数据库。
代码示例:
@SpringBootTest
@AutoConfigureMockMvc
@Testcontainers
public class OrderIntegrationTest {@Autowiredprivate MockMvc mockMvc; // 模拟 HTTP 请求@Autowiredprivate OrderRepository orderRepository; // 注入 Repository 层以验证数据库@Containerpublic static PostgreSQLContainer postgres = new PostgreSQLContainer("postgres:latest").withDatabaseName("testdb").withUsername("test").withPassword("password");@Testvoid createOrder_ValidRequest_OrderIsSaved() throws Exception {// 发送请求创建订单mockMvc.perform(post("/orders").contentType(MediaType.APPLICATION_JSON).content("{ \"productId\": 1 }")).andExpect(status().isCreated());// 验证数据库中是否有保存的订单Order order = orderRepository.findByProductId(1);assertThat(order).isNotNull();assertThat(order.getProductId()).isEqualTo(1);}
}
3.2 水平集成测试(跨服务交互)
测试目标:验证与外部服务的真实交互(如支付网关),确保跨服务的协议兼容性。
工具组合:
•@SpringBootTest
•@Testcontainers:启动模拟的外部服务容器(如 WireMock)。
•WireMockServer:模拟外部服务的响应,进行服务间的交互测试。
•@BeforeAll / @AfterAll:在测试执行前后配置和清理模拟服务。
代码示例:
@SpringBootTest
@Testcontainers
public class PaymentServiceIntegrationTest {@Autowiredprivate PaymentService paymentService;@Containerpublic static WireMockServer wireMockServer = new WireMockServer(options().port(8089)); // 设置外部服务模拟@BeforeAllstatic void setup() {wireMockServer.start();configureFor("localhost", 8089);stubFor(post(urlEqualTo("/payment")).willReturn(aResponse().withStatus(200).withBody("{\"status\": \"success\"}")));}@AfterAllstatic void teardown() {wireMockServer.stop();}@Testvoid processPayment_ValidRequest_ReturnsSuccess() {// 模拟支付服务调用PaymentRequest paymentRequest = new PaymentRequest(1, 100);PaymentResponse response = paymentService.processPayment(paymentRequest);// 验证支付处理是否成功assertThat(response.getStatus()).isEqualTo("success");}
}
解析:
•WireMockServer:模拟外部支付服务。
•PaymentService:调用外部支付服务并验证支付结果。
3.3 持久层的集成测试
测试目标:验证应用与真实数据库、中间件的交互逻辑。
工具组合:
•Testcontainers:启动真实数据库(如MySQL、PostgreSQL)。
•@DynamicPropertySource:动态注入测试环境配置。
•@DataJpaTest:聚焦 JPA 层测试,自动配置 H2 或真实数据库。
实战示例:
@Testcontainers // 启动容器化的数据库实例(这里使用 PostgreSQL)
@DataJpaTest // 启动 JPA 测试环境,只加载与 JPA 相关的配置。
@AutoConfigureTestDatabase(replace = NONE) // 禁用 Spring Boot 默认的内存数据库配置,使用实际的 PostgreSQL 容器public class UserRepositoryIntegrationTest {@Containerstatic PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15"); // 启动 PostgreSQL 容器,使用官方 15 版本@DynamicPropertySource // 动态配置数据库连接属性static void configure(DynamicPropertyRegistry registry) {registry.add("spring.datasource.url", postgres::getJdbcUrl); // 配置数据库连接 URLregistry.add("spring.datasource.username", postgres::getUsername); // 配置数据库用户名registry.add("spring.datasource.password", postgres::getPassword); // 配置数据库密码}@Test void saveUser_PersistsToRealDatabase() {// 创建用户并保存到数据库User user = new User("IntegrationTest");userRepository.save(user);// 断言数据库中保存的用户数量为 1assertThat(userRepository.findAll()).hasSize(1);}
}
1.注解解析:
@DataJpaTest
•专注于 JPA 层(JPA repository 或数据访问层操作)的测试,自动配置一个嵌入式数据库并扫描@Entity类。
@AutoConfigureTestDatabase(replace = NONE)
•禁用默认的嵌入式数据库(如 H2),使用外部数据库(如 PostgreSQL容器)进行测试。
@Container
•标记一个静态的、全局共享的容器实例,为测试提供服务。
@DynamicPropertySource
•动态配置 Spring 环境的属性,常用于设置容器生成的数据库连接信息。
优势:真实数据库行为模拟,避免H2与生产数据库的差异问题。
四、契约测试:消费者驱动的接口保卫者
契约测试(Consumer-Driven Contract,CDC)用于确保服务提供者与消费者对接口的理解一致,防止因接口变更引发故障。
4.1 核心流程
participant Consumer as 消费者
participant PactBroker as Pact Broker
participant Provider as 提供者Consumer->>PactBroker: 1. 定义并发布契约
PactBroker->>Provider: 2. 通知契约变更
Provider->>PactBroker: 3. 验证实现是否符合契约
PactBroker->>Consumer: 4. 反馈验证结果
4.2 技术组合
•Pact:定义消费者期望的接口契约
•@PactTestFor:绑定契约与测试用例
•Pact Broker:集中管理契约版本
4.3 实战示例
1.消费者端定义契约
// OrderService(消费者端)定义契约
@Pact(consumer = "OrderService", provider = "PaymentService")
public RequestResponsePact paymentSuccessPact(PactDslWithProvider builder) {return builder// 提供者状态:订单已创建,待支付(需在提供者端实现数据准备).given("订单已创建,待支付") // 消费者请求描述.uponReceiving("支付订单的请求").method("POST").path("/payments").headers("Content-Type", "application/json") // 必须声明请求头.body(new PactDslJsonBody().integerType("orderId", 1001) // 订单ID为整数类型.decimalType("amount", 299.99) // 金额为小数类型)// 提供者预期响应.willRespondWith().status(200).headers(Map.of("Content-Type", "application/json")) // 响应头校验.body(new PactDslJsonBody().stringType("status", "SUCCESS") // 状态必须为字符串且值=SUCCESS.stringType("transactionId", "TX123456") // 交易ID必须为字符串).toPact(); // 生成Pact契约文件
}
2.消费者端基于契约测试
@Test
@PactTestFor(pactMethod = "paymentSuccessPact", providerName = "PaymentService", // 指定提供者名称pactVersion = PactSpecVersion.V3 // 使用Pact协议V3
)
void testPayment_WhenValidRequest_ReturnsSuccess(MockServer mockServer) {// 1. 创建HTTP客户端,指向MockServer(模拟的PaymentService)WebClient client = WebClient.create(mockServer.getUrl());// 2. 构造请求并发送PaymentRequest request = new PaymentRequest(1001, 299.99);PaymentResponse response = client.post().uri("/payments").contentType(MediaType.APPLICATION_JSON).bodyValue(request).retrieve().bodyToMono(PaymentResponse.class).block(); // 同步等待响应// 3. 断言响应符合契约assertThat(response).isNotNull();assertThat(response.getStatus()).isEqualTo("SUCCESS");assertThat(response.getTransactionId()).isEqualTo("TX123456");
}
3.提供者端验证契约
目标:验证 PaymentService 的实现是否符合消费者定义的契约。
Step1. 提供者端代码实现
// PaymentService(提供者端)的Controller实现
@RestController
public class PaymentController {@PostMapping("/payments")public ResponseEntity<PaymentResponse> processPayment(@RequestBody PaymentRequest request) {// 业务逻辑:处理支付请求PaymentResponse response = new PaymentResponse();response.setStatus("SUCCESS");response.setTransactionId("TX" + UUID.randomUUID().toString().substring(0, 6));return ResponseEntity.ok(response);}
}
Step2. 提供者端 Pact 验证配置(build.gradle)
// 添加Pact验证插件
plugins {id "au.com.dius.pact" version "4.6.8"
}dependencies {// Pact提供者端依赖testImplementation 'au.com.dius.pact.provider:junit5:4.6.8'
}
// 配置Pact验证任务
pact {serviceProviders {PaymentService { // 提供者名称(需与契约中的provider一致)protocol = 'http'host = 'localhost'port = 8080 // 本地服务端口// 定义契约来源(本地文件或Pact Broker)hasPactWith('OrderService') {pactSource = file("path/to/OrderService-PaymentService.json")}}}
}
Step3: 提供者端状态准备(State Handler)
// 实现契约中的 given(“订单已创建,待支付”)
public class PaymentStateHandler {@BeforeRequest("订单已创建,待支付")public void setupOrderState(Map<String, Object> params) {// 模拟订单已创建的数据库操作Order order = new Order(1001, 299.99);orderRepository.save(order);}
}
Step4: 提供者端测试类
@Provider("PaymentService") // 声明提供者名称
@PactFolder("pacts") // 契约文件路径
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class PaymentServiceContractTest {@TestTemplate@ExtendWith(PactVerificationSpringProvider.class)void pactVerificationTestTemplate(PactVerificationContext context) {context.verifyInteraction();}@BeforeEachvoid before(PactVerificationContext context) {// 设置服务状态处理器context.setTarget(HttpTestTarget.fromUrl(new UrlParser().parse("http://localhost:8080")));}
}
Step5: 执行验证命令
# 在提供者端执行验证(确保服务已启动)
./gradlew pactVerify -Dpact.provider.version=1.0.0
4.4.契约测试总结
通过上述步骤,契约测试完整覆盖了消费者与提供者的协作流程:
1.消费者定义契约:明确接口预期行为。
2.消费者本地验证:通过MockServer模拟提供者。
3.提供者实现接口:按契约开发功能。
4.提供者验证契约:确保实现与契约一致。
契约测试优势
•解耦团队协作,契约即文档。
•自动检测接口变更引发的破坏性修改。
五、总结:构建测试体系
5.1 测试策略全景图
Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] B -->|调用| C[Service 层] C -->|调用| D[Repository 层] D -->|操作| E[数据库] E -->|调用| F[外部服务接口] 测试策略全景
单元测试
B1[Controller 单元测试] -->|@WebMvcTest + MockMvc| B
C1[Service 单元测试] -->|@MockBean| C
D1[Repository 单元测试] -->|@DataJpaTest| D集成测试
Int1[全链路调用] --> B --> C --> D --> |Testcontainers + 真实数据库| E
Int2[水平集成测试] --> F契约测试
Contract1[消费者契约测试] -->|Pact 定义期望接口+本地验证| F
Contract2[提供者契约测试] -->|Pact 验证实现| F
相关文章:
Spring Boot 测试:单元、集成与契约测试全解析
一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。 Spring Boot 分层架构: Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …...
用友NC系列漏洞检测利用工具
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 目录标题 YongYouNcTool启动及适配环境核心功能界面预览一键检测命令执…...
PostgreSQL 创建表格
PostgreSQL 创建表格 在数据库管理中,表格(Table)是数据存储的基础。PostgreSQL作为一款强大的开源对象关系型数据库管理系统(ORDBMS),创建表格是其最基本的功能之一。本文将详细讲解如何在PostgreSQL中创…...
一周一个Unity小游戏2D反弹球游戏 - 球的死区及球重生
前言 本文将实现当球弹到球板下方的死亡区域后,球会被重置到球板上发射点,并且重置物理状态的逻辑。 创建球的死亡区 之前创建的在屏幕下方的空气墙碰撞体可以将其Is Trigger勾选上,让其成为一个触发器,用来检测球是否进入该区域,如下。 创建一个脚本名为Deadzone…...
本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成
前言 随着人工智能技术的迅猛发展,越来越多的开发者希望在本地环境中部署和调用 AI 模型,以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型,并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…...
vue3:三项目增加404页面
一、路由添加 1、官网地址 带参数的动态路由匹配 | Vue Routerhttps://router.vuejs.org/zh/guide/essentials/dynamic-matching.html 2、复制核心语句 { path: /:pathMatch(.*)*, name: NotFound, component: NotFound } 3、粘贴到路由index.js中 4、建立页面 在view文件夹…...
MCAL(Microcontroller Abstraction Layer)介绍
目录 MCAL的核心作用 MCAL的模块组成 1. 微控制器驱动(Microcontroller Drivers) 2. I/O驱动(DIO, PWM, ADC等) 3. 通信驱动(Communication Drivers) 4. 存储驱动(Memory Drivers…...
爬虫:PhantomJS的详细使用和实战案例
文章目录 一、PhantomJS介绍1.1 什么是 PhantomJS1.2 PhantomJS 的特点与优势二、PhantomJS 的安装2.1 在 macOS 上安装 PhantomJS2.2 在 Linux 上安装 PhantomJS2.3 在 Windows 上安装 PhantomJS2.4 验证安装三、PhantomJS 的基本使用3.1 示例 1:打开网页并截图3.2 示例 2:获…...
目标检测——数据处理
1. Mosaic 数据增强 Mosaic 数据增强步骤: (1). 选择四个图像: 从数据集中随机选择四张图像。这四张图像是用来组合成一个新图像的基础。 (2) 确定拼接位置: 设计一个新的画布(输入size的2倍),在指定范围内找出一个随机点(如…...
深度学习工程师的技术图谱和学习路径
在构建一个深度学习工程师的技术图谱时,按照“技能树与能力模型”的结构可以帮助清晰地展示出技术体系的层次化关系,帮助学习者更好地理解每个技术点的依赖与顺序。 深度学习工程师的技术图谱和学习路径 以下是深度学习工程师的技能树,包括从基础到进阶的学习路径,以及对…...
Qt 文件操作+多线程+网络
文章目录 1. 文件操作1.1 API1.2 例子1,简单记事本1.3 例子2,输出文件的属性 2. Qt 多线程2.1 常用API2.2 例子1,自定义定时器 3. 线程安全3.1 互斥锁3.2 条件变量 4. 网络编程4.1 UDP Socket4.2 UDP Server4.3 UDP Client4.4 TCP Socket4.5 …...
如何使用ArcGIS Pro制作横向图例:详细步骤与实践指南
ArcGIS Pro,作为Esri公司推出的新一代地理信息系统(GIS)平台,以其强大的功能和灵活的操作界面,在地理数据处理、地图制作和空间分析等领域发挥着重要作用。 在地图制作过程中,图例作为地图的重要组成部分&…...
Kotlin 嵌套类和内部类
在Kotlin中,嵌套类(Nested Class)和内部类(Inner Class)是两种不同的类,它们在定义和使用上有一些区别。 1.嵌套类(Nested Classes)默认是静态的(即等同于Java中的stati…...
蓝蝶(BlueStacks)模拟器Root、Magisk、LSPosed及Shamiko框架安装与过应用检测指南
蓝蝶(BlueStacks)模拟器Root、Magisk、LSPosed及Shamiko框架安装与过应用检测指南 蓝蝶bluestacks模拟器root和magisk以及Lsposed和shamiko框架的安装过应用检测 一、引言 蓝蝶(BlueStacks)模拟器是一款广受欢迎的安卓模拟器&…...
OpenCV计算摄影学(6)高动态范围成像(HDR imaging)
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 高动态范围成像(HDR imaging)是一种图像处理技术,旨在通过增加图像的动态范围来更准确地表示真实世界的亮度差…...
[ComfyUI][AI生图]如何在Comfyui中安装插件管理器
如何在ComfyUI便携版中安装插件管理器 在现代软件环境中,图形用户界面(GUI)提供了一种直观的方式来与应用程序交互。ComfyUI是一个出色的GUI框架,它使用户能够通过图形化方式配置和管理他们的应用程序。特别是ComfyUI的便携版,它允许用户在没有安装的情况下使用这一工具,…...
初探Ollama与deepseek
什么是Ollama?它与大模型有什么联系? 简单说,Ollama就像是你电脑上的一个 “大模型小助手”。 以前,很多强大的大语言模型,比如能回答各种问题、写文章、翻译等的那些模型,要么只能在网上的服务器上用&am…...
Linux top 常用参数记录
top命令经常用来监控linux的系统状况,能实时显示系统中各个进程、线程的资源占用情况,是常用的性能分析工具。 一些常用参数记录 top的使用方式 top [-d number] | top [-bnp] # 5s 更新一次 top -d 5# 进行2次top命令的输出结果 top -n 2# 查看进程的…...
CCF-CSP认证 202104-1灰度直方图
题目描述 思路 首先输入矩阵长度、矩阵宽度和灰度范围,结果数组长度可固定,其中的元素要初始化为0。在输入灰度值的时候,结果数组中以该灰度值为索引的元素值1,即可统计每个灰度值的数量。 代码 C版: #include <…...
怎么下载安装yarn
安装 npm install --global yarn 是否安装成功 yarn -v Yarn 淘宝源安装,分别复制粘贴以下代码行到黑窗口运行即可 yarn config set registry https://registry.npm.taobao.org -g yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
