自动化测试 —— Pytest fixture及conftest详解!
前言
fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似unittest中setup/teardown,但是比它们要强大、灵活很多,它的优势是可以跨文件共享。
一、Pytest fixture
1.pytest fixture几个关键特性
- 有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活
- 按模块化的方式实现,每个fixture都可以互相调用
- fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题
- fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化
2.Pytest fixture定义
- 定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名;
- fixture装饰器里的scope有四个级别的参数:function(不写默认这个)、class、module、session;
- fixture可以有返回值,如果没有return,默认会是None;用例调用fixture的返回值,就是直接把fixture的函数名称作为参数传入;
- fixture可以返回一个元组、列表或字典;
- 测试用例可传单个、多个fixture参数;
- fixture与fixture间可相互调用;
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036
3.Pytest fixture用法
1)用法一:作为参数使用
fixture的名字直接作为测试用例的参数,用例调用fixture的返回值,直接将fixture的函数名称当做变量名称;如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元祖,list或字典,然后从里面取出对应数据。
① 将fixture函数作为参数传递给测试用例
@pytest.fixture()
def login():print("this is login fixture")user = "chen"pwd = 123456return user, pwddef test_login(login):"""将fixture修饰的login函数作为参数传递给本用例"""print(login)assert login[0] == "chen"assert login[1] == 123456assert "chen" in str(login)
② 同一个用例中传入多个fixture函数
@pytest.fixture()
def user():user = "cris"return user@pytest.fixture()
def pwd():pwd = "123456"return pwddef test_trans_fixture(user, pwd):"""同一条用例中传入多个fixture函数"""print(user, pwd)assert "cris" in str(user)assert pwd == "123456"
③ fixture函数之间的相互传递
@pytest.fixture()
def user2():user = "cris"return user@pytest.fixture()
def login_info(user2):"""fixture与fixture函数之间的相互传递"""pwd = "e10adc3949ba59abbe56e057f20f883e"return user2, pwddef test_assert_login_info(login_info):print(login_info)print(type(login_info))assert login_info[0] == "cris"assert login_info[1] == "e10adc3949ba59abbe56e057f20f883e"
2)用法二:提供灵活的类似setup和teardown功能
Pytest的fixture另一个强大的功能就是在函数执行前后增加操作,类似setup和teardown操作,但是比setup和teardown的操作更加灵活;具体使用方式是同样定义一个函数,然后用装饰器标记为fixture,然后在此函数中使用一个yield语句,yield语句之前的就会在测试用例之前使用,yield之后的语句就会在测试用例执行完成之后再执行。
@pytest.fixture()
def run_function():print("run before function...")yieldprint("run after function...")def test_run_1(run_function):print("case 1")def test_run_2():print("case 2")def test_run_3(run_function):print("case 3")
运行结果如下:
常见的应用场景:@pytest.fixture可以用在selenium中测试用例执行前后打开、关闭浏览器的操作:
@pytest.fixture()
def fixture_driver():driver = webdriver.Chrome()yield driverdriver.quit()def test_baidu(fixture_driver):driver = fixture_driverdriver.get("http://www.baidu.com")driver.find_element_by_id('kw').send_keys("python fixture")driver.find_element_by_id('su').click()
3)用法三:利用pytest.mark.usefixtures叠加调用多个fixture
如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixtures()进行叠加。注意叠加顺序,① 与直接传入fixture不同的是,@pytest.mark.usefixtures无法获取到被fixture装饰的函数的返回值;
② @pytest.mark.usefixtures的使用场景是:被测试函数需要多个fixture做前后置工作时使用;
@pytest.fixture
def func_1():print("用例前置操作---1")yieldprint("用例后置操作---1")@pytest.fixture
def func_2():print("用例前置操作---2")yieldprint("用例后置操作---2")@pytest.fixture
def func_3():print("用例前置操作---3")yieldprint("用例后置操作---3")@pytest.mark.usefixtures("func_3") # 最后执行func_3
@pytest.mark.usefixtures("func_2") # 再执行func_1
@pytest.mark.usefixtures("func_1") # 先执行func_1
def test_func():print("这是测试用例")
执行结果:
4)用法四:fixture自动使用autouse=True
当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了,autouse设置为True,自动调用fixture功能。所有用例都会生效,包括类中的测试用例和类以外的测试用例。
@pytest.fixture(autouse=True, scope="function")
def func_auto():"""autouse为True时,会作用于每一条用例"""print("\n---用例前置操作---")yieldprint("---用例后置操作---")# func_auto函数的autouse=True时,无论是否使用usefixtures引用func_auto,都会执行func_auto
@pytest.mark.usefixtures("func_auto")
def test_01():print("case 1")def test_02():print("case 2")class Test:def test_03(self):print("case 3")
执行结果:
4.Pytest fixture四种作用域
fixture(scope='function',params=None,autouse=False,ids=None,name=None)
fixture里面有个
- function:每一个函数或方法都会调用
- class:每一个类调用一次,一个类中可以有多个方法
- module:每一个.py文件调用一次,该文件内又有多个function和class
- session:多个文件调用一次,可以跨.py文件调用(通常这个级别会结合conftest.py文件使用)
1)function级别
function默认模式为@pytest.fixture() 函数级别,即scope="function",scope可以不写。每一个函数或方法都会调用,每个测试用例执行前都会执行一次function级别的fixture。
# @pytest.fixture(scope="function")等价于@pytest.fixture()
@pytest.fixture(scope="function")
def func_auto():"""用例级别fixture,作用域单个用例"""print("\n---function级别的用例前置操作---")yieldprint("---function级别的用例后置操作---")# test_01会引用func_auto函数,test_02没有用修饰器修饰,故不会引用
def test_func_auto_fixture_1(func_auto):print("func 1 print")def test_func_auto_fixture_2():print("func 2 print")
2)class级别
fixture的scope值还可以是class,此时则fixture定义的动作就会在测试类class的所有用例之前和之后运行,需注意:测试类中只要有一个测试用例的参数中使用了class级别的fixture,则在整个测试类的所有测试用例都会调用fixture函数
① 用例类中的测试用例调用fixture
执行fixture定义的动作,以及此测试类的所有用例结束后同样要运行fixture指定的动作
@pytest.fixture(scope="class")
def class_auto():"""类级别fixture,作用域整个类"""print("\n---class级别的用例前置操作---")yieldprint("---class级别的用例后置操作---")class TestClassAutoFixture:# class级别的fixture任意一个用例引用即可def test_class_auto_fixture_1(self, class_auto):print("class 1 print")def test_class_auto_fixture_2(self):print("class 1 print")
测试类中的第1条测试用例引用了fixture修饰的函数,则整个测试类的所有测试用例都会执行fixture函数的前置操作,在所有用例执行完成后,都会执行fixture函数的后置操作。
② 用例类外的测试用例调用fixture
如果在类外的函数中去使用class级别的fixture,则此时在测试类外每个测试用例中,fixture跟function级别的fixture作用是一致的,即def test_class_auto_fixture(class_auto): print("class 1 print")
如下图所示,测试类外的函数引用了class级别的fixture,则它的作用会等同于function级别的fixture,运行结果如下:
3)module级别
在Python中module即.py文件,当fixture定义为module时,则此fixture将在当前文件中起作用。这里需要特别说明的是,当fixture的scope定义为module时,只要当前文件中有一个测试用例使用了fixture,不管这个用例是在类外,还是在类中,都会在当前文件(模块)的所有测试用例执行之前去执行fixture定义的行为以及当前文件的所有用例结束之后同样去执行fixture定义的对应操作。
@pytest.fixture(scope="module")
def module_auto():"""作用于整个py文件"""print("\n---module级别的用例前置操作---")yieldprint("---module级别的用例后置操作---")# 测试类外和测试类内的函数方法都调用了module级别的fixture,但整个py文件只会生效一次fixture。
def test_module_scope_out_class(module_auto):print("case scope 01")class TestScope1:def test_scope_01(self):print("case scope 01")def test_scope_02(self, module_auto):print("case scope 02")def test_scope_03(self):print("case scope 03")
若类中的方法分别调用了class级别的fixture和module级别的fixture,则会两个fixture都生效:
# 顺序在前面fixture会先执行
def test_scope_01(self, module_auto, class_auto): print("case scope 01")
若类中的方法同时调用了function级别、class级别、module级别的fixture,则3种fixture会同时生效:
# 顺序在前面fixture会先执行
def test_scope_02(self, module_auto, class_auto, func_auto): print("case scope 02")
4)session级别(使用conftest.py共享fixture)
当fixture的scope定义为session时,是指在当前目录下的所有用例之前和之后执行fixture对应的操作
fixture为session级别是可以跨.py模块调用的,也就是当我们有多个.py文件的用例的时候,如果多个用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里
使用方式:
① 定义测试用例文件
② 在指定目录下创建conftest.py(固定命名,不可修改)文件,然后在conftest.py文件中定义fixture方法,将scope指定为session,此时在当前目录下只要有一个用例使用了此fixture,则就会在当前目录下所有用例之前和之后会执行fixture定义的对应的操作。
@pytest.fixture(scope="session", )
def session_auto():"""session级别的fixture,针对该目录下的所有用例都生效"""print("\n---session级别的用例前置操作---")yieldprint("---session级别的用例后置操作---")
定义了session级别的fixture,存放于该用例文件的同一个目录下的conftest.py文件中,该目录下的任一用例文件中的任一测试用例,引用了这个session级别的fixture,则这个session级别的fixture会针对这整个用例文件会生效。若存放在根目录下,则针对整个工程的所有用例都会生效。
class TestSessionAutoFixture:# session级别的fixture任意一个用例引用即可def test_session_auto_fixture_1(self, session_auto):print("session 1 print")def test_session_auto_fixture_2(self):print("session 1 print")def test_session_auto_fixture():print("session 1 print")
运行结果如下:
5.Pytest fixture其他参数用法
1)ids参数-修改用例结果名称
@pytest.mark.parametrize() 还提供了第三个 ids 参数来自定义显示结果。
stars = ["刘德华", "张学友", "黎明", "郭富城"]
# 利用列表生成式生成一个用例名称的列表
ids = [f"test-case-{d}" for d in range(len(stars))]@pytest.mark.parametrize("name", stars, ids=ids)
def test_multi_param(name):print(f"my name is {name}")
注:ids生成的用例名称数量一定要和用例数量一致,否则会报错,执行结果如下:
2)name参数-重命名fixture函数名称
@pytest.fixture(name="rename_get_user_info")
def get_user_info():user_name = "周润发"print(user_name)# 此处需传入重命名后的fixture函数名
@pytest.mark.usefixtures("rename_get_user_info")
def test_parametrize_by_use_fixtures():"""通过usefixtures装饰器传入fixture"""print(f"test parametrize use fixtures")def test_parametrize_by_fixture_name(rename_get_user_info):"""将fixture函数名作为形参传入"""print(f"test parametrize use fixtures")
3)params参数-提供返回值供测试函数调用
示例一
@pytest.fixture(params=[{"name": "周润发"}, {"age": 61}, {"height": 183}])
def fix_func(request): # request为内建fixture# 使用request.param作为返回值供测试函数调用,params的参数列表中包含了做少元素,该fixture就会被调用几次,分别作用在每个测试函数上return request.param # request.param为固定写法def test_fix_func(fix_func):print(f"fixture函数fix_func的返回值为:{fix_func}")"""打印结果如下:fixture函数fix_func的返回值为:{'name': '周润发'}fixture函数fix_func的返回值为:{'age': 61}fixture函数fix_func的返回值为:{'height': 183}"""
示例二
params = [{"case_id": 1, "case_title": "验证正常添加车辆", "car_name": "苏C99688", "car_type": 1, "origin": 1, "expected": "200"},{"case_id": 2, "case_title": "验证添加重复车辆", "car_name": "苏C99688", "car_type": 1, "origin": 1, "expected": "500"},{"case_id": 3, "case_title": "验证车牌号为空", "car_name": "", "car_type": 2, "origin": 1, "expected": "500"}]@pytest.fixture(params=params)
def add_car_params(request):return request.paramdef test_add_car(add_car_params):print(f"{add_car_params['case_id']}-{add_car_params['case_title']}-{add_car_params['car_name']}")"""运行结果如下:1-验证正常添加车辆-苏C996882-验证添加重复车辆-苏C996883-验证车牌号为空-"""
6.内置fixture
1)tmpdir和tmpdir_factory
内置的tmpdir和tmpdir_factory负责在测试开始运行前创建临时文件目录,并在测试结束后删除。如果测试代码要对文件进行读/写操作,那么可以使用tmpdir或tmpdir_factory来创建文件或目录。单个测试使用tmpdir,多个测试使用tmpdir_factory。tmpdir的作用范围是函数级别,tmpdir_factory的作用范围是会话级别。
def test_tmpdir(tmpdir):# tmpdir already has a path name associated with it# join() extends the path to include a filename# the file is created when it's written toa_file = tmpdir.join('something.txt')# you can create directoriesa_sub_dir = tmpdir.mkdir('anything')# you can create files in directories (created when written)another_file = a_sub_dir.join('something_else.txt')# this write creates 'something.txt'a_file.write('contents may settle during shipping')# this write creates 'anything/something_else.txt'another_file.write('something different')# you can read the files as wellassert a_file.read() == 'contents may settle during shipping'assert another_file.read() == 'something different'def test_tmpdir_factory(tmpdir_factory):# you should start with making a directory# a_dir acts like the object returned from the tmpdir fixturea_dir = tmpdir_factory.mktemp('mydir')# base_temp will be the parent dir of 'mydir'# you don't have to use getbasetemp()# using it here just to show that it's availablebase_temp = tmpdir_factory.getbasetemp()print('base:', base_temp)# the rest of this test looks the same as the 'test_tmpdir()'# example except I'm using a_dir instead of tmpdira_file = a_dir.join('something.txt')a_sub_dir = a_dir.mkdir('anything')another_file = a_sub_dir.join('something_else.txt')a_file.write('contents may settle during shipping')another_file.write('something different')assert a_file.read() == 'contents may settle during shipping'assert another_file.read() == 'something different'
2)pytestconfig
内置的pytestconfig可以通过命令行参数、选项、配置文件、插件、运行目录等方式来控制pytest。pytestconfig是request.config的快捷方式,它在pytest文档里有时候被称为“pytest配置对象”。
要理解pytestconfig如何工作,可以添加一个自定义的命令行选项,然后在测试中读取该选项。
def pytest_addoption(parser):""""添加一个命令行选项"""parser.addoption("--env", default="test", choices=["dev", "test", "pre"], help="enviroment parameter")
以pytest_addoption添加的命令行选项必须通过插件来实现,或者在项目顶层目录的conftest.py文件中完成。它所在的conftest.py不能处于测试子目录下。
上述是一个传入测试环境的命令行选项,接下来可以在测试用例中使用这些选项。
def test_option(pytestconfig):print('the current environment is:', pytestconfig.getoption('env'))
# 运行测试
pytest -s -q test_config.py::test_option
由于前面的pytest_addoption中定义的env的默认参数是test,所以通过pytestconfig.getoption获取到的env的值就是test:
3)其他内置fixture
- cache:作用是存储一段测试会话的信息,在下一段测试会话中使用;
- capsys:capsys 有两个功能:允许使用代码读取 stdout 和 stderr;可以临时禁制抓取日志输出;
- monkeypatch:可以在运行期间对类或模块进行动态修改。在测试中,monkey patch 常用于替换被测试代码的部分运行环境,或者将输入依赖或输出依赖替换成更容易测试的对象或函数;
- doctest_namespace:doctest 模块是 Python 标准库的一部分,借助它,可以在函数的文档字符串中放入示例代码,并通过测试确保有效。你可以使用 --doctest-modules 标识搜寻并运行 doctest 测试用例;
- recwarn:可以用来检查待测代码产生的警告信息;recwarn 的值就像是一个警告信息列表,列表里的每个警告信息都有4个属性 category、message、filename、lineno。警告信息在测试开始后收集,如果你在意的警告信息出现在测试尾部,则可以在信息收集前使用 recwarn.clear() 清除不需要的内容。除了 recwarn,pytest 还可以使用 pytest.warns() 来检查警告信息。
二、Pytest conftest全局作用文件详解
Pytest支持在测试的目录中,创建conftest.py文件,进行全局配置。
conftest.py文件须知:
- 可以跨.py文件调用,有多个.py文件调用时,可让conftest.py只调用了一次fixture,或调用多次fixture;
- conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件;
- 不需要import导入conftest.py,pytest用例会自动识别该文件,放到项目的根目录下就可以全局目录调用了,如果放到某个package下,那就在package内有效,可有多个conftest.py;
- conftest.py配置脚本名称是固定的,不能改名称;
- conftest.py文件不能被其他文件导入;
- 所有同目录测试文件运行前都会执行conftest.py文件;
敲字不易,如果此文章对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
相关文章:

