使用pytest,我可以在测试功能之外获得夹具值吗?

时间:2019-01-22 06:55:44

标签: python pytest fixtures

我正在使用参数化测试来测试2个不同的数据集。例如这样。 some_data()函数返回测试数据。

test_data = [
    (some_data1_v1(), some_data2_v2()),
    (some_data1_v2(), some_data2_v2())
]

@pytest.mark.parametrize('a,b', test_data)
def test_fn(a,b):
    pass

但是对于某些仅检查常规行为的测试,我不需要测试2个数据集,因为这两个数据集都有适当的常规数据。 我想像这样将some_data1_v1()函数转换为Fixture并在测试中使用

def test_fn2(some_data1_v1):
    pass

如果我愿意的话,请在some_data1_v1()列表构建期间调用test_data引发异常Fixtures are not meant to be called directly...

所以这个

def test_fn2(some_data1_v1):
    pass

我喜欢

@pytest.mark.parametrize('some_data1_v1', [some_data1_v1()])
def test_fn2(some_data1_v1):
    pass

这使我拥有一个测试数据源-“假装”(返回数据的常用功能),并通过test_data列表中的测试数据(第一个示例或最后一个示例)。但是我认为我将数据存储在常规功能中的方法是打破“夹具抽象”。

是否有更好的方法来完成我的工作?

1 个答案:

答案 0 :(得分:0)

您可以使用parametrized fixturerequest.paramparams序列中的特定条目

例如:

@pytest.fixture(params=(1, 2, 3))
def fix1(request):
    return request.param


@pytest.fixture(params=(4, 5, 6))
def fix2(request):
    return request.param


def test1(fix1, fix2):
    print(fix1, fix2)


def test2(fix1):
    print(fix1)

执行:

$ pytest t.py

...

collected 12 items                                                             

t.py::test1[1-4] 1 4
PASSED
t.py::test1[1-5] 1 5
PASSED
t.py::test1[1-6] 1 6
PASSED
t.py::test1[2-4] 2 4
PASSED
t.py::test1[2-5] 2 5
PASSED
t.py::test1[2-6] 2 6
PASSED
t.py::test1[3-4] 3 4
PASSED
t.py::test1[3-5] 3 5
PASSED
t.py::test1[3-6] 3 6
PASSED
t.py::test2[1] 1
PASSED
t.py::test2[2] 2
PASSED
t.py::test2[3] 3
PASSED