тест pytest нуждается в параметризации на этапе сбора и во время настройки

У меня есть несколько тестов, которые я хотел бы параметризовать, используя некоторые аргументы, которые требуют параметризации на этапе сбора, а некоторые — во время установки. Я не могу использовать metafunc.parametrize в хуке pytest_generate_test, так как мне нужно, чтобы некоторые приборы имели косвенное значение = True для передачи имени аргумента в качестве request.param, но другие аргументы должны иметь косвенное значение = False.

Любые идеи, как это сделать?

Вот пример того, как выглядят мои тесты и что я хочу сделать:

def pytest_generate_tests(metafunc):
    if metafunc.function.__name__ == 'test_example':
        argnames = []
        argvalues = []
        parameters = getattr(metafunc.function, 'paramlist', ())
        for p in parameters:
            if type(p) == list:
                argnames = tuple(['myfixture'] + p)
            else:
                argvalues.append = tuple(['std'] + p['argvalues'])
            argvalues.append = tuple(['pro'] + p['argvalues'])
        # I want to do the following, but it won't work since some of the
        # args need indirect set to true and some need indirect set to false.
        metafunc.parametrize(argnames, argvalues, indirect=True)
    elif 'myfixture' in metafunc.fixturenames:
        # we have existing tests which use the fixture, but only with
standard
        metafunc.parametrize("myfixture", "std")
    else:
        # we have existing tests which use older style parametrization,
non-fixture
        for p in getattr(metafunc.function, 'paramlist', ()):
            metafunc.addcall(funcargs=p)


def params(decolist):
    def wrapper(function):
        function.paramlist = decolist
        return function
    return wrapper

@pytest.fixture
def myfixture(request):
    If request.param == 'std':
        myfix = SomeObject()
    elif request.param == 'pro':
        myfix = SomeOtherObject()
    def fin():
        myfix.close()
    request.addfinalizer(fin)
    return myfix

@params([
    ['color', 'type'],
    { 'argvalues': [ 'blue', 'cat'] },
    { 'argvalues': ['pink', 'dog'] }
])
def test_example(myfixture, color, type):
    # this is the new test we want to add

def test_something(myfixture):
    # existing test which only uses std fixture

@params([
    {'arg1': 1, 'arg2': 2},
    {'arg1': 3, 'arg2': 5}
])
def test_old_style(arg1, arg2):
    # existing tests which don't use fixtures

Спасибо, что прочитали это! Я знаю, что это довольно долго.


person elin    schedule 02.04.2013    source источник


Ответы (1)


для каждого проекта вся параметризация происходит во время сбора

person Ronny    schedule 31.07.2015
comment
Хорошее понимание, у вас есть какие-нибудь ссылки, которые подкрепляют этот момент более формально? - person jxramos; 20.02.2019