为React组件库引入自动化测试:从零到完善的实践之路
为什么我们需要测试?
我们的React+TypeScript业务组件库已经稳定运行了一段时间,主要承载各类UI展示组件,如卡片、通知等。项目初期,迫于紧张的开发周期,我们暂时搁置了自动化测试的引入。当时团队成员对组件逻辑了如指掌,即便没有测试也能游刃有余。
然而随着时间推移,问题逐渐显现。当新成员加入或老组件需要迭代时,我们常常陷入两难:修改代码可能破坏原有功能,但不修改又无法满足新需求。特别是在处理那些具有多种交互状态的复杂组件时,手动测试变得既耗时又不可靠。这时,引入自动化测试的必要性就凸显出来了。
搭建测试环境
依赖安装
我们首先从安装核心测试依赖开始,这些工具将构成我们测试体系的基础框架:
- 测试运行核心:jest和jsdom环境包
- TypeScript支持:确保类型安全的测试环境
- React测试工具:专门为React组件设计的测试工具链
npm install jest jest-environment-jsdom @types/jest ts-jest @testing-library/react @testing-library/jest-dom @testing-library/user-event --save-dev
配置Jest
创建jest.config.ts配置文件时,有几个关注点:
- 针对TypeScript项目的特殊处理
- 浏览器环境的模拟
- 测试初始化流程
- 文件转换规则
module.exports = {preset: "ts-jest", // 为 TypeScript 项目准备的 Jest 配置预设testEnvironment: "jsdom", // 测试运行在模拟的浏览器环境中setupFilesAfterEnv: ["<rootDir>/jest.setup.ts"], // 指定在测试环境初始化后立即执行的文件transform: {"^.+\\.(ts|tsx)$": "ts-jest", // 使用 ts-jest 处理所有 .ts 和 .tsx 文件},testPathIgnorePatterns: ["/node_modules/", "/dist/"], // 忽略指定目录下的测试文件moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], // 定义 Jest 能识别的模块文件扩展名
};export {}; // 使文件成为模块
创建jest.setup.ts文件引入断言库:
import "@testing-library/jest-dom";
TypeScript配置
修改tsconfig.json包含测试相关文件:
{"include": ["src","jest.config.ts","jest.setup.ts","__mocks__/**/*.ts"]
}
测试用例编写
我们以一个通知组件为例,该组件有两种UI形态:
- 标题和描述组合的时间内容文案提示
- 带有喇叭图标的提示,点击关闭按钮时调用接口保存用户状态
特殊依赖处理
组件中有三类特殊引入需要处理:
import './index.less';
import { noticeIcon, closeIcon } from "$src/common/icon";
import request from "$src/request";
1、处理 CSS/LESS 资源
Jest 默认无法解析 CSS/LESS 文件,我们可以通过配置将其模拟为空对象:
// jest.config.js
module.exports = {moduleNameMapper: {"\\.(less|css)$': '<rootDir>/__mocks__/styleMock.ts", // 指向一个空文件},
};// __mocks__/styleMock.ts
module.exports = {};
2、配置路径别名
对于 $src
这样的路径别名,需要在 Jest 配置中映射:
// jest.config.js
module.exports = {moduleNameMapper: {'^\\$src/(.*)$': '<rootDir>/src/$1',},
};
3、模拟图标资源
对于图标这类静态资源,我们可以在测试文件中直接模拟:
// __tests__/index.test.tsx
jest.mock('$src/common/icon', () => ({noticeIcon: 'notice-icon-path',closeIcon: 'close-icon-path',
}));
4、模拟 API 请求
对于网络请求模块,我们可以将其转换为 Jest 模拟函数:
// __tests__/index.test.tsx
import request from '$src/request';const mockedRequest = request as jest.MockedFunction<typeof request>;jest.mock('$src/request', () => ({__esModule: true, // 标识这是 ES Moduledefault: jest.fn(() => Promise.resolve({ data: {} })),
}));
通过以上配置,我们能够有效地隔离组件测试环境,专注于组件逻辑本身的测试,而不受样式、静态资源和网络请求等外部因素的影响。
基础测试框架搭建
我们首先建立测试的基本结构:
describe("Notification组件", () => {// 公共props定义const baseProps = {body: {},tokenId: "test-token",urlPrefix: "https://api.example.com",};// 每个测试用例前的清理工作beforeEach(() => {jest.clearAllMocks();mockedRequest.mockReset();});
});
核心测试场景覆盖
在配置好 Jest 测试环境后,我们将针对通知组件编写全面的测试用例。该组件具有两种展示形态和交互逻辑,我们将从四个关键维度进行测试覆盖:
1、边界情况测试
我们首先考虑最极端的场景——当传入无效props时,组件是否能够优雅处理:
it("当传入无效body时应安全地返回null", () => {const { container } = render(<Notification {...baseProps} body={null} />);expect(container.firstChild).toBeNull();
});
2、日期类型展示验证
对于日期类型的通知,我们需要确认:
- 关键文本是否正确渲染
- DOM结构是否符合预期
- 样式类是否准确应用
it("应正确渲染日期类型通知", () => {render(<Notification {...dateProps} />);expect(screen.getByText("今日公告")).toBeInTheDocument();expect(screen.getByText("2023-06-15")).toBeInTheDocument();const dateContainer = screen.getByText("今日公告").parentElement;expect(dateContainer).toHaveClass("notice-header-date");
});
3、广播类型交互测试
广播通知的测试更加复杂,需要验证:
- 初始状态下的元素展示
- 图标资源是否正确加载
- 点击关闭后的行为
describe("BROADCAST_TYPE 类型", () => {const broadcastProps = {...baseProps,body: {type: BROADCAST_TYPE,content: "重要通知内容",closeUrl: "/close-notice",},};it("初始状态下应该显示广播内容", () => {render(<Notification {...broadcastProps} />);// 验证内容expect(screen.getByText("重要通知内容")).toBeInTheDocument();// 验证图片const images = screen.getAllByRole("img");expect(images[0]).toHaveAttribute("src", "notice-icon-path");expect(images[1]).toHaveAttribute("src", "close-icon-path");// 验证类名const broadcastContainer = screen.getByText("重要通知内容").closest(".h5link-notice-header-broadcast");expect(broadcastContainer).toBeInTheDocument();});it("点击关闭按钮后应该隐藏广播内容", () => {render(<Notification {...broadcastProps} />);// 找到关闭按钮(假设是最后一个img元素)const closeButton = screen.getAllByRole("img")[1].parentElement;fireEvent.click(closeButton!);expect(screen.queryByText("重要通知内容")).not.toBeInTheDocument();});
});
4、网络请求场景全覆盖
对于涉及API调用的场景,我们设计了多维度测试:
- 正常请求流程
- 无请求场景请求
- 失败处理
- 请求中的状态管理
describe("网络请求测试", () => {const broadcastPropsWithCloseUrl = {...baseProps,body: {type: BROADCAST_TYPE,content: "重要通知内容",closeUrl: "/close-notice",},};const broadcastPropsWithoutCloseUrl = {...baseProps,body: {type: BROADCAST_TYPE,content: "重要通知内容",// 没有closeUrl},};it("点击关闭时应该发送请求", async () => {// 模拟请求成功mockedRequest.mockResolvedValue({ data: {} });render(<Notification {...broadcastPropsWithCloseUrl} />);const closeButton = screen.getAllByRole("img")[1].parentElement;await act(async () => {fireEvent.click(closeButton!);});//验证请求参数expect(request).toHaveBeenCalledWith({url: "https://api.example.com/close-notice",method: "post",data: {},headers: {tokenId: "test-token",},});// 验证UI更新expect(screen.queryByText("重要通知内容")).not.toBeInTheDocument();});it("当没有closeUrl时不发送请求", async () => {render(<Notification {...broadcastPropsWithoutCloseUrl} />);const closeButton = screen.getAllByRole("img")[1].parentElement;await act(async () => {fireEvent.click(closeButton!);});expect(request).not.toHaveBeenCalled();// 验证UI仍然会更新expect(screen.queryByText("重要通知内容")).not.toBeInTheDocument();});it("请求失败时仍然关闭通知", async () => {// 模拟请求失败mockedRequest.mockResolvedValue(new Error("Request failed"));render(<Notification {...broadcastPropsWithCloseUrl} />);const closeButton = screen.getAllByRole("img")[1].parentElement;await act(async () => {fireEvent.click(closeButton!);});// 验证即使请求失败,UI也会更新expect(screen.queryByText("重要通知内容")).not.toBeInTheDocument();expect(request).toHaveBeenCalled();});it("请求期间UI应保持响应", async () => {// 创建一个未立即resolve的Promiselet resolveRequest: any;const promise = new Promise((resolve) => {resolveRequest = resolve;});mockedRequest.mockReturnValue(promise);render(<Notification {...broadcastPropsWithCloseUrl} />);const closeButton = screen.getAllByRole("img")[1].parentElement;// 第一次点击fireEvent.click(closeButton!);// 验证UI已立即更新expect(screen.queryByText("重要通知内容")).not.toBeInTheDocument();// 完成请求await act(async () => {resolveRequest({ data: {} });});
});
测试执行与覆盖率
基础测试执行
在完成通知组件的测试用例编写后,可以在 package.json 中配置测试脚本:
{"scripts": {"test": "jest"}
}
执行 npm run test 命令后,如下图所示,Jest 会在终端输出测试结果,包括:
- 测试文件数量
- 通过的测试用例数
- 失败的测试用例详情(包含错误堆栈信息)
覆盖率报告配置
为了更全面地评估测试质量,可以通过修改 jest.config.ts 启用覆盖率统计:
module.exports = {collectCoverage: true, // 启用覆盖率收集coverageDirectory: "coverage", // 指定覆盖率报告的输出目录coverageReporters: ["text", "html", "lcov", "clover"], //指定生成的覆盖率报告格式coverageThreshold: {// 设置覆盖率的最低阈值,如果未达标,Jest 会报错global: {// 全局覆盖率要求branches: 80,functions: 80,lines: 80,statements: 80,},"./src/components/**/*.tsx": {// 针对特定目录/文件设置更高要求branches: 90,functions: 90,lines: 90,statements: 90,},},
}
执行测试后:终端会显示各维度的覆盖率百分比,在 coverage/ 目录下生成详细报告:index.html 提供可视化分析可逐层查看未覆盖的代码路径。
示例输出中显示 common/util.ts 仅 32.39% 覆盖率,低于预设阈值。此时应该优先补充核心工具函数的测试用例。通过持续完善测试覆盖,可以有效提升组件迭代的可靠性,并为后续重构提供安全保障。
通过引入自动化测试,我们实现了从"人肉测试"到系统化保障的转变。精心设计的测试用例覆盖了各种边界情况,配合覆盖率分析,构建了多层次的质量防护体系。
如果你对前端工程化有兴趣,或者想了解更多前端相关的内容,欢迎查看我的其他文章,这些内容将持续更新,希望能给你带来更多的灵感和技术分享~
相关文章:
为React组件库引入自动化测试:从零到完善的实践之路
为什么我们需要测试? 我们的ReactTypeScript业务组件库已经稳定运行了一段时间,主要承载各类UI展示组件,如卡片、通知等。项目初期,迫于紧张的开发周期,我们暂时搁置了自动化测试的引入。当时团队成员对组件逻辑了如指…...
数据结构——算法复杂度
一、数据结构定义 数据结构(Data Structure)是计算机存储、组织数据的⽅式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有⽤途都有⽤,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希…...
Vue3响应式原理那些事
文章目录 1 响应式基础:Proxy 与 Reflect1.1 Proxy 代理拦截1.2 Reflect 确保 `this` 指向正确1.2.1 修正 `this` 指向问题1.2.2 统一的操作返回值1.3 与 Vue2 的对比2 依赖收集与触发机制2.1 全局依赖存储结构:WeakMap → Map → Set2.2 依赖收集触发时机2.3 依赖收集核心实…...
记9(Torch
目录 1、Troch 1、Troch 函数说明举例torch.tensor()torch.arange()创建张量创建一个标量:torch.tensor(42)创建一个一维张量:torch.tensor([1, 2, 3])创建一个二维张量:torch.tensor([[1, 2], [3, 4]])生成一维等差张量:语法&am…...
机器学习模型训练模块技术文档
一、模块结构概览 import numpy as np from sklearn.model_selection import cross_validate, learning_curve from sklearn.pipeline import make_pipeline from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier from sklearn.preprocessing imp…...
健康养生:从微小改变开始
养生不必大刀阔斧,几个微小改变,就能让健康慢慢扎根生活。晨起别急着洗漱,先花 5 分钟靠墙站立,拉伸脊柱、调整体态,唤醒身体。早餐把白米粥换成杂粮粥,搭配水煮蛋和一小碟凉拌黄瓜,营养更全面。…...
某信服EDR3.5.30.ISO安装测试(二)
一、物理机启动EDR 1、修复dracut 使用DiskGenius克隆虚拟磁盘到物理磁盘,将虚拟机移植到物理机,因为磁盘UUID变化等原因,首次默认启动失败,提示: Starting Dracut Emergency Shell... Warning:/dev/centos/root doe…...
Leetcode:回文链表
1、题目描述 给定一个链表的 头节点 head ,请判断其是否为回文链表。 如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。 示例 1: 输入: head [1,2,3,3,2,1] 输出: true 示例 2: 输入: head [1,2] 输出: …...
IL2CPP 技术深度解析
IL2CPP 是 Unity 开发的高性能脚本后端,它将 .NET 的中间语言 (IL) 转换为 C 代码,再编译为原生平台二进制文件。以下是 IL2CPP 的全面技术剖析。 一、架构设计原理 1. 整体编译流程 C# 源代码 → Roslyn 编译器 → IL (.NET DLL)→ IL2CPP 转换器 →…...
AI图片修复工具,一键操作,图片更清晰!
泛黄的老相册里藏着一座记忆博物馆,每张照片都是时光长河中的琥珀。祖父军装照上的折痕里藏着抗美援朝的故事,父母结婚照褪色的红唇映照着八十年代的风尚,童年抓拍照上模糊的身影正重演着我们成长的轨迹。这些承载着集体记忆的影像࿰…...
国内短剧 vs. 海外短剧系统:如何选择?2025年深度对比与SEO优化指南
在短剧市场爆发式增长的背景下,国内与海外短剧系统成为创业者与企业的热门选择。本文将从市场潜力、开发成本、内容创作、盈利模式及风险五大维度,结合最新行业数据与案例,深度解析两者的优劣势,助您做出最优决策。 一、市场前…...
linux crash工具详解
crash 是 Linux 系统中用于分析内核转储文件(如 vmcore 或 kdump 生成的 dump 文件)的核心工具。它结合了调试符号和内核数据结构,能够直观地查看崩溃时的系统状态。以下是其详细使用方法及核心功能解析: 一、安装与准备 1. 安装…...
Scala day6(Class,field,Single Object)
Foreword【こんにちは】 Today, we continue to learn Scala Language, though the Scala isn’t easy for Begainner, Big Data Technology need Scala Language, Spark【Distributed Calculation FrameWork】is based on Scala Language designed. I know the learning road…...
不小心把当前的环境变量路径覆盖掉怎么办
起因 配置环境变量(~/.bashrc)的时候没加:$PATH,导致 source ~/.bashrc之后只剩下刚刚配置的环境变量了。连vim都打不开 解决 添加临时环境变量export PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH再重新修改…...
unity TMP字体使用出现乱码方框
参考文章: Unity 设置默认字体(支持老版及新版TMP)_unity tmp字体-CSDN博客 原因是导入的项目package包没有连着tmp一起,这样在新工程中导入的tmp字体默认的是tmp自己的,解决方案就是替换成自己需要的tmp字体就行 替换…...
14.网络钓鱼实战
网络钓鱼实战 第一部分:网络钓鱼攻击详解第二部分:设计与分析钓鱼攻击第三部分:钓鱼攻击防范实践总结 目标: • 深入理解网络钓鱼攻击的实施过程 • 掌握设计和识别钓鱼攻击的技巧 • 通过模拟实践提升防范钓鱼攻击的能力 第一部分…...
pyqt写一个单片机配置界面
已经实现以下功能 1.可以选择单片机架构 2.选择完单片机架构后第二个框可以选择常见单片机型号 3.选择完常见单片机型号后第三个框可以选择内部资源如adc等(可以选择多个内部资源)4.选择完内部资源如adc等(可以选择多个内部资源)后…...
「Mac畅玩AIGC与多模态20」开发篇16 - 使用结构化输出字段控制后续流程示例
一、概述 本篇介绍如何在工作流中使用结构化输出字段作为判断依据,实现前后节点联动控制。通过执行 LLM 节点输出结构化 JSON,并使用其中的字段驱动后续判断节点执行不同路径,开发人员将掌握结构化字段在工作流中的引用方式与分支控制技巧。…...
Unity-Shader详解-其四
今天我们来聊Unity特有的表面着色器以及很少提到的几何着色器。 表面着色器 在前文关于光照的计算中,我们学会了很多:我们学习了一系列光照模型,比如专门针对漫反射的兰伯特模型和改进的半兰伯特模型,又比如由高光、漫反射和环境…...
Lua 元表和元方法
元表(Metatable)和元方法(Metamethod)是Lua中实现面向对象编程、操作符重载和自定义行为的重要机制。 元表 元表是一个普通的Lua表,可以附加到另一个表上,用于定义或修改该表的行为。每个表都可以有自己的元表。 setmetatable(tab,metatab) 将metatab设…...
GESP2024年3月认证C++八级( 第二部分判断题(6-10))
海伦公式参考程序: #include <iostream> #include <cmath> // 引入cmath库以使用sqrt函数using namespace std;double calculateTriangleArea(int a, int b, int c) {// 使用海伦公式double s (a b c) / 2.0; // 半周长return sqrt(s * (s - a) *…...
Nacos源码—3.Nacos集群高可用分析一
大纲 1.Nacos集群的几个问题 2.单节点对服务进行心跳健康检查和同步检查结果 3.集群新增服务实例时如何同步给其他节点 4.集群节点的健康状态变动时的数据同步 5.集群新增节点时如何同步已有服务实例数据 1.Nacos集群的几个问题 问题一:在单机模式下ÿ…...
信息系统项目管理师-软考高级(软考高项)2025最新(九)
个人笔记整理---仅供参考 第九章项目范围管理 9.1管理基础 9.2项目范围管理过程 9.3规划范围管理 9.4收集需求 9.5定义范围 9.6创建WBS 9.7确认范围 9.8控制范围...
DeepSeek学术论文写作全流程指令
一、选题与领域界定 研究热点捕捉 指令: “在[研究领域]中,现有文献对[具体问题]的[哪方面]研究不足?基于近5年文献归纳3个待突破方向,需结合高频关键词和交叉学科维度。” 示例: “在深度学习医疗影像分析中,现有文献对小样本训练的泛化性研究不足?基于2019-2023年顶会…...
【ArUco boards】标定板检测
之前定位用的Charuco标定板做的(https://blog.csdn.net/qq_45445740/article/details/143897238),因为实际工况中对标定板的尺寸有要求,大概是3cm*2cm这个尺寸,加上选用的是ChAruco标定板,导致每一个aruco码…...
2025 年 408 真题及答案
2025 年 408 真题 历年408真题及答案下载直通车 1、以下 C 代码的时间复杂度是多少?() int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、对于括号匹配问题,符号栈…...
设计模式每日硬核训练 Day 18:备忘录模式(Memento Pattern)完整讲解与实战应用
🔄 回顾 Day 17:中介者模式小结 在 Day 17 中,我们学习了中介者模式(Mediator Pattern): 用一个中介者集中管理对象之间的通信。降低对象之间的耦合,适用于聊天系统、GUI 控件联动、塔台调度等…...
ByteArrayOutputStream 类详解
ByteArrayOutputStream 类详解 ByteArrayOutputStream 是 Java 中用于在内存中动态写入字节数据的输出流(ByteArrayOutputStream和ByteArrayInputStream是节点流),位于 java.io 包。它不需要关联物理文件或网络连接,所有数据都存储在内存的字节数组中。 1. 核心特性 内存缓冲…...
Linux中web服务器的部署及优化
前言:Nginx 和 Apache HTTP Server 是两款非常流行的 Web 服务器。 Nginx 简介:Nginx 是一款轻量级的高性能 Web 服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。由俄罗斯人伊戈尔・赛索耶夫开发,其在处…...
使用Mathematica绘制Sierpinski地毯
在Mathematica中内置的绘制Sierpinski地毯的函数: SierpinskiCurve[n] gives the line segments representing the n-step Sierpiński curve. 注意,直接运行这个函数,返回的是Line对象,例如: 运行如下代码…...
Qt 信号槽机制底层原理学习
简介 Qt的信号和槽(Signals and Slots)是Qt开发团队创造的一种特殊回调机制,提供了非常简洁易用的事件触发-函数调用机制。 原理学习 虽然上层使用简单,但底层实现机制却复杂的不得了,这里简单的学习一下大概原理。…...
【Java学习笔记】包
包(package) 包的本质:实际上就是创建不同的文件夹或者目录来保存类文件 包的三大作用 区分相同名字的类 当类很多的时候可以更方便的管理类 控制访问范围 使用方法 关键字:import—>导入(引入) …...
进程的程序替换——exec系列函数的使用
目录 前言 一、替换函数 二、程序替换的本质 一些细节: 三、程序替换与环境变量间的关系 1.介绍其他参数的意义并总结 2.自定义环境变量 1)通过execcle传参全局环境变量 2)通过execcle传参自定义环境变量 3)将自定义环境变量通过p…...
【论文阅读】DETR+Deformable DETR
可变形注意力是目前transformer结构中经常使用的一种注意力机制,最近补了一下这类注意力的论文,提出可变形注意力的论文叫Deformable DETR,是在DETR的基础上进行的改进,所以顺带着把原本的DETR也看了一下。 一、DETR DETR本身是…...
ArchLinux卡死在GRUB命令行模式修复
ArchLinux卡死在GRUB命令行模式修复 文章目录 ArchLinux卡死在GRUB命令行模式修复前言一、 系统配置1.系统配置2.磁盘分区信息 二、重建GRUB引导1.插入带ArchLinux ISO的U盘,BIOS选择U盘启动并进入ArchLinux安装界面。2.挂载btrfs根目录分区3.挂载/boot分区4.进入ch…...
Docker 容器 - Dockerfile
Docker 容器 - Dockerfile 一、Dockerfile 基本结构二、Dockerfile 指令详解2.1 FROM2.2 MAINTAINER2.3 COPY2.4 ADD2.5 WORKDIR2.6 VOLUME2.7 EXPOSE2.8 ENV2.9 RUN2.10 CMD2.11 ENTRYPOINT 三、Dockerfile 创建镜像与模板3.1 Dockerfile 镜像3.2 镜像管理3.3 Dockerfile 模板…...
C++ 中二级指针的正确释放方法
C 中二级指针的正确释放 一、什么是二级指针? 简单说,二级指针就是指向指针的指针。 即: int** p;它可以指向一个 int*,而 int* 又指向一个 int 类型的变量。 常见应用场景 动态二维数组(例如 int** matrix&#x…...
解释器模式(Interpreter Pattern)
解释器模式(Interpreter Pattern) 是行为型设计模式之一,通常用于处理“语言”类问题,比如计算器、编程语言的解析等。它的核心思想是通过建立一个解释器,解析并解释由语法规则描述的语言,通常以**抽象语法…...
编译原理期末重点-个人总结——1 概论
概述 计算机语言的分类 低级语言:机器语言(唯一能被计算机执行的),汇编语言 高级语言:JAVA ,C 执行高级语言或汇编语言的步骤 高级语言程序或汇编语言程序> (通过解释 或 翻译)转…...
五一作业-day04
文章目录 1. **ps -ef是显示当前系统进程的命令,统计下当前系统一共有多少进程**2. **last命令用于显示所用用户最近1次登录情况,awk可以取出某一列,现在要取出last命令第1列并去重统计次数**3. **secure日志是用户的登录日志,过滤出secure日志中的Failed password的次数(用课堂…...
Java按字节长度截取字符串指南
在Java中,由于字符串可能包含多字节字符(如中文),直接按字节长度截取可能会导致乱码或截取不准确的问题。以下是几种按字节长度截取字符串的方法: 方法一:使用String的getBytes方法 java public static String substringByBytes(…...
[特殊字符]Git 操作实战:如何将本地项目提交到远程 Gitee 仓库
在日常开发中,我们经常需要将本地开发的项目同步到远程代码仓库中(如 GitHub、Gitee 等),以便团队协作或备份管理。本文将以 Gitee(码云) 为例,详细讲解如何将本地已有项目提交到远程仓库&#…...
【信息系统项目管理师-论文真题】2008上半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题1:企业级信息系统项目管理体系的建立1、写作要点2、解题思路项目管理流程和项目管理的工具试题2:项目的质量管理1、写作要点2、解题思路项目的早期阶段如何制定项目质量管理计划如何确保项目质量管理计划…...
C语言|函数的递归调用
函数的递归调用 (逐层分解,逐层合并) 自己调用自己,必须要知道什么时候停止调用,不然会造成电脑死机。 【知识点】 1 函数调用是通过栈实现的。 多个函数嵌套调用时,会按照先调用后返回的原则进行返回。 2 函数递归必须满足的两…...
QT 在圆的边界画出圆
QT 在圆的边界画出圆 QT 在圆的边界画出实心圆 在Qt中,要实现在圆的边界上绘制图形,你需要使用QPainter类来在QWidget或其子类的paintEvent中绘制。下面我将通过一个简单的例子来说明如何在Qt中绘制一个圆,并在其边界上绘制其他图形&#x…...
Guass数据库实验(数据字典设计、交叉表设计)
Assignment 2: Database Design 目录 Assignment 2: Database Design 数据库创建 新建用户bit,并创建数据库模式ass2 使用datastdui以该用户远程登陆 创建学科数据字典相关表 学科门类表 一级学科表 二级学科表 三级学科表 学科变更历史表 插入数据字典…...
算法题(139):牛可乐和魔法封印
审题: 本题需要我们将数组中包含在区间x~y之间的数据个数找到并输出 思路: 方法一:暴力解法 首先我们可以直接遍历一次数组,找到x的索引,然后再找到y的索引,并计算最终的元素个数,这里就要有O&a…...
LeetCode热题100--189.轮转数组--中等
1. 题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,…...
DeepSeek-Prover-V2:数学定理证明领域的新突破
前言 在人工智能飞速发展的当下,模型的迭代与创新层出不穷。 五一假期期间,DeepSeek 再次发力,推出了令人瞩目的新模型 ——DeepSeek-Prover-V2。 与大众期待的 R2 通用推理模型不同,这次 DeepSeek 将目光聚焦于数学定理证明领…...
调试——GDB、日志
调试——GDB、日志 1. gdb常用指令2. 如何生成core文件并调试?3. 如何调试正在运行的程序4. 调试多进程程序5. 调试多线程程序6. log日志 gcc编译器可以帮我们发现语法错误,但是对业务逻辑错误却无能为力。当我们想找出逻辑错误时,就需要调试…...