Как сделать общую авторизацию для всех API-тестов

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

Ответ

Для сквозного тестирования 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-соединение, что ускоряет выполнение тестов.