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

深入解析 Pytest 钩子函数及二次开发过程

关注开源优测不迷路

大数据测试过程、策略及挑战

测试框架原理,构建成功的基石

在自动化测试工作之前,你应该知道的10条建议

在自动化测试中,重要的不是工具

在 Pytest 测试框架中,钩子函数(Hooks)是一种强大的扩展机制,它允许开发者在测试执行的不同阶段插入自定义代码,从而实现对测试过程的精细控制和个性化定制。钩子函数能够与 Pytest 的核心功能无缝集成,为各种复杂的测试需求提供灵活的解决方案。无论是在测试环境的初始化、测试结果的处理,还是在测试用例的管理与执行控制等方面,钩子函数都发挥着至关重要的作用。

一、Pytest 钩子函数概述

1.1 钩子函数的概念与作用

钩子函数本质上是 Pytest 框架提供的一系列回调接口,它们在测试执行的特定时间点被自动调用。这些时间点涵盖了测试过程的各个阶段,从测试用例的收集、执行前的准备,到测试执行后的清理和结果报告等。通过实现这些钩子函数,开发者可以在不修改 Pytest 核心代码的前提下,向测试框架注入自定义的行为逻辑,使其适应不同项目的特定需求。


1.2 钩子函数的分类

Pytest 的钩子函数可以根据其作用的阶段和功能进行分类,常见的分类包括但不限于以下几种:

  • 测试用例收集相关钩子函数:这些钩子函数在 Pytest 收集测试用例的过程中被触发,开发者可以利用它们对收集到的测试用例进行筛选、排序或修改。例如,pytest_collection_modifyitems钩子函数允许开发者在测试用例收集完成后,对测试用例列表进行自定义操作,如根据标记(mark)过滤某些测试用例,或者重新调整测试用例的执行顺序。

  • 测试执行环境相关钩子函数:主要用于在测试执行前和执行后对测试环境进行配置和清理操作。比如pytest_sessionstart钩子函数在测试会话开始时被调用,开发者可以在这个钩子函数中进行一次性的全局初始化操作,如创建数据库连接、初始化日志系统等;而pytest_sessionfinish钩子函数则在测试会话结束时被触发,可用于关闭数据库连接、清理临时文件等资源释放操作。

  • 测试结果处理相关钩子函数:在测试执行完成后,用于处理和报告测试结果。pytest_runtest_makereport钩子函数可以获取每个测试用例的执行结果信息,开发者可以根据这些信息进行自定义的结果处理,如生成更详细的测试报告、将测试结果发送到特定的监控系统等。

  • 其他钩子函数:除了上述主要类型外,Pytest 还提供了许多其他类型的钩子函数,用于处理诸如命令行参数解析、插件加载、测试执行过程中的异常处理等各种不同的场景。这些钩子函数共同构成了一个丰富而灵活的扩展体系,使开发者能够全面地定制 Pytest 的行为。


二、常用 Pytest 钩子函数详解


2.1 pytest_configure钩子函数

  1. 函数功能
    pytest_configure钩子函数在 Pytest 开始收集测试用例之前被调用,它主要用于对整个测试运行环境进行全局配置。在这个钩子函数中,开发者可以访问和修改 Pytest 的配置对象(config),通过设置各种配置选项来定制测试框架的行为。例如,可以添加自定义的命令行选项、配置测试结果报告的格式和输出路径、注册自定义的标记(mark)等。

  2. 使用示例
    以下是一个简单的示例,展示了如何在pytest_configure钩子函数中添加一个自定义的命令行选项--my-option,并在测试中使用这个选项的值:

# conftest.py文件def pytest_configure(config):# 添加自定义命令行选项config.addinivalue_line("markers", "my_marker: 用于标记特定的测试用例")config.addoption("--my-option", action="store", default="default_value", help="这是一个自定义选项")def pytest_collection_modifyitems(items):# 遍历所有测试用例,根据自定义标记进行筛选selected_items = []deselected_items = []for item in items:if "my_marker" in item.keywords:selected_items.append(item)else:deselected_items.append(item)items[:] = selected_items

