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

Pytest自动化框架

目录

Pytest简单介绍

第一章:Pytest console命令 

1.pytest

-v 参数

-h 参数

其他一些参数:仅供参考

第二章. mark标记 

@pytest.mark.skip

@pytest.mark.skipif

@pytest.mark.xfail 

​编辑 @pytest.mark.patametrize

单个参数

多个参数 

直接标记 

模糊匹配标记 

 使用mark自定义标记

 第三章 固件Fixture

fixture的使用

​编辑fixture参数 

fixture的作用域 

@pytest.mark.usefixtures()

autouse(自动使用)

yeild的使用

注意点:

​编辑

 共享Fixture功能

参数化

内置Fixture

总结


Pytest简单介绍

下载pytest

pip install pytest

第一章:Pytest console命令 

默认需要test开头的py模块,test_开头的方法

1.pytest

执行pytest命令会自动匹配到test开头或者结尾的文件

将其作为测试用例文件执行,在测试用例文件中自动匹配到test开头的类,类中匹配到test开头的方法,然后执行

pass代表断言成功

失败:

-v 参数

会显示是哪个测试用例,信息更加详细一点

-h 参数

help 这是代表帮助的参数

其他一些参数:仅供参考

第二章. mark标记 

pytest.mark是用来对测试方法进行标记的一个装饰器,主要作用是在测试用例执行过程中跳过标记的测试用例或做出判断以选择性的执行

标记测试函数

使用pytest --markers查看官方提供的mark

各个mark的具体含义如下: 

mark含义
@pytest.mark.filterwarings(warning)在标记的测试方法上添加警告过滤    
@pytest.mark.skip(reason=None)执行时跳过标记的测试方法,reason默认为空
@pytest.mark.skipif(condition)通过条件判断是否跳过标记的测试方法,如果condition为真跳过,否则不跳过

@pytest.mark.xfail(condition,reason=None,run=True,

raises=None,strict=False)

如果条件的condition为True,则将预期结果标记为False
@pytest.mark.parametrize(argnames,argvalues)测试函数参数化,即调用多次测试函数,依次传递不同的参数
@pytest.mark.usefixtures(argnames,argvalues)将测试用例标记为需要指定的所有fixture,和直接使用fixture的效果一样。
@pytest.mark.tryfirst标记一个挂钩实现函数,使得所标记的测试方法可以首先或尽早地执行
@pytest.mark.trylast标记一个挂钩实现函数,使得标记的测试方法可以最后或尽可能晚执行,和tryfrist相反

@pytest.mark.skip

创建一个test_skip.py 添加这两个测试方法

使用pytest  -v执行

import pytest# 如果在测试方法前添加了@pytest.mark.skip(reason=None),则在执行过程中遇到该测试方法
# 时,跳过不执行
@pytest.mark.skip
def test_skip1():assert 1 == 2@pytest.mark.skip(reason="跳过该条测试用例")
def test_skip2():assert 3 == 4

运行结果:

@pytest.mark.skipif

condition为True,跳过测试

condition为False, 不跳过

import pytest
import sysmy_list = [1, 3, 4, 5]"""
源码解析:class _SkipifMarkDecorator(MarkDecorator):def __call__(  # type: ignore[override]self,condition: str | bool = ...,*conditions: str | bool,reason: str = ...,) -> MarkDecorator: ...condition 可以是字符串也可以是bool类型"""# skipif对一些事物进行判断从而决定是否跳过测试方法,只有在满足条件下才会跳过
# condition = True, 跳过测试
@pytest.mark.skipif(condition=lambda: 1 in my_list, reason="1 在 my_list 中,跳过测试")
def test_skipif1():assert 1 == 1# condition为False, 所以不跳过
@pytest.mark.skipif('sys.platform != "win32" ')
def test_skipif2():assert 2 == 2# if __name__ == '__main__':
# print(sys.platform)  # win32

@pytest.mark.xfail 

xfail可以拆分成x和fail理解,x表示可以预期到的结果,fail为失败,合起来可以表达成可以预期到的失败的测试。xfail装饰器解决的是对于很清楚的知道他的记过是失败的,但是又不想直接跳过的测试方法,通过添加xfail装饰器可以在结果中给出明显的标识

