最近使用Pytest中的fixture和conftest时,遇到需要在conftest中的setup和teardown方法里传递参数。这里记录下几种实现的方式。

conftest.py
@pytest.fixture(scope="class")
def setup_func():
test_data = [{"k1": "v1"}, {"k2": "v2"}]
return test_data
testcase.py
def test_func(setup_func)
print(setup_func)
结果:
执行一条用例,输出:[{"k1": "v1"}, {"k2": "v2"}]
conftest.py
@pytest.fixture(scope="class")
def setup_func(request):
print(request.param)
return request.param
testcase.py
test_data = [{"k1": "v1"}, {"k2": "v2"}]
@pytest.mark.parametrize('setup_func', test_data, indirect=True)
def test_func(setup_func)
setup_func
结果:
执行两条用例,分别输出:{"k1": "v1"}, {"k2": "v2"}
注:
当 indirect=False 时,“setup_func”被当成普通变量;
当 indirect=True 时,“setup_func”被当成函数执行,且 “test_data”作为函数中的参数传递
confitest.py
@pytest.fixture(scope="class")
def setup_func1():
test_data1 = [{"k1": "v1"}, {"k2": "v2"}]
return test_data1
@pytest.fixture(scope="class")
def setup_func2(setup_func1):
a = setup_func1
b = [{"k11": "v11"}, {"k22": "v22"}]
return (a, b)
testcase.py
def test_aaa(self, setup_func2):
print(setup_func2)
结果:
执行一条用例,输出:([{'k1': 'v1'}, {'k2': 'v2'}], [{'k11': 'v11'}, {'k22': 'v22'}])
@python.fixture(scope="class") def teardown_func(): def _teardown_func(param1, param2): func() return _teardown_func