在上述示例中,首先在pytest_configure钩子函数中添加了一个名为my_marker的自定义标记,以及一个名为--my-option的命令行选项。然后,在pytest_collection_modifyitems钩子函数(用于在测试用例收集完成后对其进行修改)中,根据是否存在my_marker标记来筛选测试用例。在实际的测试脚本中,可以使用@pytest.mark.my_marker来标记需要执行的测试用例,并通过pytestconfig对象(通过pytest夹具获取)来访问--my-option选项的值。


2.2 pytest_collection_modifyitems钩子函数

  1. 函数功能
    pytest_collection_modifyitems钩子函数在 Pytest 完成测试用例收集后、但在测试用例执行之前被调用。它提供了一个机会,让开发者可以对收集到的测试用例列表进行最后的修改和调整。这包括但不限于根据特定条件筛选测试用例、重新排序测试用例、为测试用例添加额外的属性或标记等操作。

  2. 使用示例
    假设我们有一个项目,其中包含了多个测试模块,每个模块中又有多个测试用例。现在我们希望在某些情况下,只执行特定模块中的测试用例,或者按照特定的顺序执行测试用例。以下是一个示例,展示了如何使用pytest_collection_modifyitems钩子函数来实现这些功能:

# conftest.py文件def pytest_collection_modifyitems(items):# 按照模块名对测试用例进行排序items.sort(key=lambda item: item.module.__name__)# 筛选出特定模块中的测试用例selected_items = []deselected_items = []for item in items:if item.module.__name__.startswith("test_specific_module"):selected_items.append(item)else:deselected_items.append(item)items[:] = selected_items

在这个示例中,首先通过sort方法按照测试用例所在模块的名称对测试用例列表进行排序。然后,通过遍历测试用例列表,筛选出模块名以test_specific_module开头的测试用例,并将其保留在items列表中,其他测试用例则被移除。这样,在执行测试时,只会执行符合条件的特定模块中的测试用例,并且这些测试用例会按照模块名的顺序依次执行。


2.3 pytest_sessionstartpytest_sessionfinish钩子函数

2.3.1 函数功能

  • pytest_sessionstart钩子函数在测试会话开始时被调用,它主要用于执行一些一次性的全局初始化操作。这些操作通常与整个测试运行环境相关,例如创建共享的测试资源(如数据库连接池、日志文件句柄等)、初始化全局变量或配置对象等。

  • pytest_sessionfinish钩子函数则在测试会话结束时被触发,其主要职责是进行资源清理和收尾工作。这包括关闭在测试会话开始时打开的各种资源(如数据库连接、文件句柄等)、保存测试结果或执行其他与测试结束相关的操作(如生成测试报告、发送通知等)。

2.3.2 使用示例
以下是一个简单的示例,展示了如何在pytest_sessionstartpytest_sessionfinish钩子函数中进行数据库连接的初始化和关闭操作:

# conftest.py文件import pytest
import sqlite3@pytest.fixture(scope='session')
def database_connection():# 在pytest_sessionstart钩子函数中创建数据库连接connection = sqlite3.connect('test.db')yield connection# 在pytest_sessionfinish钩子函数中关闭数据库连接connection.close()def pytest_sessionstart(session):print("测试会话开始,正在进行初始化操作...")# 可以在这里进行其他全局初始化操作,如创建日志文件等def pytest_sessionfinish(session, exitstatus):print("测试会话结束,正在进行清理操作...")# 可以在这里进行其他清理操作,如删除临时文件等

在上述示例中,定义了一个名为database_connection的测试夹具,其作用域为会话级。在pytest_sessionstart钩子函数中,创建了一个 SQLite 数据库连接,并将其作为测试夹具的值返回。在测试用例中,可以使用这个测试夹具来获取数据库连接对象,进行数据库相关的操作。当测试会话结束时,pytest_sessionfinish钩子函数会被调用,关闭之前创建的数据库连接,确保资源得到正确释放。


2.4pytest_runtest_makereport钩子函数