新建一个test_xfail.py

import pytest"""# 源码def __call__(self,condition: str | bool = False,  # 主要条件参数,可以是字符串或布尔值,默认值为 False*conditions: str | bool,  # 可变参数,允许传递多个条件,每个条件可以是字符串或布尔值reason: str = ...,  # 字符串参数,用于说明标记的原因,默认值为未指定run: bool = ...,  # 布尔值参数,用于控制是否运行测试,默认值为未指定raises: None | type[BaseException] | tuple[type[BaseException], ...] = ...,  # 异常类型参数,用于指定测试是否应该抛出特定异常,默认值为未指定strict: bool = ...,  # 布尔值参数,用于控制是否严格匹配异常,默认值为未指定
) -> MarkDecorator:  # 返回一个 MarkDecorator 对象,用于标记测试这是一个特殊方法 __call__,用于定义对象被调用时的行为。在 pytest 中,它被用于实现标记装饰器(MarkDecorator)的功能。参数说明:- condition: 主要条件参数,可以是字符串或布尔值。如果条件为 True 或非空字符串,标记会生效。- *conditions: 可变参数,允许传递多个条件。所有条件会被组合起来,决定标记是否生效。- reason: 字符串参数,用于说明标记的原因。例如,跳过一个测试时,可以提供一个跳过的原因。- run: 布尔值参数,用于控制是否运行测试。如果为 False,测试会被跳过。- raises: 异常类型参数,用于指定测试是否应该抛出特定异常。如果测试没有抛出指定异常,测试会失败。- strict: 布尔值参数,用于控制是否严格匹配异常。如果为 True,测试抛出的异常必须完全匹配 raises 参数指定的异常类型。返回值:- 返回一个 MarkDecorator 对象,用于标记测试。
"""@pytest.mark.xfail()
def test_xfail1():assert 11 + 1 == 12@pytest.mark.xfail(reason="运算错误")
def test_xfail2():assert 5 + 5 == 11# condition为True, 一定要加上reason
# strict 参数用于控制是否将 XPASS 视为失败。如果 strict=True,XPASS 会被视为失败
@pytest.mark.xfail(strict=True)
def test_xfail3():assert 1 + 1 == 2

strict为True 

 @pytest.mark.patametrize

使用pytest -k 测试方法名  只运行该测试方法

代码:

单个参数

# parametrize 用于对测试方法进行数据参数化,使得同一个测试方法结合
# 不同的测试数据也可以达到同时测试的目的
import pytestlist_one = [1, 2, 3, 4]"""
1. 如果argnames只有一个名称, 则argvalues要以列表的形式给出值
2. 如果argnames有多个名称,则argvalues需要以列表嵌套元组的形式给出值
3. 如果parametrize的参数名称和fixture一样,会覆盖掉fixture
e.g:
@parametrize('arg1',[1,2]) 将对测试函数调用两次
...第一次调用arg1=1, 第二次调用arg1=2
@parametrize('arg1','arg2',[(1,2),(3,4)] 将对测试函数调用两次
...第一次调用: arg1=1, arg2=2 第二次调用arg1=3, arg2=4
"""
@pytest.mark.parametrize('number', list_one)
def test_parametrize1(number):assert number in list_one

多个参数 

# 多个参数
list_two = [(1, 2, 3), (2, 3, 4), (3, 4, 7)]@pytest.mark.parametrize('num1,num2,sum', list_two)
def test_parametrize2(num1, num2, sum):assert num1 + num2 == sum

直接标记 

mark标记是通过在测试方法上添加装饰器进行标记,还有一种标记方法是在命令行中使用参数进行标记

使用参数进行标记的方法有两种:

  1. 第一种是直接标记:只运行某个固定的py文件,或在py文件后添加双引号::运行固定的测试方法
  2. 通过参数-k进行模糊匹配标记

    假设是test.example.py

  3. pytest   test.example.py 只运行这个py文件

 添加双引号,只运行这一个方法

pytest test.example.py::test_add

也可以执行多个方法

模糊匹配标记 

在直接标价中一次只能执行一个测试文件或者方法,如果一次执行多个测试方法可以使用模糊匹配标记,模糊匹配使用起来很简单:

