приспособление pytest с параметризацией от другого приспособления - PullRequest
0 голосов
/ 09 января 2019

Я использую pytest и хотел бы вызвать функцию тестирования для ряда объектов, возвращаемых сервером, и для ряда серверов.

Серверы определены в файле YAML, и эти определения предоставляются в качестве параметризации для прибора «server_connection», который возвращает объект Connection для одного сервера. Из-за параметризации она вызывает функцию тестирования один раз для каждого сервера.

Я могу сделать это с помощью цикла в тестовой функции: есть второй прибор "server_objects", который принимает прибор "server_connection" в качестве входных данных и возвращает список объектов сервера. Затем функция pytest test берет этот второй прибор и выполняет реальный тест в цикле через объекты сервера.

Вот этот код:

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 () может получить доступ к значениям других приборов.

Есть идеи?

Обновление: позвольте мне добавить, что я также искал SO для этого, но не нашел ответа. Я специально посмотрел на:

...