2.4.1 函数功能
pytest_runtest_makereport钩子函数在每个测试用例执行完成后被调用,它负责生成测试用例的执行结果报告。这个钩子函数提供了详细的测试用例执行信息,包括测试用例的名称、所在模块、执行时间、执行结果(通过、失败、跳过等)以及可能的异常信息等。开发者可以利用这些信息来实现自定义的测试结果处理逻辑,如生成更详细的测试报告、将测试结果上传到远程服务器进行分析等。

2.4.2 使用示例
以下是一个简单的示例,展示了如何使用pytest_runtest_makereport钩子函数来记录每个测试用例的执行时间,并将其添加到测试结果报告中:

# conftest.py文件import time@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):outcome = yieldreport = outcome.get_result()start_time = getattr(item, "start_time", None)if start_time is not None:end_time = time.time()report.duration = end_time - start_timereport.user_properties.append(("执行时间", report.duration))return reportdef pytest_runtest_setup(item):item.start_time = time.time()

在这个示例中,首先定义了pytest_runtest_makereport钩子函数,并使用@pytest.hookimpl(hookwrapper=True)装饰器将其包装为一个钩子函数包装器。在钩子函数内部,获取了测试用例的执行结果报告,并计算了测试用例的执行时间(通过记录测试用例开始执行的时间start_time,并在测试用例执行完成后计算与当前时间的差值)。然后,将执行时间添加到测试结果报告的user_properties属性中,以便在后续的测试报告生成或结果处理中使用。同时,通过pytest_runtest_setup钩子函数在每个测试用例执行前记录其开始时间。


三、Pytest 钩子函数的二次开发过程

3.1 确定需求

在进行 Pytest 钩子函数的二次开发之前,首先需要明确项目的具体需求。这可能包括但不限于以下几个方面:

  • 定制测试环境配置:例如,根据项目的特定需求,在测试开始前自动配置特定的环境变量、创建或初始化特定的测试资源(如数据库连接、消息队列连接等)。

  • 优化测试用例执行流程:可能需要按照特定的规则对测试用例进行排序、筛选或分组执行,以提高测试效率或满足特定的测试覆盖要求。

  • 增强测试结果处理:如生成更详细、定制化的测试报告,将测试结果与其他系统(如缺陷管理系统、持续集成服务器等)进行集成,实现自动化的测试结果通知和分析。

  • 扩展测试框架功能:例如,添加对新的测试类型或技术的支持,如与特定的性能测试工具集成、实现分布式测试等。

3.2 选择合适的钩子函数

根据确定的需求,从 Pytest 提供的众多钩子函数中选择合适的钩子函数来实现自定义逻辑。这需要对钩子函数的功能和触发时机有深入的了解,确保所选的钩子函数能够在正确的时间点执行所需的操作。例如,如果需要在测试用例收集阶段进行筛选操作,那么pytest_collection_modifyitems钩子函数可能是一个合适的选择;如果要在测试执行后处理结果,则pytest_runtest_makereport钩子函数可能更符合需求。


3.3 编写钩子函数代码

在选定钩子函数后,就可以开始编写自定义的钩子函数代码了。以下是一些编写钩子函数代码的基本步骤和注意事项:

3.3.1 导入必要的模块和对象
根据钩子函数的功能需求,导入所需的 Python 模块和 Pytest 相关的对象。例如,如果需要操作测试用例对象,可能需要导入pytest.Item类;如果要处理测试结果,可能需要导入pytest.Report类等。

3.3.2 定义钩子函数
使用def关键字定义钩子函数,并按照 Pytest 钩子函数的命名规范和参数要求进行定义。钩子函数的参数通常包含与测试过程相关的信息,如测试用例对象、测试执行结果对象、配置对象等。例如,pytest_runtest_makereport钩子函数的定义如下:

def pytest_runtest_makereport(item, call):# 钩子函数代码逻辑

其中,item参数表示测试用例对象,包含了测试用例的各种属性(如名称、所在模块、标记等);call参数包含了测试用例执行的详细信息,如执行结果(call.excinfo在测试失败时包含异常信息)等。

