Ответ
Фикстура (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:
- Устранение дублирования: Общая логика настройки выносится в одно место.
- Читаемость: Тесты становятся чище и сфокусированы на проверках.
- Надёжность: Гарантированная очистка тестовых данных после прогона, что предотвращает влияние тестов друг на друга.
- Гибкость: Легко менять конфигурацию тестового окружения через параметризацию фикстур.