Какой у вас опыт интеграционного тестирования API?

«Какой у вас опыт интеграционного тестирования API?» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Опыт включает тестирование REST API как вручную, так и с помощью автоматизации. Основной стек: Postman (для ручных проверок и коллекций), Python с библиотеками Requests и Pytest (для автотестов).

Типичные проверки в интеграционных тестах API:

  • Корректность HTTP-статусов: 200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error.
  • Валидация структуры и данных ответа:
    • Соответствие JSON-схеме (используется библиотека jsonschema).
    • Проверка типов данных, обязательных полей, форматов значений (например, date-time).
  • Проверка бизнес-логики: Корректность вычислений, состояние данных после выполнения запроса.
  • Проверка заголовков (headers): Content-Type, Authorization (JWT, OAuth2).
  • Обработка граничных случаев и ошибок: Передача невалидных данных, проверка валидационных сообщений.

Пример автотеста для цепочки запросов (создание -> чтение -> удаление ресурса):

import requests
import pytest

BASE_URL = "https://api.example.com/v1"

@pytest.fixture
def auth_headers():
    # Получение токена для авторизации
    auth_resp = requests.post(f"{BASE_URL}/auth", json={"login": "user", "pass": "pass"})
    token = auth_resp.json()["access_token"]
    return {"Authorization": f"Bearer {token}"}

def test_user_crud_lifecycle(auth_headers):
    # 1. CREATE (POST)
    new_user = {"name": "John Doe", "email": "john@example.com"}
    create_resp = requests.post(f"{BASE_URL}/users", json=new_user, headers=auth_headers)
    assert create_resp.status_code == 201
    user_id = create_resp.json()["id"]

    # 2. READ (GET) - проверяем, что пользователь создан
    get_resp = requests.get(f"{BASE_URL}/users/{user_id}", headers=auth_headers)
    assert get_resp.status_code == 200
    assert get_resp.json()["name"] == new_user["name"]

    # 3. DELETE (DELETE) - очистка тестовых данных
    delete_resp = requests.delete(f"{BASE_URL}/users/{user_id}", headers=auth_headers)
    assert delete_resp.status_code == 204

    # 4. Проверяем, что пользователь удален
    get_resp_after = requests.get(f"{BASE_URL}/users/{user_id}", headers=auth_headers)
    assert get_resp_after.status_code == 404