【问题标题】:pytest: fixture as argument of a parametizable fixturepytest:夹具作为参数化夹具的参数
【发布时间】:2021-12-28 16:32:07
【问题描述】:

我有一个可参数化的夹具,效果很好。以下函数是具有相同行为的虚拟函数。

@pytest.fixture(scope="function")
def parametrizable_fixture(parameters):
    return parameters

这适用于大多数测试,如下所示:

@pytest.mark.parametrize("parameters", [["param 1", "param 2"]])
def test_dummy(parametrizable_fixture):
    assert parametrizable_fixture == ["param 1", "param 2"]

但是,如果我想将另一个夹具(定义如下)作为第一个夹具的参数,则测试失败:

@pytest.fixture(scope="function")
def param2fixture():
    return "param 2"


@pytest.mark.parametrize("parameters", [["param 1", pytest.lazy_fixture("param2fixture")]])
def test_dummy_2(parametrizable_fixture):
    assert parametrizable_fixture == ["param 1", "param 2"]

惰性夹具没有被它应该具有的值替换,即我收到以下错误消息:

E      assert ['param 1', <LazyFixture "param2fixture">] == ["param 1", "param 2"]

编辑: 这些示例使用夹具作为长度为 2 的列表中的参数。这只是为了简化问题。此类惰性夹具作为参数的数量或位置没有限制。

【问题讨论】:

    标签: python-3.x pytest fixtures


    【解决方案1】:

    您正试图用惰性夹具替换参数的一部分 (parameters),但这仅适用于整个参数。

    修复示例的最简单方法是使用 2 个参数:

    @pytest.mark.parametrize("arg1,arg2",
                             [["param 1", lazy_fixture("param2fixture")]])
    def test_dummy_2(arg1, arg2):
        assert (arg1, arg2) == ("param 1", "param 2")
    

    正如 cmets 中所述,这并不能解决原始问题的情况,因为元组中的元素数量不固定。在 pytest-lazy-fixture 中有一个 related issuea pull request 旨在解决这个问题——如果你喜欢冒险,你可以将 PR 应用到一个 fork 上并尝试一下。正如 PR 中提到的,这确实会降低插件速度,但如果这不是问题,它可能是一个解决方案。

    【讨论】:

    • 这在这个玩具示例中可以正常工作。但是,我要测试的内容可以采用具有多个值的列表,但不能保证它可以采用的惰性固定装置的位置或数量。
    • 好的,在这种情况下,这对您没有帮助 - 我将删除答案。
    • 我认为,你应该把它留给其他用户碰巧遇到类似的问题。
    • 我在 pytest-lazy-fixture 中添加了关于相关问题和 PR 的评论。
    • 在您提出的解决方案之间,复制粘贴夹具功能或在本地修补插件,您的解决方案似乎对我来说是最好的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多