Я использую 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 для этого, но не нашел ответа. Я специально посмотрел на: