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

react+jest+enzyme配置及编写前端单元测试UT

文章目录

  • 安装及配置
  • enzyme渲染
  • 测试技巧
    • 一、常见测试
    • 二、触发ant design组件
    • 三、使用redux组件
    • 四、使用路由的组件
    • 五、mock接口网络请求
    • 六、mock不需要的子组件

安装及配置

  1. 安装相关库:
    首先,使用npm或yarn安装所需的库。
npm install --save-dev jest enzyme enzyme-adapter-react-16 enzyme-to-json
  1. 配置Jest:
    在项目根目录下创建一个jest.config.js文件,并配置Jest。
// jest.config.js
module.exports = {setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],testEnvironment: 'jsdom',moduleNameMapper: {'\\.(css|less)$': 'identity-obj-proxy',},
};

在上述配置中,设置了setupFilesAfterEnvsrc/setupTests.js,指定了测试环境为jsdom,并设置了模块名称映射以处理CSS和LESS文件。

  1. 创建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。

  1. 编写测试用例:
    在测试目录中创建一个与要测试的组件对应的测试文件,并编写测试用例。
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来查找组件中的元素,并进行断言验证。

  1. 运行测试:
    在终端中运行测试命令,以执行测试用例。
npm run test

Jest将自动查找并执行项目中以.test.js.spec.js结尾的文件中的测试用例。

enzyme渲染

Enzyme提供了三种常用的渲染方式,分别是shallowmountrender。这些渲染方式在测试组件时具有不同的特点和用途。

  1. shallow 渲染:
    shallow 渲染是Enzyme的浅层渲染方式,它仅渲染被测试组件本身,而不渲染其子组件。
import { shallow } from 'enzyme';
import YourComponent from '../YourComponent';test('测试组件渲染', () => {const wrapper = shallow(<YourComponent />);// 对被测试组件进行断言和验证
});

使用shallow渲染时,被测试组件的子组件将被替换为占位符,并且无法直接访问子组件。这使得测试更加轻量且快速,适用于对被测试组件本身的行为进行测试。

  1. mount 渲染:
    mount 渲染是Enzyme的全渲染方式,它会将被测试组件及其子组件完全渲染到真实的DOM中。这使得可以模拟实际的组件嵌套和交互,并对其进行全面的测试。
import { mount } from 'enzyme';
import YourComponent from '../YourComponent';test('测试组件渲染', () => {const wrapper = mount(<YourComponent />);// 对被测试组件及其子组件进行断言和验证
});

使用mount渲染时,被测试组件及其子组件将在真实的DOM中进行渲染和交互。这使得可以测试组件的交互、生命周期方法和子组件的行为。

  1. render 渲染:
    render 渲染是Enzyme的静态渲染方式,它将组件渲染为静态的HTML字符串,不涉及真实的DOM操作。这使得可以对组件的输出进行快照测试,以验证其渲染结果是否符合预期。
import { render } from 'enzyme';
import YourComponent from '../YourComponent';test('测试组件渲染', () => {const wrapper = render(<YourComponent />);// 对组件输出的HTML进行断言和验证
});

使用render渲染时,被测试组件及其子组件将以静态HTML字符串的形式输出,可以方便地进行快照测试。
下面的例子中使用到的渲染方式只是举例,结合实际情况使用mount、shalldow或者render都是可以的。

测试技巧

一、常见测试

  1. 示例:测试组件渲染和属性传递
    假设有一个简单的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组件,并使用expecttoBe断言验证按钮上的文本是否与传递的标签相匹配。

  1. 示例:模拟事件处理
    假设有一个表单组件 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方法模拟按钮的点击事件。然后,使用expecttoHaveBeenCalledTimes断言验证onSubmit函数是否被调用了一次。

  1. 示例:异步操作的处理
    如果组件中包含异步操作,可以使用async/awaitdone回调函数来处理异步测试。
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的组件时,可以通过模拟事件或直接调用组件的方法来触发各种操作。下面是一些常见组件的触发方法示例:

  1. 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表示输入的值。

  1. 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 事件来选择该选项。

  1. 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表示复选框的选中状态。

  1. 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事件。

  1. 模拟文件上传
    在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的组件的单元测试时,可以采取以下措施以确保测试不会报错:

  1. 模拟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作为属性。

  1. 使用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。

  1. 测试Redux相关的行为:
    在编写单元测试时,除了测试组件的渲染和行为外,还可以编写专门测试Redux相关行为的测试用例。例如,测试Redux的action创建函数、reducer函数和异步操作的处理等。

