当参数化测试使用参数化夹具时,夹具范围不起作用

Ida*_*rye 7 python pytest

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

#!/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)
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

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
Run Code Online (Sandbox Code Playgroud)

test_a,test_btest_c[0]分享fixture_1(1).所有test_d的分享fixture_2(4).问题是test_cs使用不同版本的fixture_1.

当示波器设置为"模块"和"类"时也会发生这种情况,并且只有在测试和夹具都参数化时才会发生.

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

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

Ede*_*eca 0

好吧,您可以从您的功能中返回收益,这可能会返回相同的值:

@pytest.fixture(scope = 'session')
def fixture_1(config_field):
   .. yield <fixture-properties>
Run Code Online (Sandbox Code Playgroud)