3.3.3 实现自定义逻辑
在钩子函数内部,根据需求实现自定义的逻辑代码。这可能包括对测试用例对象的操作、对测试结果的处理、与外部系统的交互等。例如,在pytest_collection_modifyitems钩子函数中,可以通过遍历测试用例列表,根据特定条件修改测试用例的属性或筛选出符合要求的测试用例:

def pytest_collection_modifyitems(items):for item in items:if "特定标记" in item.keywords:item.add_marker(pytest.mark.skip(reason="根据需求跳过此测试用例"))

在这个例子中,遍历所有收集到的测试用例,如果测试用例包含 “特定标记”,则为其添加一个skip标记,使其在测试执行时被跳过。

3.3.4 注意钩子函数的返回值(如果有要求)
某些钩子函数需要返回特定的值,这些返回值可能会影响 Pytest 的后续行为。例如,pytest_runtest_makereport钩子函数需要返回修改后的测试结果报告对象,以确保正确的结果记录和处理。在编写钩子函数时,要仔细阅读 Pytest 文档,了解钩子函数的返回值要求,并确保正确返回相应的值。


3.4 注册钩子函数

编写完钩子函数代码后,需要将其注册到 Pytest 框架中,以便在测试执行过程中被正确调用。Pytest 提供了两种主要的注册钩子函数的方式:

3.4.1 使用pytest.hookimpl装饰器(推荐方式)
在定义钩子函数时,可以使用@pytest.hookimpl装饰器将其标记为一个钩子函数实现。例如:

@pytest.hookimpl(hookwrapper=True)def pytest_runtest_makereport(item, call):# 钩子函数代码逻辑

使用这种方式注册钩子函数时,可以通过装饰器的参数来指定一些额外的选项,如hookwrapper=True表示将钩子函数包装为一个钩子函数包装器,允许在钩子函数执行前后执行额外的代码逻辑。

3.4.2 在conftest.py文件中直接注册
另一种方式是在conftest.py文件中直接调用config.pluginmanager.register方法来注册钩子函数。例如:

def my_hook_function(item, call):# 钩子函数代码逻辑def pytest_configure(config):config.pluginmanager.register(my_hook_function, "my_hook_name")

这种方式相对较为繁琐,并且不太直观,因此推荐使用pytest.hookimpl装饰器来注册钩子函数。

3.5 测试与调试

完成钩子函数的编写和注册后,需要对其进行全面的测试和调试,以确保其功能正确且稳定。可以编写一些针对性的测试用例来验证钩子函数在不同情况下的行为是否符合预期。在测试过程中,可能会遇到各种问题,如钩子函数未被正确调用、逻辑错误导致测试失败或异常等。此时,需要利用 Python 的调试工具(如pdb模块)来逐步排查问题,检查钩子函数的参数值、执行流程以及与其他 Pytest 组件的交互情况,直到找到并解决问题为止。

相关文章:

深入解析 Pytest 钩子函数及二次开发过程

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在 Pytest 测试框架中,钩子函数(Hooks)是一种强…...

http 请求总结get

关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…...

漏洞扫描:网络安全的 “体检” 与 “防护指南”

在当今数字化时代&#xff0c;网络安全如同守护城堡的坚固城墙&#xff0c;而漏洞扫描则是检查城墙是否存在缝隙与薄弱环节的重要手段。那么&#xff0c;究竟什么是漏洞扫描&#xff1f;又该如何进行呢&#xff1f; 什么是漏洞扫描&#xff1f; 漏洞扫描是一种安全检测过程&a…...

《Vue进阶教程》第二十七课:实现侦听对象

往期内容&#xff1a; 《Vue进阶教程》第十六课&#xff1a;深入完善响应式系统之单例模式 《Vue进阶教程》第十七课&#xff1a;支持分支切换 《Vue进阶教程》第十八课&#xff1a;避免死循环 《Vue进阶教程》第十九课&#xff1a;computed初步实现 《Vue进阶教程》第二十…...

【Linux 网络 (五)】Tcp/Udp协议