pytest -k 命令 进行匹配标记即可

pytest -v -k  信息更详细一些

 使用mark自定义标记

我们根据mark进行自定义标记,只需在测试方法前添加装饰器 pytest.mark.标记名

标记名建议根据项目取比较容易世标的词,例如:commit, mergerd, done, undo等

在命令模式下使用时:只需要通过参数 -m 加上标记名就可执行被标记的测试方法

创建一个test_customize.py

import pytestdef add_number(a, b):return a + b@pytest.mark.done
def test_add1():assert add_number(2, 3) == 5@pytest.mark.undo
def test_add2():assert add_number(2, 3) == 4@pytest.mark.undo
def test_add3():assert add_number(3, 3) == 6

pytest在执行通过 -m 参数只执行被done标记的测试方法,使用命令 pytest -v -m 'done'

 第三章 固件Fixture

简介:

Fixture 中文称为固件或者夹具,用于测试用例执行前的数据准备、环境搭建和测试用例执行后的数据销毁、环境恢复等工作,与单元测试框架UnitTest中的setup、teardown功能类似,但是pytest框架提供的fixture更灵活,不但允许代码在运行时旨在某些特定测试用例前执行,而且还可以在测试用例和测试用例之间传递参数和数据

fixture的使用

如果要将一个方法作为fixture使用,只需要在该方法前添加装饰器@pytest.fixture()即可

import pytest@pytest.fixture()
def fixture_prepare():print("\nthis is fixture prepare")def test_fixture1(fixture_prepare):print('test_fixture1')def test_fixture2(fixture_prepare):print('test_fixture2')if __name__=='__main__':pytest.main(['-s','test.fixture.py'])

执行结果:可以看到每一个case执行之前都执行了fixture_prepare

fixture参数 

  1. scope:定义fixture的作用域,有4组可选参数:function,class, module,package/session,默认为function
  2. params:一个可选的参数列表,会使多个参数调用fixture函数和所有测试使用它
  3. autouse:如果为True,则所有方法都会执行固件方法,如果为False(默认值),则支队天界了固件方法的测试方法执行固件方法
  4. ids:每个参数都与列表中的字符串id对应,因此他们是测试id的一部分,如果没有提供id将会从参数中自动生成
  5. name: Fixture的名称,默认为装饰器的名称,如果Fixture在与他定义的模块中使用,那么这个fixture的功能名称将被请求的fixture功能参数遮盖。可以用该国将装饰函数命名为”fixture_fixturename" 然后使用“@pytest.fixture(name='fixturename')解决这个问题

fixture的作用域 

fixture的作用域用来指定固件使用的范围,固件的使用范围可以通过scope参数进行声明

function:函数级别,默认级别,每个测试方法执行前都会执行一次

class:类界别,每个测试类执行前执行一次

module:模块级别,每个模块执行前执行一次,也就是每个.py文件执行前都会执行一次

session:会话级别,一次测试只执行一次,即多个文件调用一次,可以跨.py文件

import pytest@pytest.fixture(scope='session')
def sesseion_fixture():pass@pytest.fixture(scope='module')
def module_fixture():pass@pytest.fixture(scope='class')
def class_fixture():pass@pytest.fixture(scope='function')
def function_fixture():passdef test_fixture(sesseion_fixture, module_fixture, class_fixture, function_fixture):passif __name__ == '__main__':pytest.main(['--setup-show', 'fixture_scope.py'])

命令:

pytest --setup-show fixture_scope.py

 

 使用参数 --setup-show(查看具体的setup和teardown)顺序,从图中可以看到明显的作用域表示符号

S:session会话级别

M:module

C:class级别

F:function函数级别

@pytest.mark.usefixtures()

当用例需要调用fixture时,可以用过直接在用例里加fixture参数,如果一个测试class类中所有的测试方法都需要用到fixture,美分用例都去传参会比较麻烦,这个时候选择在class类上使用装饰器,@pytest.mark.usefixtures修饰,使整个class都调用Fixture

在运行 pytest 时,添加 -s 选项以显示 print 语句的输出:

