首页 > 解决方案 > 具有来自另一个夹具的参数化的 pytest 夹具

问题描述

我正在使用 pytest,并希望为服务器返回的多个对象和多个服务器调用测试函数。

服务器在 YAML 文件中定义,这些定义作为参数化提供给夹具“server_connection”,该夹具“server_connection”返回单个服务器的连接对象。由于参数化,它会导致为每个服务器调用一次测试函数。

我可以通过测试函数中的循环来做到这一点:第二个夹具“server_objects”将“server_connection”夹具作为输入并返回服务器对象列表。然后 pytest 测试函数采用第二个夹具并通过服务器对象循环执行实际测试。

这是该代码:

import pytest

SD_LIST = ... # read list of server definitions from YAML file

@pytest.fixture(
    params=SD_LIST,
    scope='module'
)
def server_connection(request):
    server_definition = request.param
    return Connection(server_definition.url, ...)

@pytest.fixture(
    scope='module'
)
def server_objects(request, server_connection):
    return server_connection.get_objects()

def test_object_foo(server_objects):
    for server_object in server_objects:
        # Perform test for a single server object:
        assert server_object == 'foo'

但是,缺点当然是测试失败会导致整个测试功能结束。

相反,我想要发生的是为每个单独的服务器对象调用测试函数,因此一个对象的测试失败不会阻止对其他对象的测试。理想情况下,我想要一个提供单个服务器对象的夹具,我可以将其传递给测试函数:

...

@pytest.fixture(
    scope='module'
)
def server_object(request, server_connection):
    server_objects = server_connection.get_objects()
    # TBD: Some magic to parametrize this fixture with server_objects

def test_object_foo(server_object):
    # Perform test for a single server object:
    assert server_object == 'foo'

我已经阅读了所有关于固定装置的 pytest 文档,但没有找到一种方法来做到这一点。

我知道 pytest 钩子并且以前使用过例如 pytest_generate_tests() ,但我没有找到 pytest_generate_tests() 如何访问其他夹具的值的方法。

有任何想法吗?

更新:让我补充一点,我也为此进行了搜索,但没有找到答案。我专门看了一下:

标签: pytestfixtures

解决方案


推荐阅读