外贸网站推广机构,网站404怎么解决,个人网站 不备案,百度域名书写conftest介绍
pytest中定义个conftest.py来实现数据#xff0c;参数#xff0c;方法、函数的共享。 conftest.py 的文件名称是固定的#xff0c; pytest 会自动识别该文件#xff0c;可以理解成一个专门存放 fixture 的配置文件。一个工程下可以建多个 conftest.py 文件参数方法、函数的共享。 conftest.py 的文件名称是固定的 pytest 会自动识别该文件可以理解成一个专门存放 fixture 的配置文件。一个工程下可以建多个 conftest.py 文件一般我们都是在工程根目录下设置的 conftest 文件这样会起到一个全局的作用。 我们也可以在不同的子目录下放 conftest.py 这样作用范围只能在该层级的子目录下生效。控制作用域 conftest.py三个功能
设置项目和fixture加载插件在 conftest.py 中初始化插件或外部库指定钩子函数设置全局变量、环境变量或模拟外部服务 层级化配置 目录结构示例 project/ ├── conftest.py # 作用范围全局 └── tests/ ├── conftest.py # 作用范围tests 目录 └── subdir/ ├── conftest.py # 作用范围subdir 目录 └── test_b.py 优先级子目录的 conftest.py 优先级高于父目录同名 Fixture 会被覆盖。
conftest特点
conftest.py可以跨.py文件调用有多个.py文件调用时可让conftest.py只调用了一次fixture或调用多次fixtureconftest.py与运行的用例要在同一个pakage下并且有init.py文件不需要import导入 conftest.pypytest用例会自动识别该文件放到项目的根目录下就可以全局目录调用了如果放到某个package下那就在改package内有效可有多个conftest.pyconftest.py配置脚本名称是固定的不能改名称conftest.py文件不能被其他文件导入所有同目录测试文件运行前都会执行conftest.py文件
conftest使用场景
fixture适用于在同一个py文件中多个用例执行时的使用而conftest.py方式适用于多个py文件之间的数据共享。
比如常见的有以下场景
请求接口需要共享登录接口的token/session多个case共享一套测试数据多个case共享配置信息 conftest示例
项目结构 # conftest.pyimport pytestpytest.fixture(scopesession)# pytest.fixture(scopemodule)# pytest.fixture(scopeclass)# pytest.fixture(scopefunction)def get_token():token qeehfjejwjwjej11sss22print(conftest中輸出token:%s % token)return token
# test_02.pyimport pytestclass Test(object):def test2(self, get_token):token qeehfjejwjwjej11sss22print(【执行test02.py-Test类-test2用例,获取get_token%s】 % get_token)assert get_token token
# test_03.pyimport pytestclass 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 token
# run.pyimport pytestif __name__ __main__:pytest.main([-s]) 执行结果 当conftest.py中的fixture(scopesession)时所有的测试py文件执行前执行一次当conftest.py中的fixture(scopemodule)时每一个测试.py文件执行前都会执行一次conftest文件中的fixture当conftest.py中的fixture(scopeclass)时每一个测试文件中的测试类执行前都会执行一次conftest文件中的当conftest.py中的fixture(scopefunction)时所有文件的测试用例执行前都会执行一次conftest文件中的fixture
conftest结合fixture使用
scope参数为session所有测试.py文件执行前执行一次scope参数为module每一个测试.py文件执行前都会执行一次conftest文件中的fixturescope参数为class每一个测试文件中的测试类执行前都会执行一次conftest文件中的scope参数为function所有文件的测试用例执行前都会执行一次conftest文件中的fixture conftest结合fixture使用示例 yield实现teardown
每个测试用例完成后应该做好资源回收此时就需要使用到 teardown函数的善后工作了。 用 fixture 实现 teardown 并不是一个独立的函数而是用 yield 关键字来开启 teardown 操作。
fixture与conftest结合之前置后置处理 addfinalizer实现回收用例后置处理
除了 yield 可以实现 teardown 在 request-context 对象中注册 addfinalizer 方法也可以实现终结函数。 在用法上 addfinalizer 跟 yield 是不同的需要你去注册作为终结器使用的函数。 例如增加一个函数并且注册成终结函数。
pytest.fixture(scope )范围依旧可控制作用域
# conftest.pyimport pytestpytest.fixture()def get_token(request):print(用例执行前)token qeehfjejwjwjej11sss22def teardown01():print(用例后置处理111)def teardown02():print(用例后置处理222)request.addfinalizer(teardown01)request.addfinalizer(teardown02)return token
执行结果 fixture参数传递
参数传递有两个方向一个是case给conftest.py传递参数另一个是case中pytest.mark.parametrize给用例传递参数下面介绍一下常用的参数传递方式。 parametrize向下给case传递参数参数化执行不向fixture传递参数
pytest.fixture()def ft_func(request):data creturn datapytest.mark.parametrize(list, [a, b])def test_create_func(list, ft_func):print(flist参数化中数据{list}\n fixture获取值{ft_func}) # 执行两次分别传入a和b参数if __name__ __main__:pytest.main([-s])
执行结果 parametrize向上给fixture传递参数
当 indirectTrue时prepareas才会当成一个函数去执行而不是一个参数并将data第二个参数当做参数传入函数。
import pytest传单个参数当 indirectTruegetuser才会当成一个函数去执行而不是一个参数并将data当做参数传入函数。test_getuser(self, getuser)这里的getuser是获取fixture返回的值。# pytest.fixture(params[1,2,3,linda])pytest.fixture()def getuser(request):user request.paramprint(f 获取用户: {user})return userdata [lilei, jojo, hanmeimei]# 用英文哈,中文会被加密ids [f mark input {user} for user in data]pytest.mark.parametrize(getuser, data, idsids, indirectTrue)class TestClass(object):def test_getuser(self, getuser):print(f输出用户信息{getuser})
执行结果 import pytest传多个参数(结合字典的使用)pytest.fixture()def getlogins(request):param request.paramprint(f 获取用户名: {param[username]} 获取密码{param[password]})return paramdata [{username: jojo, password: 123456},{username: hanmeimei, password: 123456},{username: lilei, password: 123456}]pytest.mark.parametrize(getlogins, data, indirectTrue)def test_getlogin(getlogins):print(f用户名{getlogins[username]} 密码{getlogins[password]})
执行结果 import pytest一个装饰器加多个fixture单参数传递pytest.fixture(scopemodule)def getusername(request):username request.paramprint(f username is {username})return usernamepytest.fixture(scopemodule)def getpassword(request):password request.paramprint(f password is {password})return passworddata [(jojo, 1), (lilei, 123654)]pytest.mark.parametrize(getusername,getpassword, data, indirectTrue)def test_getUserinfo(getusername, getpassword):print(f用户名{getusername} 密码{getpassword})
执行结果 import pytest一个装饰器加多个fixture多参数传递pytest.fixture(scopemodule)def get_user(request):param request.param# print(type(param))print(f获取用户信息 用户{param[name]} 年龄:{param[age]})return parampytest.fixture(scopemodule)def get_account(request):param request.param# print(type(param))print(f获取账号信息 账号{param[username]}\n密码 {param[password]})return paramdata [({name: jojo, age: 18}, {username: jojo001, password: 123456}),({name: zhangSan, age: 19}, {username: zhangSan001, password: 123451})]pytest.mark.parametrize(get_user,get_account, data, indirectTrue)def test_get_user_info(get_user, get_account):print(f用户信息{get_user} \n用户账号{get_account})
执行结果 import pytest多个装饰器多个fixturepytest.fixture()def users(request):user request.paramprint(f 用户名{user})return userpytest.fixture()def pwds(request):pwd request.paramprint(f 密码{pwd})return pwddata1 [lilei, jojo]data2 [1, 2]pytest.mark.parametrize(users, data1, indirectTrue)pytest.mark.parametrize(pwds, data2, indirectTrue)def test_getuserinfo(users, pwds):print(f用户名为{users} 密码为{pwds})
执行结果 import pytestfixture未传参数使用默认值/传参数使用参数pytest.fixture(scopemodule)def getusername(request):username 王五print(request)if hasattr(request, param):username request.paramprint(f username is {username})return usernamedata [张三, 李四]# 使用fixture中默认参数def test_user001(getusername):print(f用户名{getusername})# 传参给fixture并使用pytest.mark.parametrize(getusername, data, indirectTrue)def test_user002(getusername):print(f用户名{getusername})
执行结果 【自动化测试】Pytest之conftest详解 - 三叔测试笔记 - 博客园