我想在相同参数化测试的不同实例之间共享夹具,其中夹具本身也是参数化的:
#!/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_a
,test_b
和test_c[0]
共享fixture_1(1)
。所有test_d
分享fixture_2(4)
。问题是test_c
使用不同版本的fixture_1
。
当范围设置为" module"和" class",只有当测试和夹具都被参数化时才会发生。
从pytest打印测试参数的方式来看,它似乎没有区分每个项目使用的不同类型的参数,因此它为每组参数创建一个夹具,而不是为每个唯一的子集创建一个夹具。夹具使用的参数列表。
这是pytest中的错误,还是我忽略了设置某些配置?有解决方法吗?
答案 0 :(得分:0)
好吧,您可以从特征返回收益,这可能会返回相同的值:
@pytest.fixture(scope = 'session')
def fixture_1(config_field):
.. yield <fixture-properties>
答案 1 :(得分:0)
在坚果壳中,存在一个错误,在这种情况下有效地忽略了作用域。使用--setup-show开关运行pytest,以更好地了解固定装置的安装和拆卸时间。
注释pytest_generate_tests函数并添加以下内容:
@pytest.fixture('session', [1])
def config_field(request):
return request.param
现在您应该看到正确的设置,并拆下了嵌套。
我需要从环境中设置参数,并且必须使用pytest_generate_tests
将间接设置为True,并将cli参数设置为cli >
def pytest_generate_tests(metafunc):
if "config_field" in metafunc.fixturenames:
metafunc.parametrize(
"config_field",
metafunc.config.getoption('some_option'),
True,
'session'
)
添加占位符固定装置:
@pytest.fixture('session')
def config_field(request):
return request.param