中石油工程建设公司网站,社保在哪个网站做增员,河南免费网站建设公司推荐,建设厅公积金中心网站一、fixture简介 学pytest就不得不说fixture#xff0c;fixture是pytest的精髓所在#xff0c;类似unittest中setup/teardown这种前后置东西。但是比它们要强大、灵活很多#xff0c;它的优势是可以跨文件共享 fixture的目的是提供一个固定基线#xff0c;在该基线上测试可…一、fixture简介 学pytest就不得不说fixturefixture是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(打印装饰器函数)usernamewanglipsw123456assert usernamewangliassert psw 123456return username,psw
def test_login(user):print(user)assert user[0]wangliassert user[1] 123456if __name____main__:pytest.main([-s,test03.py])C:\Program Files\Python35\python.exe C:/Users/wangli/PycharmProjects/test/test/test03.pytest 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装饰器函数)usernamewangliassert usernamewanglireturn username
pytest.fixture()
def psw():print(打印psw装饰器函数)psw123456assert psw123456return psw
def test_login(username,psw):print(username,psw)assert usernamewangliassert psw 123456if __name____main__:pytest.main([-s,test03.py])C:\Program Files\Python35\python.exe C:/Users/wangli/PycharmProjects/test/test/test03.pytest 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)usernamewangliassert usernamewanglireturn username
pytest.fixture()
def sencond(first):print(sencond)psw123456assert psw123456return first,psw
def test_login(sencond):print(sencond)assert sencond[0]wangliassert sencond[1] 123456if __name____main__:pytest.main([-s,test03.py])C:\Program Files\Python35\python.exe C:/Users/wangli/PycharmProjects/test/test/test03.pytest 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源码详解 fixturescopefunctionparamsNoneautouseFalseidsNonenameNone fixture里面有个scope参数可以控制fixture的作用范围scope有四个级别参数function默认classmodulesession
params一个可选的参数列表它将导致多个参数调用fixture功能和所有测试使用它。 autouse如果True则为所有测试激活fixture func可以看到它。如果为False则显示需要参考来激活fixture ids每个字符串id的列表每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成 namefixture的名称。这默认为装饰函数的名称。如果fixture在定义它的统一模块中使用夹具的功能名称将被请求夹具的功能arg遮蔽解决这个问题的一种方法时将装饰函数命令fixture_fixturename然后使用pytest.fixturenamefixturename。
五、fixture的作用范围
fixture里面有个scope参数可以控制fixture的作用范围sessionmoduleclassfunction
-function每一个函数或方法都会调用
-class每一个类调用一次一个类中可以有多个方法
-module每一个.py文件调用一次该文件内又有多个function和class
-session是多个文件调用一次可以跨.py文件调用每个.py文件就是module
function默认模式pytest.fixture(scopefunction)或 pytest.fixture() 函数级别的每一个函数或方法都会调用每个测试用例执行前都会执行一次function级别的fixture pytest.fixture如果不写参数参数就是scopefunction它的作用范围是每个测试用例来之前运行一次销毁代码在测试用例之后运行。
class类级别pytest.fixture(scopeclass)
如果一个class里面有多个用例都调用了1次fixture那么此fixture只在此class里所有用例开始前执行一次。
pytest.fixture(scopeclass)
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.pytest 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 0module模块级别pytest.fixture(scopemodule)
每一个.py文件调用一次fixture为module时在当前.py脚本里面所有用例开始前只执行一次模块里所有的用例执行前执行一次module级别的fixture
pytest.fixture(scopemodule)
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.pytest 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(scopesession)
1、可以跨.py文件调用有多个.py文件调用时实际只调用了一次fixture
2、conftest.py与运行的用例要在同一个pakage下并且有__init__.py文件
3、不需要import导入 conftest.pypytest会自动识别该文件放到项目的根目录下就可以全局调用了如果放到某个package下那就在改package内有效
4、conftest.py配置脚本名称是固定的不能改名称
多个.py文件只调用1次fixtureimport pytest
# conftest.py
pytest.fixture(scopesession)
def get_token():token qeehfjejwjwjej11sss22print(获取到token:%s % token)return tokenimport pytest
# test02.py
class Test(object):def test2(self,get_token):token qeehfjejwjwjej11sss22print(【执行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 qeehfjejwjwjej11sss22print(【执行test03.py-Test类-test3用例,获取get_token%s】 %get_token)assert get_token tokendef test4(self,get_token):token qeehfjejwjwjej11sss22print(【执行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.pytest 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:qeehfjejwjwjej11sss22
【执行test02.py-Test类-test2用例,获取get_tokenqeehfjejwjwjej11sss22】
.
test03.py 【执行test03.py-Test类-test3用例,获取get_tokenqeehfjejwjwjej11sss22】
.【执行test03.py-Test类-test4用例,获取get_tokenqeehfjejwjwjej11sss22】
. 3 passed in 0.30s Process finished with exit code 0多个.py文件只调用多次fixtureimport pytest
# conftest.py
pytest.fixture()
def get_token():token qeehfjejwjwjej11sss22print(获取到token:%s % token)return tokenimport pytest
# test02.py
class Test(object):def test2(self,get_token):token qeehfjejwjwjej11sss22print(【执行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 qeehfjejwjwjej11sss22print(【执行test03.py-Test类-test3用例,获取get_token%s】 %get_token)assert get_token tokendef test4(self,get_token):token qeehfjejwjwjej11sss22print(【执行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.pytest 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:qeehfjejwjwjej11sss22
【执行test02.py-Test类-test2用例,获取get_tokenqeehfjejwjwjej11sss22】
.
test03.py 获取到token:qeehfjejwjwjej11sss22
【执行test03.py-Test类-test3用例,获取get_tokenqeehfjejwjwjej11sss22】
.获取到token:qeehfjejwjwjej11sss22
【执行test03.py-Test类-test4用例,获取get_tokenqeehfjejwjwjej11sss22】
. 3 passed in 0.04s Process finished with exit code 0