pytest:我可以根据fixture(运行时配置)生成测试参数吗?

时间:2016-11-17 03:48:37

标签: pytest

希望以前没有问过这个问题,我知道固定装置和参数似乎是pytest最难解决的问题..

我试图弄清楚是否可以使用灯具作为生成测试参数的基础......(使用灯具生成所需的测试参数,例如运行时的边界条件)

像这样......

@pytest.fixture
def unit(request):
    """Base dependence"""
    return BuildUnit(request.config.options..)

@pytest.fixture
def something_param_gen(request, unit, option):
    """Resource of interest; configured using an option"""
    return unit.query(option)


@pytest.mark.parameterize('param1,param2', 
    [something_param_gen('optionA'), something_param_gen('optionB')])
def test_something(something, param1, param2):
    """Generate the parameters *specific* for the fixture"""
    assert something.foo() > param1
    assert something.bar() < param2

所以在test_something中我希望在查询something给定静态选项的功能后提供参数1和2。

我想到了pytest_generate_tests(metafunc)钩子,除了我无法看到如何从这个环境中访问unit夹具。

我可以静态地定义所有参数,但在运行时这样做会非常棒。我可能会收到不同数量的参数来测试或轻松操作它们。

1 个答案:

答案 0 :(得分:0)

您不能完全按照自己的意愿行事。但是您可以通过参数化静态值并提供对使用它们的装置的访问来做一些非常相似的事情。

类似于:

@pytest.fixture
def unit(request):
    return BuildUnit(request.config.options..)

@pytest.fixture
def something_param_gen(unit):
    return unit.query  # note no brackets, because we want to return the query function, not actually call anything (yet)

@pytest.mark.parameterize('param1,param2', ["optionA", "optionB"])
def test_something(something, param1, param2, something_param_gen):
    """Generate the parameters *specific* for the fixture"""

    # something_param_gen is now the return value of the fixture
    # i.e. is `unit.query`, so now we change the comparison

    assert something.foo() > something_param_gen(param1)
    assert something.bar() < something_param_gen(param2)