自动化测试 —— Pytest fixture及conftest详解!
前言 fixture是在测试函数运行前后,由pytest执行的外壳函数。fixture中的代码可以定制,满足多变的测试需求,包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在,类似u…...

Nginx解析漏洞
常见的解析漏洞: IIS 5.x/6.0解析漏洞 IIS 7.0/IIS 7.5/ Nginx <0.8.3畸形解析漏洞 Nginx <8.03 空字节代码执行漏洞 Apache解析漏洞 Nginx文件解析漏洞 对于任意文件名,例如:cd.jpg在后面添加/x.php后,即可将文件作为php解析。 原理…...

【机器学习】决策树原理及scikit-learn使用
文章目录 决策树详解ID3 算法C4.5算法CART 算法 scikit-learn使用分类树剪枝参数重要属性和接口 回归树重要参数,属性及接口交叉验证代码示例 一维回归的图像绘制 决策树详解 决策树(Decision Tree)是一种非参数的有监督学习方法,…...

#基于一个小车项目的FREERTOS分析(一)系统时钟
系统时钟 //初始化延迟函数 //SYSTICK的时钟固定为AHB时钟,基础例程里面SYSTICK时钟频率为AHB/8 //这里为了兼容FreeRTOS,所以将SYSTICK的时钟频率改为AHB的频率! //SYSCLK:系统时钟频率 /* 系统定时器是一个 24bit 的向下递减的计数器&…...

