Аналогичен этому вопросу: 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
Как лучше всего это сделать?