Linux 网络 一前言二、Udp协议1&#xff09;、Udp协议特点2&#xff09;、Udp协议格式3&#xff09;、Udp报文封装和解包过程4&#xff09;、UDP的缓冲区 三、TCP协议1&#xff09;、TCP协议特点2&#xff09;、TCP协议格式1、4位首部长度、源端口、目的端口2、16位窗口大小3、…...

算法工程化工程师

算法工程化工程师是一种结合算法研究与工程开发能力的技术职位&#xff0c;主要职责是将算法从理论研究到实际落地&#xff0c;应用到各种工业或商业场景中。以下是关于这个职位的一些核心内容&#xff1a; 核心职责&#xff1a; 算法实现与优化&#xff1a; 将数学模型或算法…...

信息系统管理师试题-转型升级

1.3.转型升级 战略转型升级是对组织的长期发展方向、运行模式、组织战略、组织方式、资源配置方式、祖师文化等进行全方位升级变革。下列对战略转型升级的描述错误的是&#xff08;&#xff09; A大多数组织的转型主要是战略转型 B组织转型升级首先要解决的是战略选择问题 C组织…...

mysql三种读取模式(普通、流式、游标)

在与MySQL数据库交互时&#xff0c;数据的读取方式有多种选择&#xff0c;包括流式读取、游标读取和普通读取。每种方式都有其独特的原理、优势和劣势。本文将对这三种读取方式进行详细介绍&#xff0c; 1. 普通读取 介绍 普通读取是指通过JDBC的Statement或PreparedStateme…...

月子会所ERP管理云平台 GetData.ashx SQL注入致RCE漏洞复现

0x01 产品简介 月子会所ERP管理云平台是武汉金同方科技有限公司专为为母婴服务行业提供信息化解决方案,是结合行业顶级月子中心相关企业需求开发的一套综合性管理软件。该系统全面管控月子中心经营过程中的各个环节,提高总店及分店月子中心管理水平,规范月子中心从业人员操作…...

Ubuntu22.10/22.04 autoinstall--OK

