我想你可能无法直接实现你想要的。因为@pytest.mark.parametrize
收集时调用,收集完成后调用。
但我有另一种方法可以实现类似的结果,主要是通过扩展 pytest 插件pytest_generate_tests
及使用方法metafunc.parametrize
.
https://pytest.org/latest/parametrize.html#basic-pytest-generate-tests-example https://pytest.org/latest/parametrize.html#basic-pytest-generate-tests-example
这是我的解决方案。
在conftest.py中
class System(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return "<System '{}'>".format(self.name)
def get_available_systems():
return [System('A'), System('B'), System('C')]
def pytest_generate_tests(metafunc):
if 'system' in metafunc.fixturenames:
available_systems = get_available_systems()
metafunc.parametrize('system', available_systems)
在测试文件中:
def test_basic_server(system):
print(system)
这是输出,您将可以访问测试中的每个系统。
collected 3 items
test_01.py::test_basic_server[system0] <System 'A'>
PASSED
test_01.py::test_basic_server[system1] <System 'B'>
PASSED
test_01.py::test_basic_server[system2] <System 'C'>
PASSED
糟糕的是,get_available_systems
每次使用固定装置时都会被调用system
,这不是你想要的。但我认为添加一些额外的逻辑来使查询逻辑只执行一次并不难。
例如:
def pytest_generate_tests(metafunc):
if 'system' in metafunc.fixturenames:
if hasattr(metafunc.config, 'available_systems'):
available_systems = metafunc.config.available_systems
else:
available_systems = get_available_systems()
metafunc.config.available_systems = available_systems
metafunc.parametrize('system', available_systems)