【问题标题】:Pytest: Nested use of request fixturePytest:请求夹具的嵌套使用
【发布时间】:2021-02-01 12:58:02
【问题描述】:

我想获得一些关于如何使用多层参数化 pytest 固定装置运行 pytest 的帮助。

我有一个基于请求的全局夹具,用于选择我要测试的系统的基本实现:

@fixture()
def a_provider():
    yield 'a'


@fixture()
def b_provider():
    yield 'b'


@fixture(params=["a_provider", "b_provider"])
def letter_provider(request):
    yield request.getfixturevalue(request.param)

我现在想针对后端的不同测试用例运行一些额外参数化的测试。


@fixture()
def one(letter_provider):
    yield letter_provider * 1


@fixture()
def two(letter_provider):
    yield letter_provider * 2


@fixture(params=["one", "two"])
def letter_cases(request):
    yield request.getfixturevalue(request.param)

使用这两层固定装置,我希望能够运行由基本实现参数化的两个测试。

def test_foo(letter_provider):
    """
    Should run once for "a" and once for "b"
    """
    assert letter_provider in {"a", "b"}

以及使用所有其他案例的测试

def test_bar(letter_cases):
    """
    test should be executed 4 times for : a, aa, b, bb
    """
    assert letter_cases in {
        "a", "aa",
        "b", "bb",
    }

目前,我的测试设置失败:

test setup failed
'letter_provider'

The above exception was the direct cause of the following exception:
letter_provider

During handling of the above exception, another exception occurred:
The requested fixture has no parameter defined for test:
    tests/test_example.py::test_bar[one]

Requested fixture 'letter_provider' defined in:
tests/test_example.py:15

如何设置我的测试套件来运行这些级别的参数化?

【问题讨论】:

  • 我现在无法测试,但 IIRC 可以通过在夹具签名中提供依赖夹具来解决此问题,例如def letter_cases(request, one, two): ....
  • @hoefling 这行得通。如果您想发布答案,我很乐意接受。

标签: python python-3.x pytest


【解决方案1】:

在调用getfixturevalue() 时,通过将两个fixture 添加为letter_cases 依赖项,确保fixture 缓存中填充有onetwofixture 值:

@fixture(params=["one", "two"])
def letter_cases(request, one, two):
    yield request.getfixturevalue(request.param)

【讨论】:

    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多