py.test Параметризация функции прибора и тестовой функции - PullRequest
0 голосов
/ 20 декабря 2018

Аналогичен этому вопросу: py.test: передать параметр в функцию прибора , однако мы хотим также преобразовать входные параметры в тест.

Например (это упрощеноверсия того, что я хочу сделать):

import pytest


def person_says(name, age):
    return f"{name} is {age}"


@pytest.fixture
def add_surname(request):
    surname = request.param
    return f'Mike {surname}'


NAME1 = "Johnson"
AGE1 = "13"
OUTPUT1 = "Mike Johnson is 13"
NAME2 = "Liam"
AGE2 = "21"
OUTPUT2 = "Mike Liam is 21"

Я хочу передать что-то вроде этого:

@pytest.mark.parametrize('add_surname,age,expected',
                         [[NAME1, AGE1, OUTPUT1], 
                          [NAME2, AGE2, OUTPUT2]],
                         indirect=True)
def test_person_says(add_surname, age, expected):
    name = add_surname
    output = person_says(name, age)
    assert expected == output

Но это не работает, так как ищет приспособление age которого не существует


Использование нескольких декораторов делает все 4 комбинации.

@pytest.mark.parametrize('age,expected', [[AGE1, OUTPUT1], [AGE2, OUTPUT2]])
@pytest.mark.parametrize('add_surname', [NAME1, NAME2], indirect=True)
def test_person_says(add_surname, age, expected):
    name = add_surname
    output = person_says(name, age)
    assert expected == output

Результаты:

Expected :Mike Liam is 21        Actual   :Mike Johnson is 21  # FAIL
Expected :Mike Johnson is 13     Actual   :Mike Johnson is 13  # Pass
Expected :Mike Johnson is 13     Actual   :Mike Liam is 13     # FAIL
Expected :Mike Liam is 21        Actual   :Mike Liam is 21     # Pass

Как лучше всего это сделать?

1 Ответ

0 голосов
/ 20 декабря 2018

Помимо логического значения, indirect может принимать список имен входов, поэтому косвенная параметризация через приборы применяется только к этим входам.Пример:

@pytest.mark.parametrize('x, y, z', [('spam', 'eggs', 'bacon')], indirect=['x', 'y'])

x и y параметризованы косвенно, поэтому spam и eggs будут пропущены через приборы x и y, но z будет параметризован напрямую, поэтому bacon будет использоваться в качестве простого ввода.В вашем случае:

@pytest.mark.parametrize('add_surname,age,expected',
                         [[NAME1, AGE1, OUTPUT1], 
                         [NAME2, AGE2, OUTPUT2]],
                         indirect=['add_surname'])

добьется цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...