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

Jest系列二之基础实践

Jest基础实践

官方文档地址:https://jest.nodejs.cn/docs

生命周期

Jest 中,生命周期方法大致分为两类:下面所罗列的生命周期方法,也是全局方法,不需要引入,直接就可以使用。

  • 重复性的生命周期方法:会在每一个测试用例的前后执行
    • beforeEach
    • afterEach
  • 一次性的生命周期方法:在整个测试开始之前,以及测试用例全部执行完之后执行该生命周期方法。
    • beforeAll
    • afterAll

beforeEach和afterEach

const { sum, sub } = require('../utils/computend')
// beforeEach 会在执行每一个测试用例之前被触发
beforeEach(() => {console.log('beforeEach')
})
// afterEach 会在执行每一个测试用例之后被触发
afterEach(() => {console.log('afterEach')
})
test('sum:测试加法是否正确', () => {console.log('test')// 断言 1+2=3expect(sum(1, 2)).toBe(3)// 断言 1+2 != 4expect(sum(1, 2)).not.toBe(4)
})
it('sub:测试减法是否正确', () => {console.log('it')// 断言 2-1=1expect(sub(2, 1)).toBe(1)// 断言 2-1 != 2expect(sub(2, 1)).not.toBe(2)
})

上面代码console输出顺序是:

console.log('beforeEach')
console.log('test')
console.log('afterEach')
console.log('beforeEach')
console.log('it')
console.log('afterEach')

beforeAll和afterAll

// beforeAll 是在整个测试套件的第一个测试用例执行之前执行
beforeAll(()=>{console.log("全局的beforeAll");
})
// afterAll 会在所有测试用例执行完成之后,然后再执行 afterAll
afterAll(()=>{console.log("全局的afterAll");
})
test('sum:测试加法是否正确', () => {console.log('test')// 断言 1+2=3expect(sum(1, 2)).toBe(3)// 断言 1+2 != 4expect(sum(1, 2)).not.toBe(4)
})
it('sub:测试减法是否正确', () => {console.log('it')// 断言 2-1=1expect(sub(2, 1)).toBe(1)// 断言 2-1 != 2expect(sub(2, 1)).not.toBe(2)
})
输出:全局的beforeAlltestit全局的afterAll

在分组中添加生命周期函数

​ 如果测试用例比较多,我们可以使用 describe 来进行分组,在一个分组里面也可以书写生命周期方法,但是在分组中的生命周期方法会变为一个局部的生命周期方法,仅对该组测试用例有效。

describe('测试加法', () => {beforeEach(() => {console.log('beforeEach')})test('1+2=3', () => {console.log('test')expect(sum(1, 2)).toBe(3)})test('1+2 != 4', () => {console.log('it')expect(sum(1, 2)).not.toBe(4)})
})
输出:beforeEachtestit

但这里还涉及到了一个顺序的问题:如果既有全局的 beforeEach 又有分组内部的 beforeEach,那么是先执行全局的 beforeEach,然后再执行分组内部的 beforeEach,如果是全局 afterEach 以及 分组的 afterEach,那么顺序刚好和 beforeEach 相反。

beforeEach(() => {console.log('全局的beforeEach')
})
afterEach(() => {console.log('全局的afterEach')
})
describe('测试加法', () => {beforeEach(() => {console.log('内部的beforeEach')})afterEach(() => {console.log('内部的afterEach')})test('1+2=3', () => {console.log('test')expect(sum(1, 2)).toBe(3)})test('1+2 != 4', () => {console.log('it')expect(sum(1, 2)).not.toBe(4)})
})
/*输出顺序:全局的beforeEach内部的beforeEach内部的afterEach全局的afterEach
*/

同样我们也可以添加分组内部的 beforeAll 和 afterAllbeforeAll 是在要执行该分组的测试用例之前会执行,afterAll 是在该分组所有测试用例执行完毕后执行。

beforeEach(() => {console.log('全局的beforeEach')
})
afterEach(() => {console.log('全局的afterEach')
})
describe('测试加法', () => {beforeAll(() => {console.log('内部的beforeAll')})afterAll(() => {console.log('内部的afterAll')})beforeEach(() => {console.log('内部的beforeEach')})afterEach(() => {console.log('内部的afterEach')})test('1+2=3', () => {console.log('test')expect(sum(1, 2)).toBe(3)})test('1+2 != 4', () => {console.log('it')expect(sum(1, 2)).not.toBe(4)})
})/*输出顺序:内部的beforeAll全局的beforeEach内部的beforeEach内部的afterEach全局的afterEach内部的afterAll
*/