四、使用路由的组件

当编写涉及React Router的组件的单元测试时,可以采取以下措施来处理受到影响的组件:

  1. 使用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将被测试的组件包装在内部,以便在测试中模拟路由。

  1. 使用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属性设置当前的路径。

  1. 使用BrowserRouterRouter
    如果组件使用了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接口网络请求

  1. 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.mockjest.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不需要的子组件 安装及配置 安装相关库&#xff1a; 首先&#xff0c;使用npm或yarn安装所需的库。 npm install --save-dev jest…...

自学网络安全(黑客)

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

【unity小技巧】委托(Delegate)的基础使用和介绍

文章目录 一、前言1. 什么是委托&#xff1f;2. 使用委托的优点 二、举例说明1. 例12. 例2 三、案例四、泛型委托Action和Func1. Action委托2. Func委托 五、参考六、完结 一、前言 1. 什么是委托&#xff1f; 在Unity中&#xff0c;委托&#xff08;Delegate&#xff09;是一…...

【MySQL必知必会】第24章 使用游标(学习笔记)

游标 游标(cursor)是一个存储在MySQL服务器上的数据库查询&#xff0c;它不是一条select语句&#xff0c;而是被该语句检索出来的结果集游标主要用于交互式应用&#xff0c;其中用户需要滚动屏幕上的数据&#xff0c;并对数据进行浏览或做出更改只能用于存储过程&#xff0c;不…...

rosbag回放指定话题外的其他话题的方法

假设要回放file.bag包中除/tf话题外的所有话题 方法一 将原本/tf话题转发到另一个“黑洞话题”去&#xff0c;这样/tf话题就没输出了 rosbag play file.bag /tf:/tf_dev_null方法二 使用filter选项&#xff0c;重新生产一个新的不含/tf话题的包 rosbag filter file.bag fi…...

6.2.1 网络基本服务---域名解析系统DNS

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

通用文字识别OCR 之实现自动化办公

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

Spring Boot 有哪些特点?

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

10个图像处理的Python库

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

项目里不引入外网链接的解决方法

在写轮播的时候&#xff0c;引入了这个外网的资源是不对的 解决方法&#xff1a; 去外网上把文件下载下来&#xff0c;放在src文件夹下即可 在下面路径下引入下载的文件即可...

Java的jdk配置成功,但是输入java -version等,命令行没有任何反应

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

MySQL select查询练习

一、创表并插入数据 创表&#xff1a; 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 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#x…...

git 使用教程

git 使用手册 参考链接&#xff1a; https://blog.csdn.net/wanjun_007/article/details/126770712 git给远程仓库添加分支并上传文件 注意&#xff1a;git init 是建一个自己的本地仓 0 &#xff1a; 先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的串口发送和接收的时候&#xff0c;首先要对EXYNOS4412的串口进行配置&#xff0c;我们使用轮询方式时的配置有哪些&#xff1f; 1、配置GPIO&#xff0c;使对应管脚作为串口的发送和接收管脚 GPA0CON寄存器[7:4][3:0] 0x22 GPA0PUD寄存器[3:0] 0 禁止上…...

Dubbo分布式服务框架,springboot+dubbo+zookeeper

一Dubbo的简易介绍 1.Dubbo是什么&#xff1f; Dubbo是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。 简单的说&#xff0c;dubbo就是个服务框架&#xff0c;如果没有分布式的需求&#xff0c;其实是不需…...

网络:UDP out of order;SIP;CPU out-of-order 执行

文章目录 问题SIP如果使用UDP出现乱序网络CPU问题 最近遇到虚拟机收到的UDP包发生乱序。从协议上说,这个乱序是标准,及特性所允许的,期望的。所以上层应用需要适应这种乱序,如果不能适应,可能需要做协议转换,专用TCP,让TCP来处理这种乱序的可能。 产生乱序的原因: 是网…...

我心中的TOP1编程语言—JavaScript

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

CentOS环境下的Maven安装

CentOS 安装 Maven 镜像地址 镜像地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/maven/ 下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/ 下载maven 将下载好的压缩包拷贝到根目录下 解压 tar -zxvf ap…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...