ubuntu mmdetection配置
mmdetection配置最重要的是版本匹配,特别是cuda,torch与mmcv-full 本项目以mmdetection v2.28.2为例介绍 1.查看显卡算力 因为gpu的算力需要与Pytorch依赖的CUDA算力匹配,低版本GPU可在相对高的CUDA版本下运行,相反则不行 算力…...

嵌入式面试常见问题(一)
目录 1.什么情况下会出现段错误? 2.swap() 函数为什么不能交换两个变量的值 3.一个函数有六个参数 分别放在哪个区? 4.定义一个变量,赋初值和不赋初值分别保存在哪个区? 5.linux查看端口状态的命令 6.结构体中->和.的区…...

docker批量删除本地镜像
docker rmi -f $(docker images|grep docker|awk {print $3})...

数据结构(一)—— 数据结构简介
文章目录 一、基本概念和术语?1.1、数据1.2、数据元素1.3、数据项(属性、字段)1.4、数据对象1.5、数据结构 二、逻辑结构和物理结构(存储结构)2.1、逻辑结构1、定义2、分类(线性结构和非线性结构࿰…...

Ubuntu输入正确密码重新跳到登录界面
Ubuntu输入正确密码重新跳到登录界面 问题描述 输入正确的密码登录后闪一下又回到锁屏界面 输入正确的密码后还是回到这个界面 产生的原因 /etc/profile或者/etc/enviroment出现了问题,导致无法正常登录 该错误产生的原因不止一个 这里是因为/etc/profile或者/etc/enviromen出…...

TCP/IP(十四)流量控制
一 流量控制 说明: 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…...

CSS网页标题图案和LOGO SEO优化
favicon图标 将网页的头名字旁边放入一个图案 想将想要的图案切成png图片 然后把png图片转换成ico图案可以借助进行访问 将语法引用到head里面 SEO译为搜索引擎优化。是一种利用搜索引擎的规则提高网站有关搜索引擎的自然排名的方式 SEO的目的是对网站进行深度的优化&…...

机器人制作开源方案 | 双轮提升搬运小车
1. 功能描述 双轮提升搬运小车是一种用于搬运和移动物体的机械设备,它通常采用双轮驱动和提升装置。一般具备以下特点: ① 双轮驱动:该小车配备两个驱动轮,通过电动机或其它动力源驱动,提供足够的动力和扭矩࿰…...

5G安卓核心板-MT6833/MT6853核心板规格参数
随着智能手机的不断发展,芯片技术在推动手机性能和功能方面发挥着关键作用。MT6833和MT6853安卓核心板是两款高度集成的基带平台,为LTE/5G/NR和C2K智能手机应用提供强大的处理能力和多样化的接口。 这两款安卓核心板都集成了蓝牙、FM、WLAN和GPS模块&…...

信创之国产浪潮电脑+统信UOS操作系统体验4:visual studio code中怎么显示中文
☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 今天在vscode中打开以前的一段C代码,其中的中文显示为乱码,如图所示: 而在统信文本编辑器打开是正常的,打开所有菜单,没有找到相关配置…...

Magica Cloth 使用方法笔记
Magica Cloth 使用方法笔记 效果展示: 参考资料: 1、官方使用文档链接: インストールガイド – Magica Soft 2、鱼儿效果案例: https://www.patreon.com/posts/69459293 3、插件工具链接:版本() 目录:…...

c++ 学习之 强制类型转换运算符 const_cast
看例子怎么用 int main() {int a 1;int* p a;// 会发生报错// 如果学着 c的风格类型转换int* pp (int*)a;*pp 1; // 编译不报错,但是运行报错// const_castconst int n 5;const std::string s "lalal";// const cast 只针对指针,引用&…...

Ceph相关部署应用(博客)
这里写目录标题 Ceph相关部署应用一.存储基础1.单机存储设备2.商业存储解决方案3.分布式存储(软件定义的存储 SDS) 二.Ceph 简介1.Ceph2.Ceph 优势3.Ceph 架构4.Ceph 核心组件5.OSD 存储后端6.Ceph 数据的存储过程7.Ceph 版本发行生命周期8.Ceph 集群部署…...

基于 ceph-deploy 部署 Ceph 集群 超详细
Ceph part1 一、存储基础1.1 单机存储设备1.2 单机存储的问题1.3 单机存储问题的解决方案1.3.1 商业存储解决方案1.3.2 分布式存储(软件定义的存储 SDS) 二、分布式存储2.1 常见的分布式存储2.2 分布式存储的类型 三、Ceph概述3.1 Ceph简介3.2 Ceph 优势…...

做一个物联网的后台程序与数据库设计
数据库部分 先设计一个简单的数据库。表结构如下: sql语句如下: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for realtimedata -- ---------------------------- DROP TABLE IF EXISTS `realtimedata`...

Pytorch深度学习—FashionMNIST数据集训练
文章目录 FashionMNIST数据集需求库导入、数据迭代器生成设备选择样例图片展示日志写入评估—计数器模型构建训练函数整体代码训练过程日志 FashionMNIST数据集 FashionMNIST(时尚 MNIST)是一个用于图像分类的数据集,旨在替代传统的手写数字…...

uniapp 返回上一步携带参数
1. 下一步 // 返回上一页setTimeout(() > {let pages getCurrentPages();let prevPage pages[pages.length - 2];prevPage.$vm.schoolName this.formList;uni.navigateBack({delta: 1});}, 1000) 2. 返回上一步, 携带参数 // 获取下一步返回的数据onShow() {let pages …...

软件工程与计算总结(七)需求文档化与验证
目录 一.文档化的原因 二.需求文档基础 1.需求文档的交流对象 2.用例文档 3.软件需求规格说明文档 三.需求文档化要点 1.技术文档协作要点 2.需求书写要点 3.软件需求规格说明文档属性要点 四.评审软件需求规格说明文档 1.需求验证与确认 2.评审需求的注意事项 五…...

MySQL锁概述
数据库锁是一种机制,用于管理并发访问数据库的方式。当多个用户或事务同时访问数据库时,可能会导致数据不一致或冲突的问题。数据库锁的作用是确保数据的一致性和完整性,同时允许多个用户并发地访问数据库。 需要注意的是,加锁是消…...

【Ceph Block Device】块设备挂载使用
文章目录 前言创建pool创建user创建image列出image检索image信息调整image大小增加image大小减少image大小 删除image从pool中删除image从pool中“延迟删除”image从pool中移除“延迟删除的image” 恢复image恢复指定pool中延迟删除的image恢复并重命名image 映射块设备格式化i…...

Arbitrum Stylus 的工作原理
理解 Arbitrum 如何协调 EVM 和 WASM 的共存是至关重要的。这不仅仅是拥有两个独立的引擎;这是一种增强两者优势的协同关系。 Arbitrum 的独特架构允许 EVM 和 WASM 之间进行无缝和同步的操作,这要归功于其统一的状态、跨 VM 调用和兼容的经济模型。 用…...

nextjs构建服务端渲染,同时使用Material UI进行项目配置
一、创建一个next项目 使用create-next-app来启动一个新的Next.js应用,它会自动为你设置好一切 运行命令: npx create-next-applatest 执行结果如下: 启动项目: pnpm dev 执行结果: 启动成功! 二、安装Mater…...

Java 使用 Easyexcel 导出大量数据
读Excel | Easy Excel 1、 我遇到的数据量超级大,使用传统的POI方式来完成导入导出很明显会内存溢出,并且效率会非常低;2、 数据量大直接使用select * from tableName肯定不行,一下子查出来300w条数据肯定会很慢;3、 …...

高效防汛决策:山海鲸可视化系统助力城市防洪
随着全球气候的变化,自然灾害如洪水、台风等频发,防范洪水成为城市管理者和居民们亟待解决的重要问题。 洪水的威胁 洪水是自然界的杀手之一,不仅会造成大量的财产损失,还可能危害人们的生命安全。因此,预测、监测和有…...

易点云CFO向征:CFO不能只讲故事,价值创造才是核心
作者 | 曾响铃 文 | 响铃说 在今年6月初,也是易点云上市6天后,《巴伦周刊》正式启动评价“2023港美上市中国企业CFO精英100”的活动。 时间来到9月,评价揭秘,易点云CFO向征成功入选,被评为“年度最具成长潜力CFO”…...

【计算机网络】poll | epoll
文章目录 1. pollpoll函数参数解析代码解析PollServer代码 poll 特点 2. epoll认识接口epoll_createepoll_ctlepoll_wait 基本原理红黑树就绪队列 1. poll poll函数参数解析 输入 man poll poll的第一个参数是文件描述符 poll的第二个参数为 等待的多个文件描述符(fd)数字层面…...