test.only

test.only是用来测试特定的测试用例,也就是说,如果一个测试套件里面假设有10个测试用例,第7个测试用例书写了 test.only,那么在运行整个测试套件的时候,就只会执行第 7 个测试用例。

test.only("测试乘法函数", () => {const result = mul(2, 3);expect(result).toBe(6);console.log("\x1b[31m%s\x1b[0m", "测试乘法函数");
});

使用 test.only 可以很方便地运行单个测试用例,以便在调试失败的测试用例时进行测试

模拟函数

jest 对象上面的方法大致分为四类:

  • 模拟模块
  • 模拟函数
  • 模拟计时器
  • 其他方法

模拟函数

语法:jest.fn(implementation?);implementation 是一个可选参数,代表着模拟函数的实现,如果没有传入,那么创建的是一个空的模拟函数。

// 示例1
test('创建一个模拟函数', () => {const mockFunction = jest.fn();// 设置这个模拟函数的返回值为 42mockFunction.mockReturnValue(42);// mockFunction()函数或者toBe()里面必须是42才对,其他数字是错;要一一对应expect(mockFunction()).toBe(42);
})
// 示例2
test('mock function', () => {const mockCallback = jest.fn(x => 42 + x);expect(mockCallback(1)).toBe(43);
})

通过模拟函数身上的这些方法,可以控制模拟函数的行为,例如下面我们通过 mockReturnValueOnce 控制函数不同次数的调用对应的返回值

test("基本演示",()=>{// 创建一个模拟函数const mock = jest.fn();mock.mockReturnValue(30) // 设置返回值为 30.mockReturnValueOnce(10) // 第一次调用模拟函数对应的返回值.mockReturnValueOnce(20) // 第二次调用模拟函数对应的返回值expect(mock()).toBe(10);expect(mock()).toBe(20);expect(mock()).toBe(30);// 设置这个模拟函数的返回值为 42mock.mockReturnValue(42);expect(mock()).toBe(42);
});

**toHaveLength:**用于验证对象的长度是否等于指定的值‌

mock.calls: 包含对此模拟函数进行的所有调用的调用参数的数组。数组中的每一项都是调用期间传递的参数数组。

mock.results:包含对此模拟函数进行的所有调用的结果的数组。该数组中的每个条目都是一个包含 type 属性和 value 属性的对象。

toHaveBeenCalled: 确保调用了模拟函数

toHaveBeenCalledWith:使用该方法确保使用特定参数调用模拟函数。使用 .toEqual 使用的相同算法检查参数

toHaveBeenLastCalledWith:如果你有模拟函数,则可以使用该函数来测试上次调用它时使用的参数。

test('测试forEach是否正确', () => {// 由于 forEach 中依赖了 callback,因此我们可以创建一个模拟函数来模拟这个 callbackconst mockCallback = jest.fn(x => 100 + x)// forEach数据类型是[[1], [2], [3]]forEach(arr, mockCallback)// toHaveLength: 验证对象的长度是否等于指定的值‌expect(mockCallback.mock.calls).toHaveLength(3);expect(mockCallback.mock.calls.length).toBe(3);// 测试每一次调用 callback 的时候传入的参数是否符合预期expect(mockCallback.mock.calls[0][0]).toBe(1);expect(mockCallback.mock.calls[1][0]).toBe(2);expect(mockCallback.mock.calls[2][0]).toBe(3);// 针对每一次 callback 被调用后的返回值进行测试expect(mockCallback.mock.results[0].value).toBe(101);expect(mockCallback.mock.results[1].value).toBe(102);expect(mockCallback.mock.results[2].value).toBe(103);// 模拟函数是否被调用过expect(mockCallback).toHaveBeenCalled();// 前面在调用的时候是否有参数为 1 以及参数为 2 的调用expect(mockCallback).toHaveBeenCalledWith(1);expect(mockCallback).toHaveBeenCalledWith(2);// 还可以对模拟函数的参数进行一个边界判断,判断最后一次调用是否传入的参数为 3expect(mockCallback).toHaveBeenLastCalledWith(3);
})

模拟请求

在测试异步函数的时候,会发送真实的请求进行测试,但是有一些时候,我们知道这个没问题,或者说想要在那时屏蔽这一个异步,假设一个异步是能够正常返回数据的,这种情况下我们就可以针对这个异步请求函数来书写一个模拟函数来代替真实的 异步函数。

