Передача аргументов или параметров в функцию фиксации

Я изучаю фикстуры в py.test, и у меня есть вопрос, аналогичный тому, который был задан более года назад: Могут ли параметры, переданные в фикстуру pytest, передаваться как переменная? Мне интересно, возможно ли теперь в более новых версиях py.test каким-то образом выберите подмножество параметров, запрашивающих функцию фиксации.

Допустим, у меня есть простая функция и тест:

def func(a, b):
    return (a - b)**3 + 10

@pytest.fixture(scope="module", params=[(7,11), (7,0), (3,0)])
def fix_func(request): 
    output = func(*request.param)
    return output

def test_1(fix_func):
    assert fix_func <= 500

А теперь я бы хотел добавить второй тест только для param = (7,11):

def test_2(fix_func):
    assert fix_func > 0 

Если выбор подмножества параметров по-прежнему невозможен, другим способом решения этой проблемы может быть перемещение параметров из фикстуры в тесты, например:

@pytest.fixture(scope="module")
def fix_func(request, param): 
    output = func(*param)
    return output

@pytest.mark.parametrize("arg", [(7,11), (7,0), (3,0)])
def test_1(fix_func(arg)):
    assert fix_func <= 500

@pytest.mark.parametrize("arg", [(7,11)])
def test_2(fix_func(arg)):
    assert fix_func > 0 

Но этот пример тоже не работает. Есть ли другой короткий/"элегантный" способ использования разных наборов фикстур для разных тестов (написание только одной функции фикстуры)?


person d_j    schedule 02.05.2014    source источник


Ответы (1)


Вы не можете вкладывать вызовы функций в определенные параметры для сигнатуры другой функции. Вам нужно переместить внутреннюю функцию во внешнюю функцию и вызвать ее там:

@pytest.mark.parametrize("arg", [(7,11), (7,0), (3,0)])
def test_1(arg):
    assert fix_func(arg) <= 500
person Matthew Trevor    schedule 03.05.2014
comment
Боюсь, эта версия также не работает с фикстурами. Это работает только в том случае, если fix_func является нормальной функцией. Я предполагаю, что в этой ситуации невозможно использовать функцию приспособления... - person d_j; 06.05.2014
comment
Это предложение правильное ИМХО, вы действительно должны вызывать тестируемую функцию в тестовой функции, а не в приспособлении. - person flub; 08.05.2014