gpt4 book ai didi

python - 如何创建一个依赖于另一个参数化 fixture 值的参数化 fixture ?

转载 作者:行者123 更新时间:2023-12-03 15:51:21 28 4
gpt4 key购买 nike

例子:

from pytest import fixture, skip

@fixture(params=['a', 'b'])
def f1(request):
yield request.param


params = [('a', 1), ('a', 2), ('b', 10), ('b', 20)]
@fixture(params=params, ids=[str(x) for x in params])
def f2(f1, request):
if request.param[0] == f1:
yield request.param[1]
else:
skip('invalid')

def test_foo(f1, f2):
return
那是一个“基础” fixture f1 .然后“堆叠” fixture f2应该产生值 (1, 2)f1='a'和值 (10, 20)f1='b'给出:
a.py::test_foo[a-('a', 1)] PASSED
a.py::test_foo[a-('a', 2)] PASSED
a.py::test_foo[a-('b', 10)] SKIPPED
a.py::test_foo[a-('b', 20)] SKIPPED
a.py::test_foo[b-('a', 1)] SKIPPED
a.py::test_foo[b-('a', 2)] SKIPPED
a.py::test_foo[b-('b', 10)] PASSED
a.py::test_foo[b-('b', 20)] PASSED
这接近我想要实现的目标,除了我想改进这个
  • SKIPPED 变体根本不显示为测试用例
  • 参数化的测试用例 id 显示,没有重复 f1 fixture 。理想情况下 <f1-value><separator><f2-value>喜欢 a-2 , b-10
  • 理想情况下,以更明智的方式定义,无需重复

  • 备选方案 1:参数化解决方法
    有一种使用参数化的解决方法:
    @pytest.mark.parametrize(params=('f1,f2', (('a', 1), ('b', 10))))
    def test_foo():
    return
    然而,这并不是真正的解决方案,因为它仅适用于相对简单和隔离的设置。它发生故障的地方是底座固定装置 f1在很多测试用例中使用,还有额外的 fixture f1_n哪个堆叠在 f1 的顶部只喜欢:
    @fixture
    def f1_1(f1):
    return
    此时,使用参数化解决方法会导致重复并损害其他堆叠装置的可重用性。
    备选方案 2:pytest_generate_tests
    https://docs.pytest.org/en/latest/parametrize.html
    f2_vals = {'a': (1,2), 'b': (10,20)}

    def pytest_generate_tests(metafunc):
    if "f2" in metafunc.fixturenames:
    assert "f1" in metafunc.fixturenames
    metafunc.parametrize("f2", f2_vals[get_f1_val()])
    但我不知道如何实现 get_f1_val并且对这种方法几乎没有信心,因为 pytest 似乎分阶段运行,它首先收集测试用例,然后执行它们。
    备选方案 3:测试用例忽略/取消选择
    目前在 https://github.com/pytest-dev/pytest/issues/3730 提出功能请求但仅解决从测试 session 结果中删除无效测试用例组合的部分。

    最佳答案

    为您的替代方案 2 进一步努力:

    f2_vals = {'a': (1,2), 'b': (10,20)}

    params = [(key, value) for key in f2_vals for value in f2_vals[key]]


    @pytest.mark.parametrize("f1, f2", params)
    def test_foo(f1, f2):
    return

    关于python - 如何创建一个依赖于另一个参数化 fixture 值的参数化 fixture ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63063722/

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