mockImplementationOnce:接受一个函数,该函数将用作模拟函数的一次调用的模拟实现。可以链接起来,以便多个函数调用产生不同的结果。

示例:

const mockFn = jest.fn().mockImplementationOnce(cb => cb(null, true)).mockImplementationOnce(cb => cb(null, false));mockFn((err, val) => console.log(val)); // true
mockFn((err, val) => console.log(val)); // false

rejects:验证一个 Promise 是否被 reject

resolves: 验证一个 Promise 是否被 resolve

模拟请求示例

// 创建了一个空的模拟函数
const fetchDataMock = jest.fn();
const fakeData = { id: 1, name: "xiejie" };
// 设置该模拟函数的实现
fetchDataMock.mockImplementation(() => Promise.resolve(fakeData));
// 通过模拟函数的一些方法来设置该模拟函数的行为
test("模拟网络请求正常", async () => {const data = await fetchDataMock();expect(data).toEqual({ id: 1, name: "xiejie" });
});
test("模拟网络请求出错", async () => {// 模拟网络请求第一次请求失败,之后请求没问题fetchDataMock.mockImplementationOnce(() =>Promise.reject(new Error("network error")));// rejects: 验证一个 Promise 是否被 reject; toThrow: 验证一个 Promise 是否被 reject,并且抛出了指定的错误await expect(fetchDataMock()).rejects.toThrow("network error");// resolves: 验证一个 Promise 是否被 resolve; toEqual: 验证一个 Promise 是否被 resolve,并且返回的 Promise 的值与指定的值相等await expect(fetchDataMock()).resolves.toEqual({ id: 1, name: "xiejie" });
});

模拟模块

模块可以分为两种模块:第三方模块文件模块

mock(): 测试时可以轻松替换和控制外部依赖的行为,让你能够专注于测试代码的逻辑,而不是依赖于外部系统。

模拟第三方模块

下面的代码的目的是通过使用 Jest 来对一个与 axios 相关的 User 类进行单元测试,模拟了 axios 模块的行为并验证了 User 类中的方法是否按预期工作。

api/userApi.js

// 这个文件是模拟axios请求的
const axios = require("axios");
class User {// 获取所有的用户static all() {return axios.get("/users.json").then((resp) => resp.data);}static testArg(){// 这个方法本身 axios 是没有的// 我们通过模拟 axios 这个模块,然后给 axios 这个模块添加了这么一个 test方法// 这里在实际开发中没有太大意义,仅做演示return axios.test();}
}
module.exports = User;

mock/user.json

// 模拟后端返回的数据
[{"name": "张三","age": 18,"gneder": "男","score": 100},{"name": "李四","age": 20,"gneder": "男","score": 99}
]

mock.test.js

// 写测试用例的文件
const User = require('../api/userApi')
const userData = require('../mock/user.json')// 模拟 axios 模块
// jest.mock() 是 Jest 提供的功能,用于模拟 axios 模块的行为
jest.mock('axios', () => {const userData = require('../mock/user.json')// 模拟响应数据const resp = {data: userData}return {get: jest.fn(() => Promise.resolve(resp)),test: jest.fn(() => Promise.resolve("this is a test"))}
})
test('测试用例', async () => {// User.all()方法能够正确地通过模拟的 axios.get 获取到预期的用户数据。await expect(User.all()).resolves.toEqual(userData);// 除了替换模块本身,还可以为这个模块添加一些额外的方法:// User.testArg() 方法能够正确地调用模拟的 axios.test 方法,返回预期的字符串 "this is a test"。await expect(User.testArg()).resolves.toEqual("this is a test");
})

模拟文件模块

通过 jest.mock,我们还可以模拟整个文件模块

**requireActual:**作用是返回实际模块而不是模拟,绕过有关模块是否应接收模拟实现的所有检查。

const { sum, sub, mul, div } = require("../utils/computend");jest.mock("../utils/computend", () => {// 在这里来改写文件模块的实现// 拿到 ../utils/computend 路径所对应的文件原始模块const originalModule = jest.requireActual("../utils/computend");// 这里相当于是替换了原始的模块// 一部分方法使用原始模块中的方法// 一部分方法(sum、sub)被替换掉了return {...originalModule,sum: jest.fn(() => 100),sub: jest.fn(() => 50),};
});
test("对模块进行测试", () => {expect(sum(1, 2)).toBe(100);expect(sub(10, 3)).toBe(50);expect(mul(10, 3)).toBe(30);expect(div(10, 2)).toBe(5);
});

