pytest 夹具和测试都依赖于另一个夹具

Mad*_*ist 5 python testing pytest

我有一对夹具用于测试带有 xy 输入的函数。一个生成 x 值,另一个生成 y 值。测试取决于两者。y 值也取决于 x 值。以下是设置摘要:

import pytest

@pytest.fixture(params=['a', 'b', 'c'])
def x_data(request):
    return request.param

@pytest.fixture(params=['1', '2', '3'])
def y_data(request, x_data):
    return request.param + x_data

def test_mathfunc(x_data, y_data):
    print(f'\nTesting {x_data} vs {y_data}', end='')
Run Code Online (Sandbox Code Playgroud)

当我用 运行它时pytest -s,正好运行了 9 个测试,并且打印输出test_func显示x_data传递给测试的总是与用于生成的相同y_data(当然,这正是我想要的):

Testing a vs 1a.
Testing a vs 2a.
Testing a vs 3a.
Testing b vs 1b.
Testing b vs 2b.
Testing b vs 3b.
Testing c vs 1c.
Testing c vs 2c.
Testing c vs 3c.
Run Code Online (Sandbox Code Playgroud)

我知道 pytest 缓存夹具结果并尝试以尽可能少的次数评估夹具的事实。对于这个简单的案例,这意味着该行为相当可靠。

问题是,我真的可以依赖这种行为吗?是否存在我遗漏的情况,例如,测试最终可能会被调用a, 3c

And*_*kin 0

不,您的测试用例不可能用 来调用a, 3c

您的所有灯具都有"function"范围(默认)。这意味着对于每个测试函数,所有这些都将被调用一次,具体取决于它们。如果固定装置是两个或多个其他依赖项(固定装置或测试函数)的依赖项,则无论如何它都会调用一次并且该值将被重用。

这是文档中的一段pytest很好地回答了您的问题: https: //docs.pytest.org/en/6.2.x/fixture.html#fixtures-can-be-requested-more-than-once-per-test-返回值被缓存