Ответ
При тестировании API я проверяю целый спектр аспектов, выходящих далеко за рамки тела запроса. Вот мой чек-лист ключевых областей:
1. Заголовки запроса и ответа (Headers):
Authorization/Api-Key: Корректность токенов, проверка доступа для разных ролей, истечение срока действия.Content-Type/Accept: Соответствие форматам данных (см. вопрос про 415 ошибку).Cache-Control,ETag: Поведение кеширования.- Кастомные заголовки, специфичные для проекта.
2. Коды состояния HTTP (Status Codes): Валидация, что API возвращает семантически правильные коды:
200 OKдля успешного GET.201 Createdдля успешного создания ресурса POST.400 Bad Requestпри невалидных данных от клиента.401 Unauthorized/403 Forbiddenпри проблемах с аутентификацией/авторизацией.404 Not Foundдля несуществующих ресурсов.429 Too Many Requestsпри превышении лимитов (Rate Limiting).5xxдля серверных ошибок.
3. Структура и валидность тела ответа (Response Schema): Использую JSON Schema или аналоги для строгой проверки:
- Наличие обязательных полей.
- Корректность типов данных (string, number, boolean, array).
- Форматы данных (date-time, email, uuid).
4. Параметры пути и строки запроса (Path/Query Parameters):
- Path params:
GET /users/{id}– проверка валидных и невалидных ID. - Query params:
GET /items?type=book&sort=-price– проверка фильтрации, сортировки, пагинации (limit,offset), значений по умолчанию.
5. Производительность и временные характеристики:
- Response Time: Укладывается ли в SLA (например, < 200 мс для 95% запросов).
- Load Testing: Как ведет себя API под пиковой нагрузкой.
6. Обработка ошибок (Error Handling):
- Читаемость и информативность сообщений об ошибках.
- Консистентность формата ошибок для всех эндпоинтов.
Пример комплексной проверки на Python:
import requests
import jsonschema
from schemas import USER_SCHEMA # Наша JSON Schema
def test_get_user_full():
# 1. Отправляем запрос с параметрами и заголовком
response = requests.get(
'https://api.example.com/users/123',
headers={'Authorization': 'Bearer valid_token'},
params={'fields': 'name,email'}
)
# 2. Проверяем статус-код
assert response.status_code == 200
# 3. Проверяем заголовок ответа
assert response.headers['Content-Type'] == 'application/json'
response_data = response.json()
# 4. Валидируем схему ответа
jsonschema.validate(instance=response_data, schema=USER_SCHEMA)
# 5. Проверяем бизнес-логику: поля соответствуют запросу
assert all(field in response_data for field in ['id', 'name', 'email'])
assert 'password' not in response_data # Конфиденциальные данные не "светятся"
# 6. Проверяем время ответа (условно)
assert response.elapsed.total_seconds() < 1.0