可以看到在运行的时候,没有再像之前一样显示出测试用例的描述。如果想要显示,可以添加如下的配置:

// package.json的scripts里面添加如下命令
{"test": "jest --verbose=true"
}
// 需要统一运行,运行单个文件没用

配置文件

生成文件
npx jest --init // 生成测试文件

会需要选择如下命令

Would you like to use Jest when running "test" script in "package.json"? no/yes
Would you like to use Typescript for the configuration file? no/yes
Choose the test environment that will be used for testing ? node/jsdom
Do you want Jest to add coverage reports? no/yes
Which provider should be used to instrument code for coverage? v8/babel
Automatically clear mock calls, instances, contexts and results before every test? no/yes

上面的翻译结果是:

您想在“package.json”中运行“测试”脚本时使用Jest吗?no/yes --选择yes
您想要使用Typescript作为配置文件吗?no/yes --根据你项目是ts还是js来选择
选择将用于测试的测试环境?node/ jsdom --选择node
您希望Jest添加覆盖率报告吗?no/yes --选择yes
应该使用哪个提供者来为覆盖率编写代码?v8 /babel --选择v8
在每次测试前自动清除模拟调用、实例、上下文和结果?no/yes --选择yes

生成jest.config.js后,运行命令生成对应测试结果和根目录的coverage文件夹

// cmd界面运行命令会输出
npm run test

生成对应的表格完成率

  • % Stmts:包含语句的百分比,即被测试覆盖的语句占总语句数的比例。
  • % Branch:包含分支的百分比,即被测试覆盖的分支占总分支数的比例。
  • % Funcs:包含函数的百分比,即被测试覆盖的函数占总函数数的比例。
  • % Lines:包含行的百分比,即被测试覆盖的行占总行数的比例。
  • Uncovered Line #s:未被测试覆盖的行号。

​ 项目根目录下面,还新生成了一个 coverage 的目录,里面其实就是各种格式(xml、json、html)的测试报告,之所以生成不同格式的报告,是为了方便你后面通过不同的工具来进行读取。也可以打开根目录coverage/lcov-report/index.html,可以浏览器查看

文件解析

介绍一些jest.config.js配置文件中常见的配置项属性含义:

**coverageProvider:**收集并显示测试覆盖率,包含每个文件中每种类型的代码(语句、分支、函数和行)的测试覆盖率

**coverageThreshold:**当设置collectCoverage为true之后,就可以设置coverageThreshold代码覆盖率的阀值,用于指定每个文件、目录或整个项目的最低覆盖率百分比。

