使用 pytest.mark.usefixtures 进行参数化

问题描述 投票:0回答:1

假设我有两个测试基本上做同样的事情,但是,我想为其中一个使用固定装置。

我以为这应该有效,但事实并非如此

@fixture
bar_fixture():
    do_something_but_Return_no_value()

@mark.parametrize(
    "foo",
    [
        param(
            True,
            marks=[mark.test_1],
        ),
        param(
            False,
            marks=[mark.test_2, mark.usefixtures("bar_fixture")],
        ),
    ],
)
def test_foo(foo):
    func(foo)

有人知道该怎么做吗?当然,这可以通过两个单独的测试来完成,但我想知道是否可以做这样的事情,以免两次编写基本相同的代码。

python testing automated-tests pytest
1个回答
0
投票

mark.usefixtures
似乎只能直接在测试中工作,而不是在其他装置中工作,我认为这是这里发生的事情的一部分。

对于这种情况,您可以退回到 request.getfixturevalue

动态运行命名的固定功能。 建议尽可能通过函数参数声明装置。但是,如果您只能在测试设置时决定是否使用另一个夹具,则可以使用此函数在夹具或测试函数体内检索它。

@pytest.fixture
def bar_fixture():
    do_something_but_Return_no_value()

@pytest.mark.parametrize(
    ["foo", "fixtures"],
    [
        pytest.param(
            True, [], marks=[pytest.mark.test_1],
        ),
        pytest.param(
            False, ["bar_fixture"], marks=[pytest.mark.test_2]
        ),
    ],
)
def test_foo(request, foo, fixtures):
    for fixture in fixtures:
        request.getfixturevalue(fixture)

    func(foo)

这显然不如其他选项那么优雅,但它很容易遵循。

© www.soinside.com 2019 - 2024. All rights reserved.