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/…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...