coverageThreshold: {global: { // global是全局branches: 90, // 分支覆盖率的目标百分比。functions: 90, // 函数覆盖率的目标百分比。lines: 90, // 行覆盖率的目标百分比。statements: 90, // 语句覆盖率的目标百分比。},'./src/utils/': { // 设定特定文件的阀值branches: 60,functions: 60,lines: 60,statements: 60}
}

**testMatch:**这个配置项可以指定 Jest 应该运行哪些测试文件。默认情况下, Jest 会查找 .test.js 或者 .spec.js 结尾的文件

testMatch: ["**/test/**/*.[jt]s?(x)", //指定解析的文件格式
],

**moduleFileExtensions 😗*指定 Jest 查找测试文件时应该搜索哪些文件扩展名。

setupFilesAfterEnv:指定 Jest 在运行测试之前应该运行哪些文件。例如:

setupFilesAfterEnv: ['<rootDir>/src/setupTests.js']

rootDir: 是获取当前根目录

在执行每个测试套件(文件)之前,都会先执行这个 setupTests 文件

相关文章:

Jest系列二之基础实践

Jest基础实践 官方文档地址&#xff1a;https://jest.nodejs.cn/docs 生命周期 在 Jest 中&#xff0c;生命周期方法大致分为两类&#xff1a;下面所罗列的生命周期方法&#xff0c;也是全局方法&#xff0c;不需要引入&#xff0c;直接就可以使用。 重复性的生命周期方法&…...

Scikit-learn全攻略:从入门到工业级应用

Scikit-learn全攻略:从入门到工业级应用 引言:Scikit-learn在机器学习生态系统中的核心地位 Scikit-learn作为Python最受欢迎的机器学习库,已成为数据科学家的标准工具集。根据2023年Kaggle调查报告,超过83%的数据专业人士在日常工作中使用Scikit-learn。本文将系统性地介…...

基于Python的图书馆信息管理系统研发

标题:基于Python的图书馆信息管理系统研发 内容:1.摘要 在数字化信息快速发展的背景下&#xff0c;传统图书馆管理方式效率低下&#xff0c;难以满足日益增长的信息管理需求。本研究旨在研发一款基于Python的图书馆信息管理系统&#xff0c;以提高图书馆信息管理的效率和准确性…...

Pytorch学习笔记(十七)Image and Video - Adversarial Example Generation

这篇博客瞄准的是 pytorch 官方教程中 Image and Video 章节的 Adversarial Example Generation 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/fgsm_tutorial.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …...

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法 已经弃用的版本&#xff08;Version 10.3-2021.10&#xff09;&#xff1a;gcc-arm-none-eabi&#xff1a;https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain当前版本&#xff1a;https://developer.a…...

Ubuntu系统Docker安装失败

问题&#xff1a; 1. 删除错误的 Docker 源 sudo rm -rf /etc/apt/sources.list.d/docker.list sudo rm -rf /etc/apt/keyrings/docker.gpg 2. 重新添加 Docker 官方 GPG 密钥 ​ sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | …...

鸿蒙学习手册(HarmonyOSNext_API16)_数据持久化②:键值型数据库

概述 键值型数据库就像一个大抽屉柜&#xff0c;每个抽屉都有一个唯一的标签&#xff08;键&#xff09;&#xff0c;里面可以放任何东西&#xff08;值&#xff09;。当你需要存或取东西时&#xff0c;直接看标签拿对应的抽屉就行&#xff0c;不用管其他抽屉里有什么。这种简…...

多线程 - 线程安全 2 -- > 死锁问题

目录 小结复习&#xff1a; 线程安全&#xff1a; 如何解决线程安全问题&#xff1f; synchronized “死锁” 死锁的三种经典场景&#xff1a; 1. 一个线程&#xff0c;一把锁。 2.两个线程&#xff0c;两把锁。 3. N 个线程 M 把锁 完&#xff01; 小结复习&#xff1a…...

JavaScript函数详解

目录 一、函数的基础概念 1. 函数的定义方式 2. 函数的参数处理 3.匿名函数与立即执行函数 4.同名函数与函数提升 二、函数的作用域与闭包 1. 作用域&#xff08;Scope&#xff09; 2. 闭包&#xff08;Closure&#xff09; 三、高阶函数与函数式编程 1. 高阶函数 2…...

Python-八股总结

目录 1 python 垃圾处理机制2 yield3 python 多继承&#xff0c;两个父类有同名方法怎么办&#xff1f;4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表&#xff08;List&#xff09;****2. 元组&#xff0…...

整合分块请求大模型返回的测试用例及小工具显示bug修复

在之前的分块发送需求数据给大模型进行测试用例生成时&#xff0c;由于数据结构的改变&#xff0c;需要对分块的回复进行整合&#xff0c;正确的整合是保障系统稳定性和功能正确性的核心。随着测试需求的复杂化&#xff0c;这对测试工程师提出了更高的整合和管理要求。本文将为…...

记一道CTF题—PHP双MD5加密+”SALT“弱碰撞绕过

通过分析源代码并找到绕过限制的方法&#xff0c;从而获取到flag&#xff01; 部分源码&#xff1a; <?php $name_POST[username]; $passencode(_POST[password]); $admin_user "admin"; $admin_pw get_hash("0e260265122865008095838959784793");…...

stm32F103RCT6 FLASH模拟EEPROM 读写32位数据

#include “stm32flash.h” #ifndef __STMFLASH_H__ #define __STMFLASH_H__ #include "main.h" #define</...

Spring Data审计利器:@LastModifiedDate详解!!!

&#x1f552; Spring Data审计利器&#xff1a;LastModifiedDate详解&#x1f525; &#x1f31f; 简介 在数据驱动的应用中&#xff0c;记录数据的最后修改时间是常见需求。Spring Data的LastModifiedDate注解让这一过程自动化成为可能&#xff01;本篇带你掌握它的核心用法…...

【SLURM】介绍

SLURM Slurm&#xff08;Simple Linux Utility for Resource Management&#xff09; 是一个用于管理和调度计算集群任务的开源作业调度系统。它主要用于高性能计算&#xff08;HPC&#xff09;环境&#xff0c;比如超算中心、大学的计算集群或企业的数据中心。 本文主要针对使…...

算法-贪心算法

圣诞老人的礼物-Santa Clau’s Gifts 现在有多箱不同的糖果&#xff0c;每箱糖果有自己的价值和重量&#xff0c;每箱糖果都可以拆分成任意散装组合带走。圣 诞老人的驯鹿雪橇最多只能装下重量W的糖果&#xff0c;请 问圣诞老人最多能带走多大价值的糖果。 输入 第一行由两个…...

Nginx — Nginx处理Web请求机制解析

一、Nginx请求默认页面资源 1、配置文件详解 修改端口号为8080并重启服务&#xff1a; 二、Nginx进程模型 1、nginx常用命令解析 master进程&#xff1a;主进程&#xff08;只有一个&#xff09; worker进程&#xff1a;工作进程&#xff08;可以有多个&#xff0c;默认只有一…...

GAN随手笔记

文章目录 1. description2. code 1. description 后续整理 GAN是生成对抗网络&#xff0c;主要由G生成器&#xff0c;D判别器组成&#xff0c;具体形式如下 D 判别器&#xff1a; G生成器&#xff1a; 2. code 部分源码&#xff0c;暂定&#xff0c;后续修改 import nump…...

Java 8 时区与历法处理指南:跨越全球的时间管理

Java 8 的 java.time API 不仅修复了旧版日期时间 API 的设计缺陷&#xff0c;还提供了对时区和多历法的全面支持。无论是处理全球化应用的时区转换&#xff0c;还是适配不同文化的日历系统&#xff0c;Java 8 都能轻松应对。本文将深入解析其核心功能&#xff0c;并提供实用代…...

【STM32】对stm32F103VET6指南者原理图详解(超详细)

目录 一、原理图基本概念二、STM32F103VET6 的主要特性二、MCU模块三、电源模块四、时钟模块五、复位模块NRST 六、GPIO模块LED 七、调试模块JTAG 八、外设模块UARTSPII2CADC 九、其它模块BOOT 一、原理图基本概念 原理图/电路图通常由硬件工程师使用Altium Designer/ KiCad / …...

瑞芯微RKRGA(librga)Buffer API 分析

一、Buffer API 简介 在瑞芯微官方的 librga 库的手册中&#xff0c;有两组配置 buffer 的API&#xff1a; importbuffer 方式&#xff1a; importbuffer_virtualaddr importbuffer_physicaladdr importbuffer_fd wrapbuffer 方式&#xff1a; wrapbuffer_virtualaddr wrapb…...

移动端六大语言速记:第1部分 - 基础语法与控制结构

移动端六大语言速记&#xff1a;第1部分 - 基础语法与控制结构 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的基础语法与控制结构&#xff0c;帮助开发者快速理解各语言间的差异与共性。 1. 基础语法 1.1 数据类型 各语言的基本数据…...

Java 大视界 -- Java 大数据在智能金融区块链跨境支付与结算中的应用(154)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

Python Playwright库全面详解

Playwright 是 Microsoft 开发的一个现代化的端到端测试和浏览器自动化库&#xff0c;支持 Chromium、WebKit 和 Firefox 浏览器。它提供了跨浏览器、跨平台的自动化能力&#xff0c;且具有高性能和可靠性。 一、核心特性 多浏览器支持&#xff1a; Chromium (Chrome, Edge)We…...

脑疾病分类的疑惑【6】:脑疾病分类比较适合使用具有哪些特点的模型?

脑疾病分类是一个复杂的任务&#xff0c;涉及医学影像、神经电生理信号、基因数据等多种信息类型。为了有效地进行脑疾病分类&#xff0c;选择合适的模型是至关重要的。以下是一些适合脑疾病分类的模型特点&#xff0c;您可以参考这些特点来选择合适的模型&#xff1a; 1. 深度…...

24_原型和原型链_this

目录 一、this关键字 修改this的指向 二、原型和原型链 三、创建对象 通过构造函数创建 &#xff08;es5&#xff09; 通过类创建 &#xff08;es6&#xff09; 四、浅拷贝和深拷贝 ctrlc 浅拷贝&#xff1a; 只拷贝一层 深拷贝: 可以拷贝多层 一、this关键字 每个函…...

自定义类型:结构体(1)

1.结构体回顾 结构是一些值的集合&#xff0c;这些值被称为成员变量。结构的每个成员可以是不同类型的变量。 1.1结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#xff1a; struct Stu {char name[20];int age;char sex[5]; }; 1.2结构体变量的创…...

Java进阶——Lombok的使用

Lombok可以通过注解的方式&#xff0c;在编译时自动生成 getter、setter、构造函数、toString 等样板代码&#xff0c;从而减少代码的冗余&#xff0c;提高开发效率。本文深入讲解Lombok在实际开发中的使用。 本文目录 1. Lombok 依赖添加2. 常用Lombok注解及使用场景2.1 Gette…...

饿了么 bx-et 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 import requests bx_et re…...

python黑科技:无痛修改第三方库源码

需求不符合 很多时候&#xff0c;我们下载的 第三方库 是不会有需求不满足的情况&#xff0c;但也有极少的情况&#xff0c;第三方库 没有兼顾到需求&#xff0c;导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改&#xff0c;是我们将要遇到的一个难点…...

PGD对抗样本生成算法实现(pytorch版)

PGD对抗样本生成算法 一、理论部分1.1 PGD 原理(1) 数学形式(2) 核心改进1.2 PGD 与其他攻击对比1.3 注意事项二、代码实现2.1 导包2.2 数据加载和处理2.3 网络构建2.4 模型加载2.5 生成对抗样本2.6 对抗测试2.7 启动攻击2.8 效果展示一、理论部分 1.1 PGD 原理 PGD 是 BIM/I-…...

小智机器人相关函数解析,BackgroundTask::Schedule (***)将一个回调函数添加到后台任务队列中等待执行

以下是对 BackgroundTask::Schedule 函数代码的详细解释&#xff1a; void BackgroundTask::Schedule(std::function<void()> callback) {std::lock_guard<std::mutex> lock(mutex_);if (active_tasks_ > 30) {int free_sram heap_caps_get_free_size(MALLOC_…...

C++学习之路:深入理解变量

目录 编程的本质变量的本质内存模型、变量名与值以及地址的关系数据类型C数据类型数据类型别名数据类型转换 变量作用域总结 编程的本质 编程的本质是什么&#xff1f;虽然程序里能实现很多复杂的逻辑&#xff0c;但是从底层的硬件上来看&#xff0c;编程的本质就是数据的搬移。…...

前端基础知识汇总

目录 HTML5详解&#xff08;结构层&#xff09; 什么是HTML HTML基本结构 网页基本信息 图像标签 链接标签 超链接 行内元素与块元素 列表标签 表格标签 页面结构分析 iframe内联框架 表单语法 表单元素格式 表单的简单应用 表单初级验证 CSS详解&#xff08;…...

2024蓝桥杯省赛C/C++大学B组 题解

文章目录 2024蓝桥杯省赛C/C大学B组A 握手问题&#xff08;5分&#xff09;B 小球反弹&#xff08;5分&#xff09;C 好数&#xff08;10分&#xff09;D R 格式&#xff08;10分&#xff09;E 宝石组合&#xff08;15分&#xff09;F 数字接龙&#xff08;15分&#xff09;G 爬…...

BIM/I-FGSM对抗样本生成算法实现(pytorch版)

BIM/I-FGSM对抗样本生成算法 一、理论部分1.1 核心思想1.2 数学形式1.3 BIM 的优缺点1.4 BIM 与 FGSM、PGD 的关系1.5 实际应用建议二、代码实现2.1 导包2.2 数据加载和处理2.3 网络构建2.4 模型加载2.5 生成对抗样本2.6 攻击测试2.7 启动攻击2.8 效果展示一、理论部分 1.1 核心…...

前沿科技:从Gen2到Gen3—Kinova轻型机械臂的技术升级路径

Kinova品牌在轻型机械臂行业中以其轻量化、灵活性和高精度的技术特点而知名。其产品线广泛适用于医疗、科研和工业等多个领域&#xff0c;对机器人技术的进步起到了积极的推动作用。Kinova轻型机械臂凭借其精良的设计和稳定的性能&#xff0c;为用户提供了高效且可靠的解决方案…...

智研咨询:2025DeepSeek技术全景解析重塑全球AI生态的中国力量|附下载方法

导 读INTRODUCTION 随着人工智能技术的飞速发展&#xff0c;AI大模型已成为推动行业进步的重要力量。智研咨询最新发布的《DeepSeek技术全景解析重塑全球AI生态的中国力量》报告&#xff0c;深入探讨了DeepSeek公司在AI领域的突破性成就及其对全球AI生态的深远影响。 如果感兴…...

超导量子计算机编程实战:IBM Qiskit 2025新API详解

一、量子计算平台演进与Qiskit 2025定位 1.1 IBM量子硬件发展路线 2025年IBM将实现三大技术突破&#xff1a; 量子体积&#xff1a;新一代"Goldeneye"处理器达到QV 8192相干时间&#xff1a;超导量子比特寿命突破500μs互联规模&#xff1a;模块化架构支持万级量子…...

斐波那契数列----C语言

关于斐波那契 已知&#xff1a; 问题背景&#xff1a;一对兔子从第3个月开始每月生一对新兔子&#xff0c;新兔子同样在第3个月开始繁殖。 关键观察&#xff1a; 第1个月&#xff1a;1对&#xff08;初始兔子&#xff09;。 第2个月&#xff1a;1对&#xff08;未成熟&#…...

打开pycharm显示编制索引后卡死

若项目中包含过多文件&#xff0c;PyCharm 启动后会进行自动索引&#xff0c;电脑性能不高时往往会导致崩溃&#xff08;主要是内存问题&#xff09;。以下为解决措施。 ✅ 1. 仅索引代码&#xff0c;排除文件 设置PyCharm 主要索引代码文件&#xff08;.py、.ipynb&#xff…...

AWS云安全全面详解:从基础防护到高级威胁应对

随着企业加速向云端迁移,AWS作为全球最大的云服务提供商之一,其安全性成为用户首要关注的问题。本文将深入剖析AWS云安全架构,从基础防护到高级威胁应对,帮助您构建全方位的云安全防线。 一、AWS安全责任共担模型 在深入探讨AWS具体安全措施前,首先需要理解AWS的安全责任…...

【C++重点】虚函数与多态

在 C 中&#xff0c;虚函数是实现多态的基础。多态是面向对象编程的重要特性之一&#xff0c;允许程序在运行时决定调用哪一个函数版本。通过虚函数&#xff0c;我们能够实现动态绑定&#xff0c;使得不同类型的对象可以通过相同的接口进行操作。 1 静态绑定与动态绑定 静态绑…...

算法学习之BFS

关于BFS我的理解是根据离我们当前这个点的权重来移动&#xff0c;这里权重也可以理解为离这个点的距离&#xff0c; 从起点开始&#xff0c;往前走一步&#xff0c;记录下所有第一步能走到的点开始&#xff0c;然后从所有第一部能走到的点开始向前走第二步&#xff0c;重复下去…...

每日小积累day1

网络&#xff1a; g是用来检测网络联通性的的诊断工具&#xff0c;使用的协议是ICMP 显示数据包括 ICMP数据&#xff1a;序列号&#xff0c;存活时间&#xff08;TTL&#xff09; 目标主机域名IP 往返时间&#xff08;RTT&#xff09; 统计数据&#xff08;平均RTT等等&a…...

【NLP】13. NLP推理方法详解 --- 穷举和贪心搜索

NLP推理方法详解 — 穷举和贪心搜索 在自然语言处理&#xff08;NLP&#xff09;任务中&#xff0c;推理&#xff08;Inference&#xff09;是指在给定模型的情况下&#xff0c;找到最可能的输出序列。由于模型通常是神经网络&#xff0c;它会为每个可能的输出分配一个概率&am…...

基于 Python 深度学习 lstm 算法的电影评论情感分析可视化系统(2.0 系统全新升级,已获高分通过)

大家好&#xff0c;欢迎来到我的技术专栏&#xff01;今天我将和大家聊聊如何利用 Python 的深度学习技术&#xff0c;打造一个集电影评论情感分析与可视化展示于一体的系统。这个系统不仅能自动采集和解析海量影评&#xff0c;还能实时生成直观的情感趋势图表&#xff0c;对于…...

妙用《甄嬛传》中的选妃来记忆概率论中的乘法公式

强烈推荐最近在看的不错的B站概率论课程 《概率统计》正课&#xff0c;零废话&#xff0c;超精讲&#xff01;【孔祥仁】 《概率统计》正课&#xff0c;零废话&#xff0c;超精讲&#xff01;【孔祥仁】_哔哩哔哩_bilibili 其中概率论中的乘法公式&#xff0c;老师用了《甄嬛传…...

linux--------------进程控制

1.进程创建 1.1fork函数初识 在linux中fork函数是⾮常重要的函数&#xff0c;它从已存在进程中创建⼀个新进程。新进程为⼦进程&#xff0c;⽽原进 程为⽗进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;⾃进程中返回0&#xff0c;⽗进程返回⼦进程id…...

Video Transformer Network

目录 摘要 Abstract VTN 背景 模型框架 视频特征提取 时空位置编码 Transformer编码器 任务特定头 关键创新 实验 代码 总结 摘要 Video Transformer Network 是基于Transformer架构改进的视频理解模型&#xff0c;旨在解决传统3D卷积神经网络在长距离依赖建模和…...