Как параметризуешь тесты в Python

«Как параметризуешь тесты в Python» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Я активно использую параметризацию в pytest для тестирования одного сценария с разными наборами входных и ожидаемых данных. Это позволяет избежать дублирования кода и четко структурировать тестовые случаи.

Основной инструмент — декоратор @pytest.mark.parametrize.

Простой пример: Тестирование функции валидации email.

import pytest

# Функция, которую тестируем (условно)
def is_valid_email(email):
    return "@" in email and "." in email.split("@")[-1]

# Параметризованный тест
@pytest.mark.parametrize(
    "email, expected",
    [
        ("user@example.com", True),   # Валидный email
        ("invalid-email", False),      # Не содержит @
        ("user@com", False),           # Нет точки в домене
        ("", False),                   # Пустая строка
    ]
)
def test_email_validation(email, expected):
    """Тест проверяет валидацию email для разных входных данных."""
    result = is_valid_email(email)
    assert result == expected, f"Failed for email: {email}"

При запуске pytest создаст и выполнит четыре отдельных тестовых случая.

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

import pytest

@pytest.fixture(params=["chrome", "firefox", "edge"])
def browser(request):
    """Фикстура запускает тест для каждого из перечисленных браузеров."""
    browser_name = request.param
    # Код инициализации драйвера для browser_name
    driver = webdriver.Remote(command_executor=URL, options=options)
    yield driver
    driver.quit()

def test_login(browser):
    """Этот тест запустится три раза — для каждого браузера."""
    browser.get("https://example.com/login")
    # ... шаги теста

Чтение данных из внешних источников: Для сложных сценариев я выношу тестовые данные в JSON, CSV или YAML файлы.

import json
import pytest

def load_test_data():
    with open("test_data/login_cases.json") as f:
        return json.load(f)

@pytest.mark.parametrize("credentials", load_test_data())
def test_login_with_external_data(credentials):
    username = credentials["username"]
    password = credentials["password"]
    expected_result = credentials["expected"]
    # ... логика теста

Ключевые преимущества такого подхода в QA:

  • Наглядность: Все тестовые случаи видны сразу в одном месте (декораторе или файле с данными).
  • Легкость поддержки: Добавление нового тест-кейса — это просто добавление новой строки в список параметров.
  • Детальные отчеты: В отчете Allure каждый параметризованный запуск отображается как отдельный тест-кейс с его уникальными параметрами, что упрощает анализ падений.