第一步:建立ubuntu22.04 jammy apt本地源(见本博主对应栏) --------------------------------------------------------------------------------------- ubuntu22.04 grub配置: menuentry Ubuntu22.04-autoinstall(UEFI) --id UBUNTU22.04-autoinstall { echo "…...

操作系统之同步与互斥的基本概念

1. 同步的基本概念 定义&#xff1a;同步是指在多个并发执行的进程或线程之间协调其行为&#xff0c;以使它们能够正确地相互合作。在计算机科学中&#xff0c;同步通常指对共享资源进行访问控制&#xff0c;以避免竞争条件和死锁等问题。 实现方式&#xff1a;为了实现同步&a…...

【ANGULAR网站开发】初始环境搭建

1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs&#xff0c;这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…...

[青少年CTF练习平台]Lihua‘s for

下载附件之后直接IDA启动 查看dword_403040指向的内容&#xff0c;全是数据&#xff0c;提取出来 分析完成写脚本 flag "" temdata [0x00000066, 0x0000006D, 0x00000063, 0x00000064, 0x0000007F, 0x00000064, 0x00000032, 0x00000036, 0x0000006A, 0x000000…...

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…...

css文字折行以及双端对齐实现方式

使用flex布局后&#xff0c;文字超出容器部分不会自动折行了。实现代码如下&#xff1a; <el-row><el-col :span"24"><span class"label">姓名</span><span class"content">{{name}}</span></el-col>…...

AI智能养站神器-SEO助理原创文章批量生成发布工具

很多站长最头疼的就是网站每天的内容更新&#xff0c;因为不知道写什么&#xff0c;采集被人的文章又会被定义为抄袭&#xff0c;而且现在伪原创已经没有多大的效果了&#xff0c;所以今天给大家分享的就是一款AI智能养战神器-SEO助理原创文章批量生成发布工具。 这款工具支持…...

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…...

使用 ECharts 与 Vue 构建数据可视化组件

在前端开发中&#xff0c;数据可视化是非常重要的一部分。ECharts 作为一个功能强大且易于使用的开源数据可视化库&#xff0c;被广泛应用于各种图表展示需求中。而 Vue.js 是当下流行的前端框架之一&#xff0c;它的数据驱动和组件化开发模式让我们能轻松地将 ECharts 集成到 …...

KAFKA 权威指南笔记(一)究竟应该配置多少个BROKER?

一个KAFKA集群需要多少个BROKER&#xff1f; 一个单独的Kafka服务器被叫做BROKER&#xff0c;BROKER可以处理数千个分区以及每秒百万级别的消息量。由BROKER组成了“集群”&#xff08;其中由集群控制器角色的BROKER是从成员中选举出来的&#xff0c;负责控制管理工作&#xf…...

练习题:20

目录 Python题目 题目 题目分析 1. 类与变量、属性设计分析 2. Value 属性的实现分析 3. 转换函数分析 4. 整体代码结构与编程规范考虑 代码实现 代码解释 1. 类定义部分 2. 对象创建与功能测试部分 运行思路 1. 类定义阶段 2. 对象创建阶段 3. 获取 Value 属性…...

【时时三省】(C语言基础)动态内存函数malloc

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 malloc 开辟内存块 使用格式 void *malloc&#xff08;size_t sie&#xff09;&#xff1b; 示例 10*sizeof(int&#xff09;就是开辟空间的大小 如果p是void指针的话 p不能解引用 m…...

大数据学习之Redis 缓存数据库二,Scala分布式语言一

一.Redis 缓存数据库二 26.Redis数据安全_AOF持久化机制 27.Redis数据安全_企业中该如何选择持久化机制 28.Redis集群_主从复制概念 29.Redis集群_主从复制搭建 30.Redis集群_主从复制原理剖析 31.Redis集群_哨兵监控概述 32.Redis集群_配置哨兵监控 33.Redis集群_哨兵监控原理…...

第23天:信息收集-APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围

#知识点 1、信息收集-APP应用-公开信息-知识产权&开发者定位 2、信息收集-APP应用-资产信息-抓包&静态提取&动态调试 一、APP渗透测试的范围->应涵盖APP所有功能和组件&#xff0c;包括但不限于以下几个方面&#xff1a; 1、前端安全&#xff1a;包括界面交互、…...

每日一练 | DHCP 客户端续约过程

01 真题题目 在 DHCP 运行过程中&#xff0c;如果客户端 IP 地址在租约过去 87.5%还没有完成续约的话&#xff0c;客户端将发送什么报文进行再次续约&#xff1f; A. DHCPdiscover 广播报文 B. DHCP release 单播报文 C. DHCPrequest 广播报文 D. DHCPrequest 单播报文 02 真题…...

存储块的获取与释放

目录 获取存储块 释放存储块 设计实现 获取存储块 有空闲存储块&#xff0c;直接取出空闲块&#xff1b; 无空闲存储块&#xff0c;任务进入等待队列。 释放存储块 无任务等待&#xff0c;插入到空闲链表&#xff1b; 有任务等待&#xff0c;释放等待队列头部的任务。 设计实现…...

定位方式:css

使用相对路径 div ul #div下的所有ul&#xff0c;空格表示相对路径&#xff08;这个实际中用的多一些&#xff09; 绝对路径-一般不用绝对路径 html>head>div&#xff0c;“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…...

主从复制架构介绍和主从复制配置案例

每一个数据库的业务都对应着一个前端的业务&#xff0c; 主从复制架构的必要性? 第一点是两个服务器如果有一台服务器出现故障&#xff0c;那么另一台服务器可以正常工作&#xff0c;以保障前端业务可以被正常访问&#xff0c;第二点是两个服务器可以共同去处理数据&#xff…...

零跑汽车一路狂飙

新能源汽车市场潮起潮落&#xff0c;只有潮水退去&#xff0c;才能看清谁在裸泳。十年前&#xff0c;一批新能源汽车新势力带着创新的理念和先进的技术&#xff0c;如雨后春笋般涌入中国汽车市场&#xff0c;掀起一场新旧势力的角逐。 经历市场的激烈洗礼与投资泡沫的挤压&…...

固态硬盘SSD

目录 1、固态硬盘结构 2、访问和读取策略 3、固态硬盘 VS SSD固态硬盘 &#xff08;1&#xff09;速度 &#xff08;2&#xff09;性能 &#xff08;3&#xff09;使用寿命 4、磨损均衡技术 &#xff08;1&#xff09;动态磨损均衡 &#xff08;2&#xff09;静态磨损…...

MTEB文本向量化评估基准:Massive Text Embedding Benchmark

Massive Text Embedding Benchmark 文本向量化评估基准 Bitext mining is the task of finding parallel sentences in two languages. 双语文本挖掘是识别两种语言中语义等价句子对的任务。 Classification is the task of assigning a label to a text. 文本分类是为文本分配…...

【Compose multiplatform教程09】【组件】Image组件

查看全部组件 Image 功能说明&#xff1a;能够加载并显示图片&#xff0c;支持本地资源和网络资源&#xff0c;可对图片的大小、缩放方式、裁剪等属性进行设置&#xff0c;使图片以合适的方式展示在界面中&#xff0c;增强界面的视觉效果。示例场景&#xff1a;在应用的启动页…...

android jetpack compose Model对象更新变量 UI不更新、不刷新问题

以前是搞老本行Android原生开发的&#xff0c;因为工作原因&#xff0c;一直在用vue小程序&#xff1b;因为一些工作需要&#xff0c;又需要用到Android原生开发&#xff0c;建了个项目&#xff0c;打开源码一看&#xff0c;天塌了&#xff01;&#xff01;&#xff01;我以前的…...

Java抽象工厂+单例模式

在前端时间开发过程中,有这样一个业务场景:A;B两家厂商设备进行设备信息的同步功能。 根据实际场景,做了抽象工厂+单例模式实现调用工厂时,生成不同的具体业务引用对象,实现方法的调用。 概念: 抽象工厂模式通过接口或抽象类来创建一系列相关或依赖对象。它定义了一组工…...

React 第十九节 useLayoutEffect 用途使用技巧注意事项详解

1、概述 useLayoutEffect 是useEffect 的一个衍生版本&#xff0c;只是他们的执行时机不同 useLayoutEffect 用于在DOM更新执行完成之后&#xff0c;浏览器渲染绘制之前执行&#xff0c;这会阻塞浏览器的渲染&#xff1b; useEffect 的执行时机是在组件首次渲染和更新渲染之后…...

以太网协议实现——FPGA学习笔记23

一、简介 FPGA千兆网口数据传输MDIO接口——FPGA学习笔记3_yt8531sh原理图-CSDN博客 1、以太网帧类型 2、以太网帧格式 3、以太网MAC帧格式 二、以太网报文 目的IP :ff ff ff ff ff ff(广播IP地址) 类型:ARP (0806) 源MAC地址:74 7d 24 92 fb df 单播 …...

docker 实践与应用举例

docker 实践与应用举例 Docker是一个开源的容器化平台&#xff0c;它允许开发人员将应用程序及其依赖项打包为一个轻量级、可移植的容器&#xff0c;并在不同的环境中运行。Docker的基本概念包括以下几点&#xff1a; 1. 容器&#xff1a;Docker通过使用Linux容器技术&#x…...

双指针——有效三角形的个数

一.题目描述 611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 题目其实很简单就是让我们在数组中找到可能构成三角形的所有可能。构成三角形的前提是&#xff1a;任意两边之和大于第三边。所以我们要满足让下面三条同时成立才可以构成三角形&am…...

【ES6复习笔记】函数参数的默认值(6)

在ES6中&#xff0c;函数参数默认值是一个非常有用的特性&#xff0c;它允许你在定义函数时为参数指定一个默认值。如果在调用函数时没有提供相应的参数值&#xff0c;那么函数将使用默认值。 1. 形参初始值 具有默认值的参数&#xff0c;一般位置要靠后。这是一个潜规则&…...

tryhackme-Cyber Security 101-Linux Shells(linux命令框)

目的&#xff1a;了解脚本和不同类型的 Linux shell。 任务1&#xff1a;Introduction to Linux Shells&#xff08;Linux Shell 简介&#xff09; 作为操作系统的常规用户&#xff0c;我们都广泛使用图形用户界面 &#xff08;GUI&#xff09; 来执行大多数操作。只需点击几…...

【Go】-限流器的四种实现方法

目录 关于限流和限流器 固定窗口限流器 滑动窗口限流器 漏桶限流器 令牌桶限流器 总结 关于限流和限流器 限流&#xff08;Rate Limiting&#xff09;是一种控制资源使用率的机制&#xff0c;通常用于防止系统过载和滥用。 限流器&#xff08;Rate Limiter&#xff09;是…...

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…...

【信息系统项目管理师】第11章:项目成本管理过程详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、规划成本管理1、输入2、工具与技术3、输出二、估算成本1、输入2、工具与技术3、输出三、制定预算1、输入2、工具与技术3、输出四、控制成本1、输入2、工具与技术3、输出一、规划成本管理 定义:规划成本管…...

微信流量主挑战:用户破16!新增文档转换(新纪元3)

朋友们&#xff0c;报告好消息&#xff01;我的小程序用户数量已经涨到16个了&#xff01;没错&#xff0c;真没拉朋友圈亲戚好友来撑场子&#xff0c;全靠实力&#xff08;和一点点运气&#xff09;吸引了16位陌生小伙伴光临&#xff01;这波进步&#xff0c;连我自己都感动了…...

DFS【东北大学oj数据结构11-2】C++

题面 深度优先搜索&#xff08;DFS&#xff09;是一种基于尽可能多地访问相邻顶点策略的图搜索算法。如果顶点 v 有未搜索的顶点则递归搜索直至 v 的最后一条边。在搜索了 v 的所有边之后&#xff0c;搜索继续返回到找到 v 时经过的边。 搜索从原来的起点开始&#xff0c;直到…...

运维项目部署的环境准备

这里用的安装工具是yum,yum作为一个安装工具,用起来比较方便 用yum安装以下软件,组成项目的可运行环境 yum 先更新 yum update -y 安装一个外置仓库 yum install epel-release 安装redis yum install redis 安装nginx yum install nginx 安装vim yum install vim…...

URDF文件中inertial数据的描述坐标系说明

这件事的来源是这样的&#xff1a;结构手动把连杆坐标系下描述的惯性张量数据写入了urdf中&#xff0c;给我到以后发现有问题&#xff0c;给我搞懵了&#xff0c;以为我错了这么多年&#xff0c;于是有了本次的深度调研&#xff0c;先上结论&#xff0c;感兴趣的可以参考后文。…...

OpenCV-Python实战(5)——图形绘制基础

一、直线 cv2.line(img*,pt1*,pt2*,color*,thickness*,lineTypeLINE_8) img&#xff1a;绘图的背景&#xff08;画布&#xff09;。 pt1、pt2&#xff1a;始/终点坐标&#xff0c;格式为元组&#xff08;&#xff09;。 color&#xff1a;直线颜色&#xff0c;BGR格式。 t…...

科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务

科技云报到原创。 就像自行车、手表和缝纫机是工业时代的“三大件”。生成式AI、数据、云服务正在成为智能时代的“新三大件”。加之全球人工智能新基建加速建设&#xff0c;成为了人类社会数字化迁徙的助推剂&#xff0c;让新三大件之间的耦合越来越紧密。从物理世界到数字世…...

HarmonyOS NEXT 实战之元服务:静态案例效果(二)

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图代码案例如下&#xff1a; Index里面实现 import { authent…...

Qt学习记录

Qt学习记录 Qt6读取GBK文件 在Qt5中&#xff0c;有QTextCodec模块&#xff0c;支持各种编码设置。 // Qt5 QCoreApplication a(argc, argv); auto desk QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); QFile file(QDir(desk).filePath("test.tx…...