Есть ли лучший способ убедиться, что прибор работает за другим, не перечисляя эти приборы в аргументах? - PullRequest
1 голос
/ 11 апреля 2019

У меня есть набор предварительных проверок, которые мне нужно выполнить, однако одна из проверок требует инициализации поставщика. Казалось бы, можно обойти это путем добавления '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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...