gpt4 book ai didi

python - 当参数化测试使用参数化 fixture 时, fixture 范围不起作用

转载 作者:太空狗 更新时间:2023-10-29 21:59:41 27 4
gpt4 key购买 nike

我想在相同参数化测试的不同实例化之间共享 fixture,其中 fixture 本身也被参数化:

#!/usr/bin/py.test -sv

import pytest

numbers_for_fixture = [0]

def pytest_generate_tests(metafunc):
if "config_field" in metafunc.fixturenames:
metafunc.parametrize("config_field", [1], scope='session')

@pytest.fixture(scope = 'session')
def fixture_1(config_field):
numbers_for_fixture[0] += 1
return '\tfixture_1(%s)' % numbers_for_fixture[0]

@pytest.fixture(scope = 'session')
def fixture_2():
numbers_for_fixture[0] += 1
return '\tfixture_2(%s)' % numbers_for_fixture[0]

def test_a(fixture_1):
print('\ttest_a:', fixture_1)

def test_b(fixture_1):
print('\ttest_b:', fixture_1)

@pytest.mark.parametrize('i', range(3))
def test_c(fixture_1, i):
print('\ttest_c[%s]:' % i, fixture_1)

@pytest.mark.parametrize('i', range(3))
def test_d(fixture_2, i):
print('\ttest_d[%s]:' % i, fixture_2)

我得到这个输出:

platform linux -- Python 3.4.1 -- py-1.4.26 -- pytest-2.6.4 -- /usr/bin/python
collecting ... collected 8 items

test.py::test_a[1] test_a: fixture_1(1)
PASSED
test.py::test_b[1] test_b: fixture_1(1)
PASSED
test.py::test_c[1-0] test_c[0]: fixture_1(1)
PASSED
test.py::test_c[1-1] test_c[1]: fixture_1(2)
PASSED
test.py::test_c[1-2] test_c[2]: fixture_1(3)
PASSED
test.py::test_d[0] test_d[0]: fixture_2(4)
PASSED
test.py::test_d[1] test_d[1]: fixture_2(4)
PASSED
test.py::test_d[2] test_d[2]: fixture_2(4)
PASSED

test_atest_btest_c[0] 都共享 fixture_1(1)。所有 test_d 共享 fixture_2(4)。问题在于 test_c 使用不同版本的 fixture_1

当范围设置为“模块”和“类”时也会发生这种情况,并且只有在测试和 fixture 都被参数化时才会发生。

从 pytest 打印测试参数的方式来看,它似乎没有区分用于每个项目的不同类型的参数,因此它为每组参数而不是为参数的每个唯一子集创建一个 fixture 列出 fixture 使用的列表。

这是 pytest 中的错误,还是我忽略了设置某些配置或其他内容?有解决方法吗?

最佳答案

简而言之,在这种情况下,存在一个有效忽略作用域的错误。使用 --setup-show 开关运行 pytest 以更好地查看固定装置何时设置和拆除。

解决方法

注释掉 pytest_generate_tests 函数并添加以下内容:

@pytest.fixture('session', [1])
def config_field(request):
return request.param

现在您应该看到正确的设置和拆除嵌套。

动态参数的解决方法

我需要从 cli 参数设置我的参数并且必须使用 pytest_generate_tests

将 indirect 设置为 True,将 paramters 设置为 cli 参数:

def pytest_generate_tests(metafunc):
if "config_field" in metafunc.fixturenames:
metafunc.parametrize(
"config_field",
metafunc.config.getoption('some_option'),
True,
'session'
)

添加占位符 fixture :

@pytest.fixture('session')
def config_field(request):
return request.param

关于python - 当参数化测试使用参数化 fixture 时, fixture 范围不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27299600/

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