Python pytest框架之@pytest.fixture()和conftest详解

一、fixture简介
学pytest就不得不说fixture,fixture是pytest的精髓所在,类似unittest中setup/teardown这种前后置东西。但是比它们要强大、灵活很多,它的优势是可以跨文件共享
fixture的目的是提供一个固定基线,在该基线上测试可以可靠地和重复地执行。fixture提供了区别于传统单元测试(setup/teardown)有显著改进
1、有独立的命名,并通过声明它们从测试函数、模块、类或整个项目中的使用来激活。
2、按模块化的方式实现,每个fixture都可以互相调用。
3、fixture的范围从简单的单元扩展到复杂的功能测试,允许根据配置和组件选项对fixture和测试用例进行参数化,或者跨函数function、类class、模块module或整个测试会话sessio范围。

二、用途:
1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现
2.测试用例的前置条件可以使用fixture实现
3.支持经典的xunit fixture ,像unittest使用的setup和teardown
4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题

三、fixture作为参数传入:
1、定义fixture跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(),fixture命名不要用test_开头,跟用例区分开。用例才是test_开头的命名。
2、fixture是可以有返回值的,如果没return默认返回None。用例调用fixture的返回值,直接就是把fixture的函数名称当成变量传入
3、fixture装饰器里的scope有四个级别的参数。“function(不写默认这个)”,“class”,“module”or“session”
4、除scope之外。还有params、autouse、ids、name等。
5、fixture可以有返回值,如果没有return,默认会是None;用例调用fixture的返回值,就是直接把fixture的函数名称作为参数传入

6、fixture可以返回一个元组、列表或字典

7、test_用例可传单个、多个fixture参数

8、fixture与fixture间可相互调用

