fixture
- 0、文档
- 1、局部前置处理
- 2、全局前置处理
- 3、全局前置处理
0、文档
pytest-fixture
fixture
1、局部前置处理
@pytest.fixture() 装饰器用于声明函数是一个fixture,该fixture的名字默认为函数名,也可以自己指定名称(name取别名)
- 测试函数可以直接使用fixture名称作为输入参数,在这种情况下,fixture函数返回的fixture实例将被注入。
- 可以使用yield或者return关键字把fixture函数里的值传递给test函数。
- 测试函数可以使用多个fixture;
- fixture本身还可以使用其他的fixture;
@pytest.fixture(scope="function", params=[], autouse=True, ids=[], name="xxx")
参数:
- scope – 定义被 @pytest.fixture修饰的方法的作用域;有 “function” (默认) “class” , “module” , “package” 或 “session” 。
- params – 参数化实现数据驱动(可支持列表、元组、字典列表、字典元组),获取当前参数可使用 request.param。
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture(scope="function", params=["hello", "hi", 123])
def ddt(request): # 通过request接收params中的参数
print("=====setup======")
yield request.param # 通过request.param获取当前使用的参数
print("=====teardown======")
class TestDemo:
def test_one(self):
print("---------hello world--------")
# 因autouse为False,故需显示引用,即测试函数可以直接使用fixture名称作为输入参数
def test_two(self, ddt):
print(f"--------{ddt}-------")
if __name__ == '__main__':
pytest.main("-vs")
3. autouse --如果为True,则自动执行
fixture,无需在测试函数使用fixture名称作为输入参数。如果为False(默认值),则需要显式引用(测试函数可以直接使用fixture名称作为输入参数)。
4. ids – 当使用params参数化时,给每一个值设置一个变量名,意义不大。
5. name --给被 @pytest.fixture修饰的方法取别名。取别名后原来的名字则无法使用。
2、全局前置处理
@pytest.fixture结合conftest.py
# -*- coding: utf-8 -*-
import pytest
def pytest_addoption(parser):
# 自定义命令行参数
parser.addoption('--passenger', action='store', help='passenger account')
parser.addoption('--driver', action='store', help='driver account')
@pytest.fixture
def replace_accounts(request):
# 获取命令行参数的值
passenger = request.config.getoption('--passenger')
driver = request.config.getoption('--driver')
return (passenger,driver)
测试文件:
class TestDemo:
# 因autouse为False,故需显示引用,即测试函数可以直接使用fixture名称作为输入参数
def test_one(self, replace_accounts):
p, d = replace_accounts[0], replace_accounts[1]
print(f"==========={p}===========")
print(f"==========={d}===========")
执行:python3 -m pytest -vs --passenger 111 --driver 222 test_666.py
3、全局前置处理
import importlib
import pytest
@pytest.fixture
def replace_param(request):
case_name = request.param.get('case_name')
passenger_phone = request.param.get('passenger_phone')
driver_phone = request.param.get('driver_phone')
module_name = "tests.test_{}".format(case_name)
test_module = importlib.import_module(module_name) # 通过importlib模块中的import_module函数动态导入指定测试用例模块
setattr(test_module, "passenger_phone", passenger_phone) # 用setattr函数来动态修改测试用例中的参数值
setattr(test_module, "driver_phone", driver_phone)
return test_module.test_case # fixture返回修改后的测试用例函数