gpt4 book ai didi

python - 使用 fixture 返回值作为 mark.parametrize() 中的值

转载 作者:行者123 更新时间:2023-11-28 18:30:24 24 4
gpt4 key购买 nike

我的问题是 - 是否可以使用 fixture 的返回值作为参数化中的值?问题是 - 我想动态获取参数化的可能值(例如,虚拟服务器上的可用系统)。当其中一个装置创建虚拟服务器时,我可以访问这些。测试看起来像这样(伪代码):

[conftest.py]

@pytest_fixture(scope='session')
def test_server(request):
test_server = Server([default_params])
test_server.add()
def fin():
test_server.delete()
request_addfinalizer(fin)
return test_server()

[tests.py]

def test_basic_server(test_server):
systems = test.server.get_available_systems()
for system in systems:
test_server.install(system)
test_server.run_checks()
test_server.uninstall(system)

def test_other(test_server):
[other tests]

etc

这样,每个 session 添加一个服务器,然后所有测试都在它上面运行, session 结束后,服务器被删除。但是有没有办法在@pytest.mark.parametrize 中获取可用系统而不显式列出它们(静态地作为 parametrize 中的列表),使用 session 开始时添加的服务器方法?这样每个系统都会在单独的测试中运行。

我尝试在另一个 fixture 中使用 test_server 然后返回列表(与 test_server fixture 返回 test_server 的方式相同,但我不能将其用作参数化中的值 - 因为在任何测试中调用 test_server fixture 之前都会评估装饰器, 获取列表取决于 test_server fixture。

这将是理想的:

[tests.py]

@pytest.mark.parametrize('system',[systems_list <- dynamically generated
when the server is created])

def test_basic_server(test_server,system):
test_server.install(system)
test_server.run_checks()
test_server.uninstall(system)

这只是一个非常基本的示例,在我的测试中,我需要根据多个场景和值进行参数化,当我静态执行时,我最终会得到巨大的数组。

但原则保持不变 - 基本上:我可以在使用此 fixture 运行第一个测试之前调用 fixture ,或者 pytest.mark.parametrize() 如何访问 fixture 值?

最佳答案

我觉得你可能无法直接达到你想要的。因为@pytest.mark.parametrize是在采集的时候调用的,fixture会在采集完成后调用。

但我有另一种方法可以实现类似的结果,主要是通过扩展 pytest 插件 pytest_generate_tests 并使用方法 metafunc.parametrizehttps://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

不好的是,每次使用 fixture system 时都会调用 get_available_systems,这不是您想要的。但我认为添加一些额外的逻辑使查询逻辑只执行一次并不难。

例如:

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)

关于python - 使用 fixture 返回值作为 mark.parametrize() 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37972610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com