Как параметризовать тесты в pytest

«Как параметризовать тесты в pytest» — вопрос из категории Тестирование, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для запуска одного теста с несколькими наборами входных данных в pytest используется декоратор @pytest.mark.parametrize.

Это основной способ избежать дублирования кода при проверке функции на множестве различных кейсов, что делает тесты более читаемыми и масштабируемыми.

Синтаксис: @pytest.mark.parametrize("имена_аргументов", [список_значений])

  • "имена_аргументов": Строка с именами параметров через запятую, которые будут переданы в тестовую функцию.
  • [список_значений]: Список кортежей или других итерируемых объектов, где каждый элемент представляет один тестовый случай.

Пример:

import pytest

# Тестовые данные: (входное_число, ожидаемый_результат)
test_cases = [
    (2, 4),
    (0, 0),
    (-3, 9),
    (1.5, 2.25)
]

@pytest.mark.parametrize("input_number, expected_square", test_cases)
def test_square_function(input_number, expected_square):
    """Тестирует функцию возведения в квадрат."""
    assert input_number ** 2 == expected_square

В этом примере test_square_function будет выполнен четыре раза, по одному для каждой пары значений из списка test_cases. Если один из тестов упадет, pytest точно укажет, на каком наборе данных произошла ошибка.