Короткий ответ
Параметризация позволяет прогнать один и тот же тест на нескольких наборах аргументов, не дублируя код. В pytest это делает декоратор @pytest.mark.parametrize, которому передаётся строка с именами параметров и список кортежей значений.
Как это работает подробнее
Декоратор описывает данные, а pytest выполняет тест по разу на каждый набор.
- Объявление. Декоратор @pytest.mark.parametrize получает строку с именами параметров и список кортежей значений для этих параметров.
- Выполнение. Тест запускается отдельно для каждого кортежа, и сбой одного набора не останавливает остальные.
- Отчёт. Каждый прогон выводится отдельно, с указанием значений параметров в имени теста, например test_add[5-5-10].
- Граничные случаи. Вместо копий функции вида test_add_1 пишется одна функция, а данные перечисляются в декораторе.
Пример кода
Параметризованный тест сложения
import pytest
@pytest.mark.parametrize('input1, input2, output', [(5, 5, 10), (3, 5, 12)])
def test_add(input1, input2, output):
assert input1 + input2 == output, 'failed'Что использовать на практике
- Наборы данных. Перечисляй входные значения и ожидаемый результат в списке кортежей.
- Краевые случаи. Проверяй граничные значения одним параметризованным тестом вместо нескольких почти одинаковых функций.
- С фикстурами. Комбинируй параметризацию с фикстурами, например передавая в тест базовый URL и пары id и имя.