gpt4 book ai didi

python - 如何在 pytest 中将几个参数化的 fixture 连接成一个新的 fixture ?

转载 作者:太空狗 更新时间:2023-10-29 20:30:37 27 4
gpt4 key购买 nike

如果我有两个参数化的 fixture ,我如何创建一个测试函数,首先用一个 fixture 的实例调用,然后用另一个 fixture 的实例调用?

我想创建一个以某种方式连接两个现有装置的新装置是有意义的。这适用于“普通”灯具,但我似乎无法使用参数化灯具。

这是我尝试过的一个简化示例:

import pytest

@pytest.fixture(params=[1, 2, 3])
def lower(request):
return "i" * request.param

@pytest.fixture(params=[1, 2])
def upper(request):
return "I" * request.param

@pytest.fixture(params=['lower', 'upper'])
def all(request):
return request.getfuncargvalue(request.param)

def test_all(all):
assert 0, all

当我运行它时,我得到了这个错误:

request = <SubRequest 'lower' for <Function 'test_all[lower]'>>

@pytest.fixture(params=[1, 2, 3])
def lower(request):
> return "i" * request.param
E AttributeError: 'SubRequest' object has no attribute 'param'

... upper() 出现同样的错误。

我做错了什么?

我该如何解决这个问题?


更新:

有一个 PyTest 插件可以用来解决这个问题:https://github.com/TvoroG/pytest-lazy-fixture .

pip-安装此插件后,对上述代码唯一需要的更改如下:

@pytest.fixture(params=[pytest.lazy_fixture('lower'),
pytest.lazy_fixture('upper')])
def all(request):
return request.param

但是请注意,在某些复杂的情况下它不起作用:

https://github.com/pytest-dev/pytest/issues/3244#issuecomment-369836702

相关 PyTest 问题:

最佳答案

现在 pytest-cases 中有一个解决方案,名为 fixture_union。以下是如何创建您在示例中请求的 fixture 联合:

from pytest_cases import fixture_union, pytest_fixture_plus

@pytest_fixture_plus(params=[1, 2, 3])
def lower(request):
return "i" * request.param

@pytest_fixture_plus(params=[1, 2])
def upper(request):
return "I" * request.param

fixture_union('all', ['lower', 'upper'])

def test_all(all):
print(all)

它按预期工作:

<...>::test_all[lower-1] 
<...>::test_all[lower-2]
<...>::test_all[lower-3]
<...>::test_all[upper-1]
<...>::test_all[upper-2]

请注意,我在上面的示例中使用了 pytest_fixture_plus,因为如果您使用 pytest.fixture,您将不得不自己处理实际未使用 fixture 的情况。这是按如下方式完成的,例如对于 upper fixture :

import pytest
from pytest_cases import NOT_USED

@pytest.fixture(params=[1, 2])
def upper(request):
# this fixture does not use pytest_fixture_plus
# so we have to explicitly discard the 'NOT_USED' cases
if request.param is not NOT_USED:
return "I" * request.param

参见 documentation了解详情。 (顺便说一句,我是作者;))

关于python - 如何在 pytest 中将几个参数化的 fixture 连接成一个新的 fixture ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24340681/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com