fixture可以返回一个元组、列表或字典@pytest.fixture()
def user():print("=====打印装饰器函数=====")username='wangli'psw=123456assert username=="wangli"assert psw == 123456return username,psw
def test_login(user):print(user)assert user[0]=="wangli"assert user[1] == 123456if __name__=="__main__":pytest.main(["-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\test\test
collected 1 itemtest03.py =====打印装饰器函数=====
('wangli', 123456)
.============================== 1 passed in 0.16s ==============================Process finished with exit code 0
test_用例可传单个、多个fixture参数@pytest.fixture()
def username():print("=====打印username装饰器函数=====")username='wangli'assert username=="wangli"return username
@pytest.fixture()
def psw():print("=====打印psw装饰器函数=====")psw=123456assert psw==123456return psw
def test_login(username,psw):print(username,psw)assert username=="wangli"assert psw == 123456if __name__=="__main__":pytest.main(["-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\test\test
collected 1 itemtest03.py =====打印username装饰器函数=====
=====打印psw装饰器函数=====
wangli 123456
.============================== 1 passed in 0.13s ==============================Process finished with exit code 0
fixture与fixture间可相互调用@pytest.fixture()
def first():print("=====first=====")username='wangli'assert username=="wangli"return username
@pytest.fixture()
def sencond(first):print("=====sencond=====")psw=123456assert psw==123456return first,psw
def test_login(sencond):print(sencond)assert sencond[0]=="wangli"assert sencond[1] == 123456if __name__=="__main__":pytest.main(["-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\test\test
collected 1 itemtest03.py =====first=====
=====sencond=====
('wangli', 123456)
.============================== 1 passed in 0.02s ==============================Process finished with exit code 0

四、fixture源码详解:
fixture(scope='function',params=None,autouse=False,ids=None,name=None):
fixture里面有个scope参数可以控制fixture的作用范围,scope:有四个级别参数"function"(默认),"class","module","session

params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它。
autouse:如果True,则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture
ids:每个字符串id的列表,每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成
name:fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽,解决这个问题的一种方法时将装饰函数命令"fixture_<fixturename>"然后使用"@pytest.fixture(name='<fixturename>')"。

五、fixture的作用范围

fixture里面有个scope参数可以控制fixture的作用范围:session>module>class>function

-function:每一个函数或方法都会调用

-class:每一个类调用一次,一个类中可以有多个方法

-module:每一个.py文件调用一次,该文件内又有多个function和class

-session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

function默认模式@pytest.fixture(scope='function')或 @pytest.fixture()


函数级别的,每一个函数或方法都会调用,每个测试用例执行前都会执行一次function级别的fixture
@pytest.fixture()如果不写参数,参数就是scope="function",它的作用范围是每个测试用例来之前运行一次,销毁代码在测试用例之后运行。

class类级别@pytest.fixture(scope='class')

如果一个class里面有多个用例,都调用了1次fixture,那么此fixture只在此class里所有用例开始前执行一次
 

@pytest.fixture(scope='class')
def test1():b = '男'print('传出了%s, 且只在class里所有用例开始前执行一次!!!' % b)return bclass TestCase:def test3(self, test1):name = '男'print('找到name')assert test1 == namedef test4(self, test1):sex = '男'print('找到sex')assert test1 == sex
if __name__=="__main__":pytest.main(["-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\test\test
collected 2 itemstest03.py 传出了男, 且只在class里所有用例开始前执行一次!!!
找到name
.找到sex
.============================== 2 passed in 0.09s ==============================Process finished with exit code 0

module模块级别@pytest.fixture(scope='module')

每一个.py文件调用一次,fixture为module时,在当前.py脚本里面所有用例开始前只执行一次,模块里所有的用例执行前执行一次module级别的fixture

@pytest.fixture(scope='module')
def test1():b = '男'print('传出了%s, 且在当前py文件下执行一次!!!' % b)return bdef test3(test1):name = '男'print('找到name')assert test1 == nameclass TestCase:def test4(self, test1):sex = '男'print('找到sex')assert test1 == sex
if __name__=="__main__":pytest.main(["-s","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\test\test
collected 2 itemstest03.py 传出了男, 且在当前py文件下执行一次!!!
找到name
.找到sex
.============================== 2 passed in 0.09s ==============================Process finished with exit code 0

 

session 会话级别@pytest.fixture(scope='session')

1、可以跨.py文件调用,有多个.py文件调用时,实际只调用了一次fixture

2、conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件

3、不需要import导入 conftest.py,pytest会自动识别该文件,放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效

4、conftest.py配置脚本名称是固定的,不能改名称

多个.py文件只调用1次fixtureimport pytest
# conftest.py
@pytest.fixture(scope='session')
def get_token():token = 'qeehfjejwjwjej11sss@22'print('获取到token:%s' % token)return tokenimport pytest
# test02.py
class Test(object):def test2(self,get_token):token = 'qeehfjejwjwjej11sss@22'print("【执行test02.py-Test类-test2用例,获取get_token:%s】" %get_token)assert get_token == tokenif __name__=="__main__":pytest.main(["-s","test02.py","test03.py"])import pytest
#test03.py
class Test(object):def test3(self,get_token):token = 'qeehfjejwjwjej11sss@22'print("【执行test03.py-Test类-test3用例,获取get_token:%s】" %get_token)assert get_token == tokendef test4(self,get_token):token = 'qeehfjejwjwjej11sss@22'print("【执行test03.py-Test类-test4用例,获取get_token:%s】" %get_token)assert get_token == tokenif __name__=="__main__":pytest.main(["-s","test02.py","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test02.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 itemstest02.py 获取到token:qeehfjejwjwjej11sss@22
【执行test02.py-Test类-test2用例,获取get_token:qeehfjejwjwjej11sss@22】
.
test03.py 【执行test03.py-Test类-test3用例,获取get_token:qeehfjejwjwjej11sss@22】
.【执行test03.py-Test类-test4用例,获取get_token:qeehfjejwjwjej11sss@22】
.============================== 3 passed in 0.30s ==============================Process finished with exit code 0多个.py文件只调用多次fixtureimport pytest
# conftest.py
@pytest.fixture()
def get_token():token = 'qeehfjejwjwjej11sss@22'print('获取到token:%s' % token)return tokenimport pytest
# test02.py
class Test(object):def test2(self,get_token):token = 'qeehfjejwjwjej11sss@22'print("【执行test02.py-Test类-test2用例,获取get_token:%s】" %get_token)assert get_token == tokenif __name__=="__main__":pytest.main(["-s","test02.py","test03.py"])import pytest
#test03.py
class Test(object):def test3(self,get_token):token = 'qeehfjejwjwjej11sss@22'print("【执行test03.py-Test类-test3用例,获取get_token:%s】" %get_token)assert get_token == tokendef test4(self,get_token):token = 'qeehfjejwjwjej11sss@22'print("【执行test03.py-Test类-test4用例,获取get_token:%s】" %get_token)assert get_token == tokenif __name__=="__main__":pytest.main(["-s","test02.py","test03.py"])"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/Test/test/test03.py
============================= test session starts =============================
platform win32 -- Python 3.5.2, pytest-5.1.2, py-1.8.0, pluggy-0.12.0
rootdir: C:\Users\wangli\PycharmProjects\Test\test
collected 3 itemstest02.py 获取到token:qeehfjejwjwjej11sss@22
【执行test02.py-Test类-test2用例,获取get_token:qeehfjejwjwjej11sss@22】
.
test03.py 获取到token:qeehfjejwjwjej11sss@22
【执行test03.py-Test类-test3用例,获取get_token:qeehfjejwjwjej11sss@22】
.获取到token:qeehfjejwjwjej11sss@22
【执行test03.py-Test类-test4用例,获取get_token:qeehfjejwjwjej11sss@22】
.============================== 3 passed in 0.04s ==============================Process finished with exit code 0

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LInux下Ubuntu下查看端口占用及关闭

1、查看所有进程 ps -ef 或者 ps -aux a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序&#xff0c;不以终端机来区分 2、查看使用某端口的占用 lsof -i:8080 或者&#xff1a; netstat -ap|grep 8090 3、查看到进程id之后&#xff0c;使用netstat命令查看其占用的…

【Python】pandas模块中更改Series的数据类型

今天我们主要解决以下实际问题&#xff1a;一份黑名单数据存储在excel中&#xff0c;由于数据量庞大&#xff0c;现需要通过pandas找到某一列的重复数据&#xff0c;处理后再存入到excel中。 pandas 是基于NumPy 的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的,主…

Python Pytest调用fixture之@pytest.mark.usefixtures()、叠加usefixtures、@pytest.fixture(autouse=True)用法详解

usefixtures与传fixture区别 如果fixture有返回值&#xff0c;那么usefixture就无法获取到返回值&#xff0c;这个是装饰器usefixture与用例直接传fixture参数的区别。 当fixture需要用到return出来的参数时&#xff0c;只能讲参数名称直接当参数传入&#xff0c;不需要用到re…

ubuntu Django项目后台不挂断运行之screen命令

1、安装screen apt install screen 2、新建一个screen screen -S web这样就会新开一个窗口。cd到你需要的目录然后输入你想输入的命令。输入&#xff1a; python manage.py runserver 0.0.0.0:80 3、重新开一个窗口&#xff0c;列出所有screen进程 screen -ls4、如果之前的s…

【Python】Paramiko模块实现Linux服务器远程文件操作

ssh是一个协议&#xff0c;OpenSSH是其中一个开源实现&#xff0c;paramiko是Python的一个库&#xff0c;实现了SSHv2协议(底层使用cryptography)。 有了Paramiko以后&#xff0c;我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作&#xff0c;而不是通过ssh命令对…

Python Pytest中fixture之yield唤醒teardown和终结函数addfinalizer

引入 我们之前学习的都是测试用例的前置固件&#xff0c;也就是相当于“setup”。说到这&#xff0c;细心的你可能想到了&#xff0c;那有没有什么方式可以表示出“teardown”&#xff1f;这就是我们今天学习的yield和addfinalizer。 yield yield是一个关键字&#xff0c;它不…

django项目时间与Ubuntu时间不一致

今天发布项目后才发现log时间和win10系统时间或者date不一致。 查了好多。 最后&#xff1a;是django项目中settings中时区的问题 在settings中默认为UTC时区&#xff0c;我们应转换为中国时区 即做一下修改&#xff1a; LANGUAGE_CODE zh-Hans TIME_ZONE Asia/Shanghai…

【Python】Paramiko模块在Windows10中import ssl报错的处理方法

上一篇文章【Python】Paramiko模块实现Linux服务器远程文件操作 介绍了如何通过Paramiko进行 sftp的操作&#xff0c;但最近遇到一个问题&#xff0c;换上家里的windows10电脑后&#xff0c;执行脚本时发现报错&#xff1a;\lib\site-packages\cryptography\hazmat\bindings\op…

【Jmeter篇】Linux环境下安装部署运行Jmeter

JDK安装和配置 1、使用yum线上安装jdk1.8 yum -y list java* #浏览线上所有jdk版本列表 yum -y list java-1.8*#浏览线上jdk1.7版本列表 yum -y install java-1.8.0-openjdk* #下载安装jdk1.8套件 java -version #检查是否安装成功 2、配置全局环境变量 which java ls -…

django项目连接远程数据库

1、远程数据库开放连接权限 如果连接错误&#xff0c;请考虑 1&#xff09;用户添加访问其他ip权限 2&#xff09;3306端口是否开放 3&#xff09;阿里云服务器安全组规则是否添加3306端口 2、django项目中settings中的host填写远程数据库的公有ip&#xff0c;及填写远程数…

【Python实战】使用python批量生成发票

一般的贸易或者货运型公司&#xff0c;经常需要做发票&#xff0c;有时候我们会遇到需要做大批量重复性的发票时&#xff0c;如果人工一个个去做&#xff0c;即耗时而且容易出错&#xff0c;这时我们可以用的python和excel相关的模块去批量生成。 现在有这样一个场景&#xff…

【Jmeter篇】Jmeter踩坑记(一)

踩坑一&#xff1a; Response code: Non HTTP response code: java.net.SocketTimeoutException Response message: Non HTTP response message: connect timed out 查看Load time的时间要大于request设置的connect time out时间&#xff0c;所以抛出该异常。可能是由于服务端有…

Ajax动态拼接li并绑定事件

一、二对新增元素 再次进行绑定相应事件&#xff0c;例如在 Ajax 中的 success 返回函数中&#xff0c;再执行完新增元素的代码后进行绑定 success: $(body).append("<li idnew> new Li </li>"); //这里统一用click事件为例 $(#new).click(function(){}…

【PS】如何将截图获取的印章迁移到新图片上

有时候我们需要特殊签名或者合同印章时&#xff0c;可以通过其他图片上截图后&#xff0c;经过处理后放置到新的图片上&#xff0c;这个时候我们可以通过ps进行处理&#xff0c;主要三个流程&#xff1a; 1.截取需要的签名或印章&#xff0c;用ps消除多余的信息&#xff1b; 2…

【Jmeter篇】Jmeter分布式调度压测部署

Jmeter 是java 应用&#xff0c;对于CPU和内存的消耗比较大&#xff0c;因此&#xff0c;当需要模拟数以千计的并发用户时&#xff0c;使用单台机器模拟所有的并发用户就有些力不从心&#xff0c;甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力&#xff0c;j…

echarts案例链接

https://blog.csdn.net/luanpeng825485697/article/details/77198858 http://echarts.baidu.com/echarts2/doc/example/mix4.html#infographic

【工具】FTP软件FileZilla下载和连接服务器

作为一名偏后台程序测试的测试工程师&#xff0c;经常会接触运维相关工作&#xff0c;与服务器打交道。 一般公司会搭建内网环境和外网环境&#xff0c;项目开发、SIT测试主要是在内网环境做&#xff0c;然后等到UTA、预投产阶段在外网环境。 如果公司业务量大&#xff0c;多个…

【Fiddler篇】Stave插件之环境映射

Stave是一个Fiddler扩展插件&#xff0c;让Fiddler能将URL映射到本地目录&#xff0c;实现批量文件自动响应。 Fiddler自带的AutoResponder每条自动响应规则只能对应一个本地文件&#xff0c; 在文件数目较多的时候&#xff0c;使用起来很不方便&#xff0c;往往需要部署到本地…

C++ const 引用 指针答疑

常变量 const int a 常引用 const int &a 常指针 const int *a const * int a 用法1&#xff1a;常量 取代了C中的宏定义&#xff0c;声明时必须进行初始化(!c类中则不然&#xff09;。const限制了常量的使用方式&#xff0c;并没有描述常量应该如何分配。如果编译器知…

【Jmeter篇】临界区控制器Critical Section Controller业务流顺序负载压测

临界区控制器&#xff08;critical section Controller&#xff09; 作用&#xff1a;临界区控制器确保其子节点下的取样器或控制器将被执行&#xff08;只有一个线程作为一个锁&#xff09;确保它的子元素(samplers /控制器等)在执行控制器的子程序之前只执行一个线程作为指定…