import pytest
from fixture_scope import function_fixture@pytest.mark.usefixtures('function_fixture')
class TestFixture:def test_fixture1(self):passdef test_fixture2(self):pass

注意:Fixture有返回值,而usefixtures无法获取到返回值,则不再适用 

执行结果

autouse(自动使用)

我们可以看到测试方法通过参数名称可以使用测试固件,但是当测试方法特别多时,每次传入参数特别麻烦,为了解决这一问题,Fixture提供了autouse,可以自动将测试固件添加到测试方法上。autouse默认是False, 不启用,如果设置为True,则开启自动使用Fixture功能,着用就不需要每次必须传入参数,即可使用测试固件

import pytest@pytest.fixture(autouse=True)
def autouse_fixture():print('this is autouse of fixture')def test_fixture1():print('this is test_fixture1')def test_fixture2():print('this is test_fixture2')if __name__ == '__main__':pytest.main(['-s', '--setup-show', 'fixture_autouse.py'])

运行结果可以看出:

test_fixture1和test_fixture2两个测试方法的setup和teardown都执行连固件autouse_fixture,与预期结果一致,可见autouse可以自动将测试固件添加到测试方法上

注意:测试固件旨在测试方法   前    进行内容输出

yeild的使用

在UnitTest单元测试框架中,有setup和teardown功能作为数据的准备和销毁,但是autouse的示例中知道,测试固件只在测试方法运行前进行内容输出

而在测试方法完成之后没有任何输出.

如果想在测试结束后执行操作,需要使用yield的配合,如果没有yield就相当于只有setup,没有teardown

import pytest@pytest.fixture()
def fixture_yield():print('\nTest started----------我是setup')yieldprint('\nEnd of test------------我是teardown')def test_yield(fixture_yield):print('\n数据销毁测试')

运行命令: pytest -s --setup-show test_yield.py
 

可以看出:测试用例在执行前执行连yield关键词之前的语句,测试用例执行后执行了yield关键词之后的语句

注意点:

 共享Fixture功能

许多测试用例的前置条件都存在相同的内容,比如一个后台管理系统的测试,登录是绕不过去的,如果每一个测试用例都要复写一边登录显然不合理。因此将登录写成一个方法,然后共享给所有需要使用的测试用例即可达到服用的目的;在pytest框架下提供了一个共享fixture的功能

只需要创建一个名为conftest.py的文件,将共享的功能在里面定义,其他测试文件在运行时会自动查找

在使用conftest.py文件时的注意点:

  • conftest.py文件名称需要固定,不能更改
  • conftest.py需要与运行的用例文件在同一个package下,并且存在__init__.py文件
  • 使用conftest.py时不需要import导入,pytest用例会自动识别
  • 如果conftest.py放在项目的根目录下,则对全局生效。如果放在某个package下,则只对package下的用例文件神效,允许存在多个conftest.py文件
  • conftest.py文件不能被其他文件导入
  • 所有同目录测试文件运行前都会执行conftest.py文件

创建文件:FileConftest

conftest.py

# 定义一个登录退出功能,在测试方法运行前进行登录,测试方法结束后退出登录
# 并且给登录退出方法加上Fixture装饰器@pytest.fixture
import pytest@pytest.fixture()
def signin_signout():print('\n成功登陆到系统') #setupyieldprint('\n退出系统') #teardown

test_file1:

import pytestdef test_conftest1(signin_signout):print("第一个测试方法进行操作")

test_file2:

import pytestdef test_conftest2(signin_signout):print("第2个测试方法进行操作")def test_conftest3(signin_signout):print("第3个测试方法进行操作")

 在命令行模式下进入FileConftest目录,使用pytest  -v -s运行脚本,在控制台输出测试结果

conftest.py的登录退出的作用域是函数级别的,所以程序运行中每个测试方法都会执行

如果想过要登录退出功能在程序运行过程中只运行一次,那么只需要将Fixture的作用域改成session 

参数化

在mark标记中已经了解到可以用@pytest.mark.parametrize对测试方法进行参数化,那么在固件中也可以同样对其进行参数化,因为固件Fixture也是函数。与pytest.mark.parametrize不同的是,Fixture参数化是通过参数params实现的

