react+jest+enzyme配置及编写前端单元测试UT
文章目录
- 安装及配置
- enzyme渲染
- 测试技巧
- 一、常见测试
- 二、触发ant design组件
- 三、使用redux组件
- 四、使用路由的组件
- 五、mock接口网络请求
- 六、mock不需要的子组件
安装及配置
- 安装相关库:
首先,使用npm或yarn安装所需的库。
npm install --save-dev jest enzyme enzyme-adapter-react-16 enzyme-to-json
- 配置Jest:
在项目根目录下创建一个jest.config.js
文件,并配置Jest。
// jest.config.js
module.exports = {setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],testEnvironment: 'jsdom',moduleNameMapper: {'\\.(css|less)$': 'identity-obj-proxy',},
};
在上述配置中,设置了setupFilesAfterEnv
为src/setupTests.js
,指定了测试环境为jsdom
,并设置了模块名称映射以处理CSS和LESS文件。
- 创建
setupTests.js
文件:
在项目的src
目录下创建一个setupTests.js
文件,并进行Enzyme的初始化和配置。
// src/setupTests.js
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';Enzyme.configure({ adapter: new Adapter() });
在上述代码中,导入Enzyme和Enzyme适配器,并使用适配器初始化Enzyme。
- 编写测试用例:
在测试目录中创建一个与要测试的组件对应的测试文件,并编写测试用例。
import React from 'react';
import { mount } from 'enzyme';
import YourComponent from '../YourComponent';describe('YourComponent', () => {it('renders correctly', () => {const component = mount(<YourComponent />);expect(component.find('.your-class').text()).toBe('Hello World');});
});
在上述代码中,使用mount
方法来渲染组件,并使用Enzyme提供的API来查找组件中的元素,并进行断言验证。
- 运行测试:
在终端中运行测试命令,以执行测试用例。
npm run test
Jest将自动查找并执行项目中以.test.js
或.spec.js
结尾的文件中的测试用例。
enzyme渲染
Enzyme提供了三种常用的渲染方式,分别是shallow
、mount
和render
。这些渲染方式在测试组件时具有不同的特点和用途。
shallow
渲染:
shallow
渲染是Enzyme的浅层渲染方式,它仅渲染被测试组件本身,而不渲染其子组件。
import { shallow } from 'enzyme';
import YourComponent from '../YourComponent';test('测试组件渲染', () => {const wrapper = shallow(<YourComponent />);// 对被测试组件进行断言和验证
});
使用shallow
渲染时,被测试组件的子组件将被替换为占位符,并且无法直接访问子组件。这使得测试更加轻量且快速,适用于对被测试组件本身的行为进行测试。
mount
渲染:
mount
渲染是Enzyme的全渲染方式,它会将被测试组件及其子组件完全渲染到真实的DOM中。这使得可以模拟实际的组件嵌套和交互,并对其进行全面的测试。
import { mount } from 'enzyme';
import YourComponent from '../YourComponent';test('测试组件渲染', () => {const wrapper = mount(<YourComponent />);// 对被测试组件及其子组件进行断言和验证
});
使用mount
渲染时,被测试组件及其子组件将在真实的DOM中进行渲染和交互。这使得可以测试组件的交互、生命周期方法和子组件的行为。
render
渲染:
render
渲染是Enzyme的静态渲染方式,它将组件渲染为静态的HTML字符串,不涉及真实的DOM操作。这使得可以对组件的输出进行快照测试,以验证其渲染结果是否符合预期。
import { render } from 'enzyme';
import YourComponent from '../YourComponent';test('测试组件渲染', () => {const wrapper = render(<YourComponent />);// 对组件输出的HTML进行断言和验证
});
使用render
渲染时,被测试组件及其子组件将以静态HTML字符串的形式输出,可以方便地进行快照测试。
下面的例子中使用到的渲染方式只是举例,结合实际情况使用mount、shalldow或者render都是可以的。
测试技巧
一、常见测试
- 示例:测试组件渲染和属性传递
假设有一个简单的React组件Button
,接收一个label
属性,并在按钮上显示该标签。可以编写一个测试用例来验证组件是否正确渲染和传递属性。
import React from 'react';
import { shallow } from 'enzyme';
import Button from '../Button';describe('Button', () => {it('renders correctly with label prop', () => {const label = 'Click me';const wrapper = shallow(<Button label={label} />);expect(wrapper.text()).toBe(label);});
});
在上述例子中,使用shallow
渲染方法来渲染Button
组件,并使用expect
和toBe
断言验证按钮上的文本是否与传递的标签相匹配。
- 示例:模拟事件处理
假设有一个表单组件LoginForm
,其中包含一个提交按钮。可以编写一个测试用例来模拟按钮点击事件,并验证相应的事件处理函数是否被调用。
import React from 'react';
import { mount } from 'enzyme';
import LoginForm from '../LoginForm';describe('LoginForm', () => {it('calls onSubmit handler on button click', () => {const onSubmit = jest.fn();const wrapper = mount(<LoginForm onSubmit={onSubmit} />);wrapper.find('button').simulate('click');expect(onSubmit).toHaveBeenCalledTimes(1);});
});
在上述例子中,使用mount
渲染方法来渲染LoginForm
组件,并使用simulate
方法模拟按钮的点击事件。然后,使用expect
和toHaveBeenCalledTimes
断言验证onSubmit
函数是否被调用了一次。
- 示例:异步操作的处理
如果组件中包含异步操作,可以使用async/await
或done
回调函数来处理异步测试。
import React from 'react';
import { mount } from 'enzyme';
import AsyncComponent from '../AsyncComponent';describe('AsyncComponent', () => {it('renders data correctly after fetching', async () => {const fetchData = () => {return new Promise((resolve) => {setTimeout(() => {resolve('Data');}, 1000);});};const wrapper = mount(<AsyncComponent fetchData={fetchData} />);expect(wrapper.text()).toBe('Loading...');await Promise.resolve(); // 等待异步操作完成wrapper.update();expect(wrapper.text()).toBe('Data');});
});
在上述例子中,使用await
关键字等待异步操作的完成,并使用wrapper.update()
手动更新组件,以便正确渲染异步操作后的数据。
二、触发ant design组件
使用Ant Design的组件时,可以通过模拟事件或直接调用组件的方法来触发各种操作。下面是一些常见组件的触发方法示例:
- Input 输入框:
import { mount } from 'enzyme';
import { Input } from 'antd';test('触发Input输入', () => {const wrapper = mount(<Input />);// 模拟输入wrapper.find('input').simulate('change', { target: { value: 'Hello' } });// 模拟回车wrapper.find('input').simulate('keydown', { keyCode: 13, which: 13 }
});
// 模拟失去焦点
test('模拟输入框失去焦点', () => {const onBlur = jest.fn(); // 失去焦点时调用的函数const wrapper = mount(<YourComponent onBlur={onBlur} />);// 找到输入框元素,并触发失去焦点事件wrapper.find('input').simulate('blur');wrapper(onBlur).toHaveBeenCalled();
});
在上述例子中,使用simulate
方法模拟输入框的change
事件,并传递了一个模拟的event
对象,其中target.value
表示输入的值。
- Select 选择器:
import { mount } from 'enzyme';
import { Select } from 'antd';test('直接调用Select方法更新选项', () => {const wrapper = mount(<Select><Select.Option value="option1">Option 1</Select.Option><Select.Option value="option2">Option 2</Select.Option></Select>);const selectInstance = wrapper.find('Select').instance();// 更新选项selectInstance.updateOptions([{ value: 'option3', label: 'Option 3' },{ value: 'option4', label: 'Option 4' },]);
});
在上述例子中,使用 simulate 方法模拟点击下拉菜单按钮的 mousedown 事件,然后模拟点击第一个选项的 click 事件来选择该选项。
- Checkbox 复选框:
import { mount } from 'enzyme';
import { Checkbox } from 'antd';test('触发Checkbox选择', () => {const wrapper = mount(<Checkbox>Checkbox</Checkbox>);wrapper.find('input').simulate('change', { target: { checked: true } });
});
在上述例子中,使用simulate
方法模拟复选框的change
事件,并传递了一个模拟的event
对象,其中target.checked
表示复选框的选中状态。
- Dropdown 下拉菜单:
import { mount } from 'enzyme';
import { Dropdown, Menu } from 'antd';test('触发Dropdown菜单', () => {const menu = (<Menu><Menu.Item key="1">Option 1</Menu.Item><Menu.Item key="2">Option 2</Menu.Item></Menu>);const wrapper = mount(<Dropdown overlay={menu}><a href="#">Dropdown</a></Dropdown>);wrapper.find('a').simulate('click');
});
在上述例子中,使用simulate
方法模拟下拉菜单的触发事件,例如click
事件。
- 模拟文件上传
在React中,由于安全性的限制,不能直接模拟文件上传的完整流程。但是,可以通过模拟触发change
事件来模拟用户选择文件的行为。这样可以触发相应的文件上传逻辑。
以下是一个示例代码,演示了如何使用simulate
方法来模拟文件上传:
import { mount } from 'enzyme';test('模拟文件上传', () => {const onFileUpload = jest.fn(); // 模拟文件上传时调用的函数const wrapper= mount(<YourComponent onFileUpload={onFileUpload} />);// 创建一个模拟的File对象const file = new File(['文件内容'], 'filename.txt', { type: 'text/plain' });// 创建一个模拟的事件对象,设置target.files为模拟的File对象const event = {target: { files: [file] },};// 找到文件上传的input元素,并触发change事件wrapper.find('input[type="file"]').simulate('change', event);expect(onFileUpload).toHaveBeenCalledWith(file);
});
在上述代码中,创建了一个模拟的File
对象,并将其作为事件对象的target.files
属性。然后,使用simulate
方法触发了一个change
事件,模拟文件选择的操作。最后,使用expect
断言来验证回调函数onFileUpload
是否被调用,并传递了模拟的文件对象作为参数。
这些是一些常见Ant Design组件的触发方法示例。根据具体的组件和需求,可以使用适当的方法来模拟事件触发或直接调用组件的方法。
三、使用redux组件
当编写涉及Redux的组件的单元测试时,可以采取以下措施以确保测试不会报错:
- 模拟Redux Store:
在测试中,可以创建一个模拟的Redux Store,并将其传递给组件作为属性。可以使用类似于redux-mock-store
的库来创建模拟的Store。
import React from 'react';
import { shallow } from 'enzyme';
import configureMockStore from 'redux-mock-store';
import YourComponent from '../YourComponent';const mockStore = configureMockStore();
const initialState = {// 初始状态
};
const store = mockStore(initialState);describe('YourComponent', () => {it('renders without errors', () => {const wrapper = shallow(<YourComponent store={store} />);expect(wrapper).toBeTruthy();});
});
在上述例子中,使用redux-mock-store
库创建了一个模拟的Store,并将其传递给YourComponent
作为属性。
- 使用Provider组件:
在测试中,使用Redux的Provider组件将模拟的Store包装在组件的外部。这样可以确保组件在测试中能够访问到Redux的状态和行为。
import React from 'react';
import { shallow } from 'enzyme';
import { Provider } from 'react-redux';
import configureMockStore from 'redux-mock-store';
import YourComponent from '../YourComponent';const mockStore = configureMockStore();
const initialState = {// 初始状态
};
const store = mockStore(initialState);describe('YourComponent', () => {it('renders without errors', () => {const wrapper = shallow(<Provider store={store}><YourComponent /></Provider>);expect(wrapper).toBeTruthy();});
});
在上述例子中,使用Redux的Provider组件将模拟的Store包装在YourComponent
的外部,以确保组件在测试中能够正确连接到Redux。
- 测试Redux相关的行为:
在编写单元测试时,除了测试组件的渲染和行为外,还可以编写专门测试Redux相关行为的测试用例。例如,测试Redux的action创建函数、reducer函数和异步操作的处理等。
四、使用路由的组件
当编写涉及React Router的组件的单元测试时,可以采取以下措施来处理受到影响的组件:
- 使用MemoryRouter:
在测试中,使用MemoryRouter
来包装被测试的组件。MemoryRouter
是React Router提供的一个用于测试的特殊路由器组件,它在内存中维护路由状态,不会对浏览器URL进行实际更改。
import React from 'react';
import { shallow } from 'enzyme';
import { MemoryRouter } from 'react-router-dom';
import YourComponent from '../YourComponent';describe('YourComponent', () => {it('renders without errors', () => {const wrapper = shallow(<MemoryRouter><YourComponent /></MemoryRouter>);expect(wrapper).toBeTruthy();});
});
在上述例子中,使用MemoryRouter
将被测试的组件包装在内部,以便在测试中模拟路由。
- 使用StaticRouter:
如果组件使用了Server-Side Rendering(SSR),可以使用StaticRouter
来模拟服务器端渲染的路由。
import React from 'react';
import { shallow } from 'enzyme';
import { StaticRouter } from 'react-router-dom';
import YourComponent from '../YourComponent';describe('YourComponent', () => {it('renders without errors', () => {const context = {};const wrapper = shallow(<StaticRouter location="/your-path" context={context}><YourComponent /></StaticRouter>);expect(wrapper).toBeTruthy();});
});
在上述例子中,使用StaticRouter
来模拟服务器端渲染的路由,并通过location
属性设置当前的路径。
- 使用
BrowserRouter
和Router
:
如果组件使用了BrowserRouter
或自定义的Router
组件,可以在测试中直接使用这些组件,并通过history
属性模拟路由历史记录。
import React from 'react';
import { shallow } from 'enzyme';
import { BrowserRouter, Router } from 'react-router-dom';
import YourComponent from '../YourComponent';
import { createMemoryHistory } from 'history';describe('YourComponent', () => {it('renders without errors', () => {const history = createMemoryHistory();const wrapper = shallow(<Router history={history}><YourComponent /></Router>);expect(wrapper).toBeTruthy();});
});
在上述例子中,使用createMemoryHistory
创建一个内存中的history
对象,并将其通过Router
组件传递给被测试的组件。
五、mock接口网络请求
- mock 接口请求
// @/servise/XXX 是我自己封装的功能请求的相对地址
// 方法一
jest.mock('@/servise/XXX', ()=>({
getData: Promise.resove({res:{}})
));
// 方法二
import service from '@/service/XXX';
service.getData= ()=>Promise.resolve({res:{}})
2.自定义模拟的请求和返回数据
import YourComponent from '../YourComponent';
import axios from 'axios';jest.mock('axios');describe('YourComponent', () => {it('should handle API request', async () => {// 自定义模拟的请求和返回数据const mockResponseData = { name: 'John Doe' };axios.get.mockResolvedValue({ data: mockResponseData });// 执行组件中的接口请求const component = new YourComponent();await component.fetchData();// 验证结果expect(component.data).toEqual(mockResponseData);});
});
六、mock不需要的子组件
要 mock 掉不需要的子组件,可以使用 jest.mock
和 jest.fn
(或 jest.mock
中的 jest.fn
)来模拟子组件的导入。
下面是一个示例,演示如何 mock 掉不需要的子组件:
import React from 'react';
import { shallow } from 'enzyme';
import ParentComponent from '../ParentComponent';
import ChildComponent from '../ChildComponent';jest.mock('../ChildComponent', () => jest.fn(() => null));describe('ParentComponent', () => {it('should render without the ChildComponent', () => {const wrapper = shallow(<ParentComponent />);expect(wrapper.find(ChildComponent)).toHaveLength(0);});
});
在上述例子中,使用 jest.mock
来模拟 ChildComponent
的导入,并将其替换为一个匿名的空函数组件。这样,在渲染 ParentComponent
时,ChildComponent
实际上会被替换为一个空的函数组件。
然后,可以使用 shallow
来浅渲染 ParentComponent
,并使用 expect
断言验证 ChildComponent
是否没有被渲染。
这样,就成功地 mock 掉了不需要的子组件,从而使测试集中关注于 ParentComponent
的逻辑和行为,而不会受到实际的子组件的影响。
相关文章:
react+jest+enzyme配置及编写前端单元测试UT
文章目录 安装及配置enzyme渲染测试技巧一、常见测试二、触发ant design组件三、使用redux组件四、使用路由的组件五、mock接口网络请求六、mock不需要的子组件 安装及配置 安装相关库: 首先,使用npm或yarn安装所需的库。 npm install --save-dev jest…...

自学网络安全(黑客)
一、为什么选择网络安全? 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 未来3-5年,是安全行业的黄金发展期,提前踏入…...

【unity小技巧】委托(Delegate)的基础使用和介绍
文章目录 一、前言1. 什么是委托?2. 使用委托的优点 二、举例说明1. 例12. 例2 三、案例四、泛型委托Action和Func1. Action委托2. Func委托 五、参考六、完结 一、前言 1. 什么是委托? 在Unity中,委托(Delegate)是一…...
【MySQL必知必会】第24章 使用游标(学习笔记)
游标 游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改只能用于存储过程,不…...
rosbag回放指定话题外的其他话题的方法
假设要回放file.bag包中除/tf话题外的所有话题 方法一 将原本/tf话题转发到另一个“黑洞话题”去,这样/tf话题就没输出了 rosbag play file.bag /tf:/tf_dev_null方法二 使用filter选项,重新生产一个新的不含/tf话题的包 rosbag filter file.bag fi…...

6.2.1 网络基本服务---域名解析系统DNS
6.2.1 网络基本服务—域名解析系统DNS 因特网是需要提供一些最基本的服务的,今天我们就来讨论一下这些基本的服务。 域名系统(DNS)远程登录(Telnet)文件传输协议(FTP)动态主机配置协议&#x…...

通用文字识别OCR 之实现自动化办公
摘要 随着技术的发展,通用文字识别(OCR)已经成为现代办公环境中不可或缺的工具之一。OCR技术可以将印刷或手写文本转换为可编辑或可搜索的数字文本,极大地提高了办公效率并实现了自动化办公。本文将深入探讨OCR技术在实现自动化办…...

Spring Boot 有哪些特点?
目录 一、自动配置 二、嵌入式 Tomcat Web 服务器 三、入门 POM 四、Actuator执行器 API 五、SpringBoot初始化器 一、自动配置 Spring Boot的自动配置是Spring Boot框架提供的一种功能,它可以根据用程序的依赖和配置信息,自动配置一些常见的功能模…...

10个图像处理的Python库
在这篇文章中,我们将整理计算机视觉项目中常用的Python库,如果你想进入计算机视觉领域,可以先了解下本文介绍的库,这会对你的工作很有帮助。 1、PIL/Pillow Pillow是一个通用且用户友好的Python库,提供了丰富的函数集…...

项目里不引入外网链接的解决方法
在写轮播的时候,引入了这个外网的资源是不对的 解决方法: 去外网上把文件下载下来,放在src文件夹下即可 在下面路径下引入下载的文件即可...

Java的jdk配置成功,但是输入java -version等,命令行没有任何反应
问题:现在有很多学生出现这种情况, Java的jdk配置成功,但是输入java -version等,命令行没有任何反应 Java下载后,手动配置环境变量,并且配置好,但是在命令行中无论输入java的什么都没有反应 问…...

MySQL select查询练习
一、创表并插入数据 创表: CREATE TABLE worker (部门号 int NOT NULL,职工号 int NOT NULL,工作时间 date NOT NULL,工资 float(8,2) NOT NULL,政治面貌 varchar(10) NOT NULL DEFAULT 群众,姓名 varchar(20) NOT NULL,出生日期 date NOT NULL,性别 char(1) DEFAU…...

Github 标星 60K,不愧是阿里巴巴内部出厂的“Java 核心面试神技”
前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万&#x…...
git 使用教程
git 使用手册 参考链接: https://blog.csdn.net/wanjun_007/article/details/126770712 git给远程仓库添加分支并上传文件 注意:git init 是建一个自己的本地仓 0 : 先git clone master 分支 1. 先pull master分支 2. git checkout -b &q…...

【Vue2.0源码学习】模板编译篇-模板解析阶段(HTML解析器)
文章目录 1. 前言2. HTML解析器内部运行流程3. 如何解析不同的内容3.1 解析HTML注释3.2 解析条件注释3.3 解析DOCTYPE3.4 解析开始标签3.5 解析结束标签3.6 解析文本 4. 如何保证AST节点层级关系5. 回归源码5.1 HTML解析器源码5.2 parseEndTag函数源码 6. 总结 1. 前言 上篇文…...
ARM裸机开发-串口通信
一、在使用EXYNOS4412的串口发送和接收的时候,首先要对EXYNOS4412的串口进行配置,我们使用轮询方式时的配置有哪些? 1、配置GPIO,使对应管脚作为串口的发送和接收管脚 GPA0CON寄存器[7:4][3:0] 0x22 GPA0PUD寄存器[3:0] 0 禁止上…...

Dubbo分布式服务框架,springboot+dubbo+zookeeper
一Dubbo的简易介绍 1.Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需…...
网络:UDP out of order;SIP;CPU out-of-order 执行
文章目录 问题SIP如果使用UDP出现乱序网络CPU问题 最近遇到虚拟机收到的UDP包发生乱序。从协议上说,这个乱序是标准,及特性所允许的,期望的。所以上层应用需要适应这种乱序,如果不能适应,可能需要做协议转换,专用TCP,让TCP来处理这种乱序的可能。 产生乱序的原因: 是网…...

我心中的TOP1编程语言—JavaScript
作为一名研发工程师(程序员),平时工作中肯定会接触或了解很多编程语言。每个人都会有自己工作中常用的语言,也会有偏爱的一些编程语言。而我心中的最爱,毫无疑问,就是 JavaScript。 JavaScript 是一门编程…...

CentOS环境下的Maven安装
CentOS 安装 Maven 镜像地址 镜像地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/ 下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/ 下载maven 将下载好的压缩包拷贝到根目录下 解压 tar -zxvf ap…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...