У меня есть набор предварительных проверок, которые мне нужно выполнить, однако одна из проверок требует инициализации поставщика.
Казалось бы, можно обойти это путем добавления 'foo_provider' к аргументам фикстуры, чтобы убедиться, что он запускается после запуска foo_provider. Тем не менее, я не хочу перечислять 20 приборов в аргах приспособления для предварительного тестирования.
Я пытался использовать pytest.mark.trylast
, я пробовал маркеры заказа. Ни один из них не работает должным образом (или вообще). Я попытался добавить различные вещи к pytest_generate_tests
, и это приводит к увеличению количества тестов.
Наконец-то мне это удалось, добавив kwargs в определение прибора, а затем изменив metafunc._arg2fixturedefs
с помощью функции из pytest_generate_tests
, которая выглядит очень плохо.
Я попытался и потерпел неудачу с этим, так как он также проверил проверку слишком рано:
@pytest.fixture(params=[pytest.lazy_fixture('foo_provider')], autouse=True)
def pretest(test_skipper, logger, request):
logger().info('running pretest checks')
test_skipper()
Попробовал и не смог переупорядочить приборы следующим образом (вызывается из pytest_generate_tests
):
def execute_pretest_last(metafunc):
fixturedef = metafunc._arg2fixturedefs['pretest']
fixture = metafunc._arg2fixturedefs['pretest'][0]
names_order = metafunc.fixturenames
names_order.insert(len(names_order), names_order.pop(names_order.index(fixture.argname)))
funcarg_order = metafunc.funcargnames
funcarg_order.insert(len(funcarg_order),
funcarg_order.pop(funcarg_order.index(fixture.argname)))
Приведенный ниже код работает, как и ожидалось, но есть ли лучший способ?
def pytest_generate_tests(metafunc):
for fixture in metafunc.fixturenames:
if fixture in PROVIDER_MAP:
parametrize_api(metafunc, fixture), indirect=True)
add_fixture_to_pretest_args(metafunc, fixture)
def add_fixture_to_pretest_args(metafunc, fixture):
pretest_fixtures = list(metafunc._arg2fixturedefs['pretest'][0].argnames)
pretest_fixtures.append(fixture)
metafunc._arg2fixturedefs['pretest'][0].argnames = tuple(pretest_fixtures)
@pytest.fixture(autouse=True)
def pretest(test_skipper, logger, **kwargs):
logger().info('running pretest checks')
test_skipper()