同一个测试方法可能需要不同的参数来构造逻辑基本相同,环境或者结果稍微有所不同的场景,这时候可以利用Fixture的参数化([arametrizing)来减少重复工作。例如测试两个数的和的一个测试方法,则可使用参数化进行测试

import pytest# params: Iterable[object] | None = None,
@pytest.fixture(params=[(1, 3, 4), (2, 4, 6), (12, 33, 45)])
def test_params(request):print(request)return request.paramdef test_add(test_params):assert test_params[2] == test_params[0]+test_params[1]

 执行固件参数化会使用pytest中内置的固件request,并通过request.param来获取参数,代码结束后,可以看到运行了3次,有3组测试数据

内置Fixture

# 如果有空会继续更新,感谢你的支持~ 

后续是:

pytest插件

插件的安装和卸载

查看活动插件

插件的注销

allure测试报告

allure的安装

脚本应用

报告生成

总结

路漫漫其修远兮,后续更新自动化项目实战,一些列子

相关文章:

Pytest自动化框架

目录 Pytest简单介绍 第一章:Pytest console命令 1.pytest -v 参数 -h 参数 其他一些参数:仅供参考 第二章. mark标记 pytest.mark.skip pytest.mark.skipif pytest.mark.xfail ​编辑 pytest.mark.patametrize 单个参数 多个参数 直接…...

算法之 前缀和

文章目录 前缀和基础3427.变长子数组求和 前缀和与哈希表1524.和为奇数的子数组数目 距离和1685.有序数组中绝对值之和 前缀异或和1177.构建回文串检测 其他一维前缀和1310.子数组异或查询 二维前缀和1314.矩阵区域和 前缀和,就是定义pre[i] 为nums的前i个元素的和值…...

【Windows下Gitbook快速入门使用】

Windows下Gitbook快速入门使用 1 工具安装1.1 Node.js下载安装1.1 环境变量1.2 npm配置1.3 安装gitbook 2 gitbook使用2.1 gitbook 无法执行2.2 gitbook常用命令 Gitbook是一个软件,使用Git和Markdown来编排书本; GitBook helps you pushlish beautiful …...

python网络爬虫开发实战之基本库使用

目录 第二章 基本库的使用 2.1 urllib的使用 1 发送请求 2 处理异常 3 解析链接 4 分析Robots协议 2.2 requests的使用 1 准备工作 2 实例引入 3 GET请求 4 POST请求 5 响应 6 高级用法 2.3 正则表达式 1 实例引入 2 match 3 search 4 findall 5 sub 6 com…...

【hello git】git rebase、git merge、git stash、git cherry-pick

目录 一、git merge:保留了原有分支的提交结构 二、git rebase:提交分支更加整洁 三、git stash 四、git cherry-pick 共同点:将 一个分支的提交 合并到 到另一个上分支上去 一、git merge:保留了原有分支的提交结构 现有一个模型…...

deepseek、腾讯元宝deepseek R1、百度deepseekR1关系

分析与结论 区别与联系 技术基础与定制方向: DeepSeek官网R1版本:作为基础版本,通常保留通用性设计,适用于广泛的AI应用场景(如自然语言处理、数据分析等)。其优势在于技术原生性和官方直接支持。腾讯元宝…...

DeepSeek + 沉浸式翻译 打造智能翻译助手

本文详细介绍如何使用 DeepSeek API 沉浸式翻译插件打造个性化翻译助手。 一、DeepSeek API 配置 基础配置 API 基础地址:https://api.deepseek.com需要申请 API Key支持与 OpenAI SDK 兼容的调用方式 可用模型 deepseek-chat:已升级为 DeepSeek-V3&am…...

iOS 聊天 IM 消息收发管理工具

iOS 聊天 IM 消息收发管理工具 连续疯狂加班告一段落,趁着离职前夕的空闲时间,整理一下重构相关的文档。之前写过两篇文章 iOS 客户端 IM 以及列表 UI 框架 、iOS 客户端 IM 消息卡片插件化,突然发现时间过的真的很快,这都已经是…...

从零开始学习Slam--数学概念

正交矩阵 矩阵的转置等于它的逆矩阵,这样的矩阵称之为正交矩阵 即: Q T Q I Q^T Q I QTQI, 这样的矩阵列向量都是单位向量且两两正交。 旋转矩阵属于特殊的正交群,即SO(n),这里n通常是3,所以SO(3)就是…...

3.使用ElementUI搭建侧边栏及顶部栏

1. 安装ElementUI ElementUI是基于 Vue 2.0 的桌面端组件库。使用之前,需要在项目文件夹中安装ElementUI,在终端中输入以下命令,进行安装。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI组件进行页面布局 2.1 清空原…...

pandas-基础(数据结构及文件访问)

1 Pandas的数据结构 1.1 Series 特点:一维的数据型对象,包含一个值序列和数据标签(即索引) 创建Series: pandas.Series(dataNone, indexNone, dtypeNone, nameNone, copyFalse, fastpathFalse) 参数说明: data&a…...

windows下使用msys2编译ffmpeg

三种方法: 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译(有环境变量) 3、在msys2中使用visual studio编译(无环境变量) 我的环境: 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…...

Linux驱动开发(1.基础创建)

序言:从高层逻辑到底层硬件的回归 在当今的软件开发中,我们习惯于用高级语言构建抽象层——通过框架、库和云服务快速实现功能。这种“软逻辑”的便利性让开发效率倍增,却也逐渐模糊了我们对计算机本质的认知:一切代码终将落地为…...

长短期记忆网络(LSTM)学习指南

长短期记忆网络(LSTM)学习指南 1. 定义和背景 长短期记忆网络(Long Short-Term Memory, LSTM)是一种递归神经网络(RNN)的变体,旨在解决传统RNN在处理长期依赖关系时遇到的梯度消失或爆炸问题。…...

蓝耘智算平台助力阿里万相2.1:文生图创作攻略

声明:非广告,为用户体验文章 目录 引言 一、认识蓝耘智算平台与阿里万相 2.1 (一)蓝耘智算平台概述 (二)阿里万相 2.1 文生图技术解析 二、蓝耘智算平台注册与环境准备 (一)注…...

HarmonyOS ArkTS声明式UI开发实战教程

引言:为何选择ArkTS? 在HarmonyOS生态快速发展的当下,ArkTS作为新一代声明式UI开发框架,正在引发移动应用开发范式的变革。笔者曾在多个跨平台框架开发中经历过"命令式编程之痛",直到接触ArkTS后才发现&…...

电脑总显示串口正在被占用处理方法

1.现象 在嵌入式开发过程中,有很多情况下要使用串口调试,其中485/422/232转usb串口是非常常见的做法。 根据协议,接口芯片不同,需要安装对应的驱动程序,比如ch340,cp2102,CDM212364等驱动。可…...

linux 安装nvidia 驱动所有发行版通用

之前有写过Ubuntu安装驱动的手册: https://blog.csdn.net/qq_50247813/article/details/146062785 到官网寻找合适的驱动: https://www.nvidia.cn/drivers/lookup 直接选择 linux 64-bit 适用于所有x86构架的linux,arm需要选择arm架构。 这次…...

PHP之数组

在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于数组的信息。 PHP中的数组不用指定数据类型,同时索引不一定是数字。 与其说是数组,其实更像map。 创建和输出 $arr array(1, 2, 3); $arr1 [1, 2, 3]; var_dump(…...

【js逆向】图灵爬虫练习平台 第十五题

地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvMTUv 不一样的两个值 hook cookie两次执行出现密文v值 最主要是这个函数 直接扣整个js代码,然后补环境即可,可以参考 同花顺那篇文章,有讲 关键代码 var rt;!funct…...

LeetCode 1328.破坏回文串:贪心

【LetMeFly】1328.破坏回文串:贪心 力扣题目链接:https://leetcode.cn/problems/break-a-palindrome/ 给你一个由小写英文字母组成的回文字符串 palindrome ,请你将其中 一个 字符用任意小写英文字母替换,使得结果字符串的 字典…...

【商城实战(11)】解锁商品搜索与筛选功能,提升用户购物体验

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配&#xf…...

Android AudioFlinger(五)—— 揭开AudioMixer面纱

前言: 在 Android 音频系统中,AudioMixer 是音频框架中一个关键的组件,用于处理多路音频流的混音操作。它主要存在于音频回放路径中,是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候,提到了一个函数pr…...

HTML-05NPM使用踩坑

2025-03-04-NPM使用踩坑 本文讲述了一个苦逼程序员在使用NPM的时候突然来了一记nmp login天雷,然后一番折腾之后,终究还是没有解决npm的问题😞😞😞,最终使用cnpm完美解决的故事。 文章目录 2025-03-04-NPM使用踩坑[toc…...

并发编程——累加器

目录 1 AtomicLong 1.1 核心功能 1.2 实现原理: (1)基于 Unsafe 的底层操作 (2) volatile字段的内存可见性 (3)CAS 操作与 ABA 问题 1.3 性能分析 1.4 使用场景 2 LongAdder 核心设计原理 1 分段存储 2 分散更新策略 3.处理高竞…...

LeetCode - 28 找出字符串中第一个匹配项的下标

题目来源 28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode) 题目解析 暴力解法 本题如果采用暴力解法的话,可以定义两个指针 i,j,其中 i 指针用于扫描 S(haystack)串,j 指针…...

人机交互革命:从触屏到脑波的13维战争

人机交互革命:从触屏到脑波的13维战争 一、交互维度大爆炸:重新定义人机沟通边界 当ChatGPT开始解析你的微表情,当Neuralink芯片能读取皮层信号,人机交互已突破【键鼠】的次元壁。我们正经历人类史上最大规模的感官革命&#xff…...

如何查看Elastic-Job在Zookeeper中的注册信息

目录 使用zkCli.sh脚本 1. 连接ZooKeeper 2. 查看根目录 3. 查看具体作业的注册信息 4. 退出ZooKeeper客户端 使用ZooInspector工具 1.下载并安装ZooInspector: 2.连接到Zookeeper服务器: 3.浏览服务节点: 4.查看服务实例数据: 注…...

【数据库系统概论】事务

一、事务的定义 1.定义: 事务是数据库管理系统中的一个逻辑工作单元,它由一组操作组成,这些操作是数据库的增删查改的这种一些类的操作,这些操作要么全部成功,要么全部失败。逻辑工作单元是指在数据库中执行的一组操…...

FPGA 配置原理

用户编程控制的FPGA 是通过加载比特位流配置内部的存储单元实现的。该存储单元就是所谓的配置单元,它必须在器件上电后进行配置,从而设置查找表(LUT)的属性、连线方式、IOB 电压标准和其它的用户设计。 1.配置帧 以Xilinx 公司的…...

《DeepSeek MoE架构下,动态专家路由优化全解析》

在人工智能飞速发展的当下,模型架构的创新与优化始终是推动技术进步的关键力量。DeepSeek的混合专家模型(MoE)架构,以其独特的设计理念和卓越的性能表现,在大模型领域崭露头角。而其中的动态专家路由优化技术&#xff…...

ORA-01861一次奇怪的字符串格式匹配问题

客户的一个生产库服务器挂了,还好有容灾数据库,在把生产库切换到容灾库后,大部分的业务都恢复了,但是有一个上传数据的应用报错: ORA-01861:文字与格式字符串不匹配 这个报错呢以前遇到过好几次,基本都是date类型和字符串类型匹配的问题, 一般就是字段需要date类型的数据,但是…...

基于Spring Boot的校园失物招领系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

nlp进阶

1 Rnn RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构段计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出. 单层网络结构 在循环 rnn处理的过程 rnn类别 n - n n - 1 使用sigmoid 或者softmax处理 应用在分类中…...

不同类型光谱相机的技术差异比较

一、波段数量与连续性 ‌多光谱相机‌ 波段数:通常4-9个离散波段,光谱范围集中于400-1000nm‌。 数据特征:光谱呈阶梯状,无法连续覆盖,适用于中等精度需求场景(如植被分类)‌。 ‌高光谱相机…...

【Bert系列模型】

目录 一、BERT模型介绍 1.1 BERT简介 1.2 BERT的架构 1.2.1 Embedding模块 1.2.2 双向Transformer模块 1.2.3 预微调模块 1.3 BERT的预训练任务 1.3.1 Masked Language Model (MLM) 1.3.2 Next Sentence Prediction (NSP) 1.4 预训练与微调的关系 1.5 小结 二、BERT…...

Oxidized收集H3C交换机网络配置报错,not matching configured prompt (?-mix:^(<CD>)$)

背景:问题如上标题,H3C所有交换机配置的model都是comware 解决方案: 1、找到compare.rb [rootoxidized model]# pwd /usr/local/lib/ruby/gems/3.1.0/gems/oxidized-0.29.1/lib/oxidized/model [rootoxidized model]# ll comware.rb -rw-r--…...

LeetCode 哈希章节

简单 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...

基于Ollama安装deepseek-r1模型搭建本地知识库(Dify、MaxKb、Open-WebUi、AnythingLLM、RAGFlow、FastGPT)

大模型 安装Ollama使用win系统安装使用sh脚本安装使用docker安装 下载大模型搭建WebUI工具和本地知识库Docker安装Dify配置本地知识库 Docker安装MaxKb配置本地知识库 Docker安装Open-WebUi配置本地知识库 Docker安装AnythingLLM配置本地知识库 Docker安装RAGFlow配置本地知识库…...

学习前置知识第二十天

学习前置知识第二十天 今天要做什么? 1:二进制 2:进制转换关系 3:二进制反汇编 4:常见字符编码 5:什么是编码和解码 6:编码表 一:二进制概述 为什么计算机只能读懂二进制?原因是因为计算机是需要电的,电路设计只…...

面试准备——云相册项目(1)基础

项目概述 云相册项目旨在为用户提供便捷的照片存储、管理和访问服务。通过客户端与服务器的配合,实现照片的上传、下载以及一些基本的命令交互功能,方便用户在不同设备上随时查看和管理自己的相册。 技术要点 编程语言与环境:使用 C 语言开…...

c语言程序设计--数组里面考察最多的一个知识点-考研冲刺复试面试问答题。

数组 关于数组的知识脑海里面先有一个大概,知道定义和存储方式 目录 数组 1、数组是什么? 2、strlen和sizeof的区别是什么? 3、数组名是什么? 1、数组是什么? 定义:数组是一组相同类型元素的集合。数…...

Json工具(一)- Jackson(续)

5、Jackson常用注解 JsonProperty 自定义属性在序列化和反序列化过程中所对应的JSON字段的名称,还可以指定是否序列化和反序列化。属性如下: value:设置属性的名称。一般当JSON串中的key与对象中的属性名称不一致,比如分别采用了下划线命名与…...

MySQL-事务

事务 事务,一般指的是数据库事务,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务具有四个特性,即我们常说的ACID特性: 原子性 指事务是一个不可分割的工作单位,事务中的操作…...

课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比

随着无人机在工业检测、仓储物流、应急救援等室内场景的广泛应用,高精度室内定位技术成为关键支撑。超宽带(UWB)技术凭借其高时间分辨率、强抗多径能力等优势,成为室内定位的主流方案。然而,不同的定位方法&#xff08…...

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能,可以将C写的软件到浏览器中运行,最近一段时间正在研究这方便内容,普通的控件响应都能实现,今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境:window11,Qt6.8.2…...

【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比

1. 开发方式 1.1 传统 CSS 手写 CSS:你需要手动编写 CSS 规则,定义类名、ID 或元素选择器,并为每个元素编写样式。 分离式开发:HTML 和 CSS 通常是分离的,HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…...

Server-Sent Events

Server-Sent Events (SSE) 是一种允许服务器向客户端推送实时更新的技术。 1. 创建 SSE 连接 export default {data() {return {eventSource: null,};},onLoad() {this.initSSE();},methods: {initSSE() {// 创建 SSE 连接this.eventSource new EventSource(https://api/xxxx…...

(十 九)趣学设计模式 之 中介者模式!

目录 一、 啥是中介者模式?二、 为什么要用中介者模式?三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...

k8s概念及k8s集群部署(Centos7)

Centos7部署k8s集群 部署之前,先简单说下k8s是个啥: 一、k8s简介: k8s,全称:kubernetes,它可以看作是一个分布式系统支撑平台。k8s的作用: 1、故障自愈: k8s这个玩意可以监控容器…...