Ответ
При тестировании API я обрабатываю и проверяю ответы комплексно, используя следующий набор методов и библиотек. Это позволяет убедиться не только в функциональной корректности, но и в надежности и соответствии контракту.
1. Базовые проверки статуса и структуры:
import requests
import jsonschema
response = requests.get('https://api.example.com/users/1')
# 1. Проверка HTTP-статус кода
assert response.status_code == 200, f"Expected 200, got {response.status_code}"
# Или используем встроенную проверку
response.raise_for_status()
# 2. Проверка формата тела ответа (JSON/XML)
data = response.json() # Вызовет ошибку, если ответ не JSON
# 3. Проверка заголовков
assert response.headers['Content-Type'] == 'application/json; charset=utf-8'
2. Валидация по схеме (контракту) — самый важный метод:
Я использую jsonschema для строгой проверки структуры, типов данных и обязательных полей. Это предотвращает «поломку» клиентов при изменении API.
# Схема, описывающая ожидаемую структуру ответа
user_schema = {
"type": "object",
"properties": {
"id": {"type": "integer", "minimum": 1},
"name": {"type": "string"},
"email": {"type": "string", "format": "email"},
"isActive": {"type": "boolean"}
},
"required": ["id", "name", "email"] # Проверка обязательных полей
}
# Валидация ответа против схемы
jsonschema.validate(instance=data, schema=user_schema)
3. Проверка бизнес-логики и данных:
# 4. Проверка конкретных значений
assert data["name"] == "John Doe"
assert data["isActive"] is True
# 5. Проверка связей между данными (если применимо)
assert data["id"] == int(response.url.split('/')[-1])
4. Нефункциональные проверки:
# 6. Проверка времени ответа (Performance)
assert response.elapsed.total_seconds() < 0.5, "Response too slow"
# 7. Проверка безопасности (например, отсутствие чувствительных данных в заголовках)
assert 'X-Password' not in response.headers
5. Извлечение данных для последующих запросов (для сквозных тестов):
# 8. Сохранение токена или ID для цепочки запросов
auth_token = data["token"]
headers = {"Authorization": f"Bearer {auth_token}"}
next_response = requests.get('https://api.example.com/profile', headers=headers)
На практике я объединяю эти методы в рамках тестового фреймворка (Pytest, TestNG, JUnit), использую фикстуры для подготовки данных и assertions для четкой отчетности об ошибках.