好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

分享Pytest fixture参数传递的几种方式

1.背景

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

2.fixture中参数传递的几种方式

1)fixture中的函数返回

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"}]

2)与@pytest.mark.parametrize的结合

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]作为函数中的参数传递

3)fixture中的方法嵌套传递

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'}])

4)测试方法中产生数据后,直接调用teardown

@python.fixture(scope="class")
def teardown_func():
? ? def _teardown_func(param1, param2):
? ? ? ? func()
? ? return _teardown_func

到此这篇关于分享Pytest fixture参数传递的几种方式的文章就介绍到这了,更多相关Pytest参数传递内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

查看更多关于分享Pytest fixture参数传递的几种方式的详细内容...

  阅读:36次