Что такое фикстура (fixture) в pytest?

«Что такое фикстура (fixture) в pytest?» — вопрос из категории Фреймворки тестирования, который задают на 28% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Фикстура (fixture) в pytest — это мощный механизм для настройки предварительных условий и очистки после выполнения тестов. По сути, это функция, которая подготавливает данные, состояние системы или ресурсы (например, подключение к БД, браузер для UI-тестов), которые затем используются в тестовых функциях.

Ключевые особенности:

  • Объявляется с помощью декоратора @pytest.fixture.
  • Передаётся в тест как параметр по имени фикстуры.
  • Поддерживает различные области видимости (scope):
    • function (по умолчанию) — выполняется для каждого теста.
    • class — один раз для класса тестов.
    • module — один раз для модуля.
    • session — один раз за всю сессию запуска тестов.
  • Фикстуры могут зависеть от других фикстур.
  • Поддерживают финализацию (очистку) через yield или request.addfinalizer.

Пример фикстуры для теста API:

import pytest
import requests

@pytest.fixture(scope="module")
def api_client():
    """Фикстура создаёт и возвращает клиент для работы с API."""
    base_url = "https://api.example.com"
    session = requests.Session()
    session.headers.update({"Content-Type": "application/json"})

    # Здесь может быть логин и получение токена
    # login_response = session.post(f"{base_url}/login", json=credentials)
    # session.headers.update({"Authorization": f"Bearer {token}"})

    yield session  # Возвращаем объект сессии тестам

    # Финализация (закрытие сессии) выполнится после всех тестов в модуле
    session.close()

@pytest.fixture
def create_test_user(api_client):
    """Фикстура, зависящая от api_client, создаёт тестового пользователя и возвращает его данные."""
    user_data = {"name": "Test User", "email": "test@example.com"}
    response = api_client.post("/users", json=user_data)
    assert response.status_code == 201
    created_user = response.json()

    yield created_user  # Тест получает данные пользователя

    # После теста удаляем созданного пользователя (очистка)
    api_client.delete(f"/users/{created_user['id']}")

def test_user_creation(create_test_user):
    """Тест использует фикстуру create_test_user."""
    user = create_test_user
    assert user["id"] is not None
    assert user["name"] == "Test User"

Преимущества для QA:

  • Устранение дублирования: Общая логика настройки выносится в одно место.
  • Читаемость: Тесты становятся чище и сфокусированы на проверках.
  • Надёжность: Гарантированная очистка тестовых данных после прогона, что предотвращает влияние тестов друг на друга.
  • Гибкость: Легко менять конфигурацию тестового окружения через параметризацию фикстур.