Ответ
Для сквозного тестирования API с авторизацией я выношу логику получения токена в сессионную фикстуру, а затем настраиваю общий клиент (например, requests.Session или httpx.Client) с автоматической подстановкой этого токена в заголовки для всех тестов.
Практический пример на Python (pytest + requests):
import pytest
import requests
@pytest.fixture(scope="session")
def auth_token():
"""Получаем токен один раз за сессию тестов."""
login_payload = {"username": "test_user", "password": "test_pass"}
response = requests.post("https://api.example.com/auth/login", json=login_payload)
response.raise_for_status() # Упасть, если авторизация не удалась
return response.json()["access_token"]
@pytest.fixture(scope="function")
def api_client(auth_token):
"""Создаём клиент с предустановленным заголовком авторизации для каждого теста."""
session = requests.Session()
session.headers.update({
"Authorization": f"Bearer {auth_token}",
"Content-Type": "application/json"
})
yield session # Передаём клиент в тест
session.close() # Закрываем сессию после теста
# Теперь все тесты используют предавторизованный клиент
def test_get_user_profile(api_client):
response = api_client.get("https://api.example.com/users/me")
assert response.status_code == 200
assert response.json()["username"] == "test_user"
def test_create_order(api_client):
order_data = {"product_id": 123, "quantity": 2}
response = api_client.post("https://api.example.com/orders", json=order_data)
assert response.status_code == 201
Преимущества подхода:
- Эффективность: Токен получается один раз (
scope="session"). - Чистота тестов: В самих тестах нет кода авторизации, они фокусируются на бизнес-логике.
- Гибкость: Легко добавить другие общие заголовки или базовый URL в фикстуру
api_client. - Надёжность: Сессия (
requests.Session) позволяет повторно использовать TCP-соединение, что ускоряет выполнение тестов.