Ответ
Тестирование HTTP-методов — это ключевая часть API-тестирования, которая проверяет, как сервер обрабатывает различные типы HTTP-запросов (GET, POST, PUT, PATCH, DELETE и другие) в соответствии со спецификацией REST и ожиданиями клиента.
Основные аспекты для каждого метода:
| Метод | Что проверять | Примеры тестовых случаев |
|---|---|---|
| GET | Получение данных. | - Валидный запрос возвращает 200 OK и корректные данные.- Запрос к несуществующему ресурсу ( /users/9999) возвращает 404 Not Found.- Проверка заголовков ( Content-Type: application/json).- Проверка пагинации, фильтрации, сортировки (query-параметры). |
| POST | Создание нового ресурса. | - Успешное создание возвращает 201 Created и заголовок Location.- Валидация входных данных: неполные/некорректные данные возвращают 400 Bad Request.- Проверка уникальности (повторное создание того же ресурса). |
| PUT/PATCH | Полное или частичное обновление. | - PUT заменяет весь ресурс, PATCH — только переданные поля.- Успешное обновление — 200 OK или 204 No Content.- Обновление несуществующего ресурса ( PUT может создать, PATCH — вернуть 404).- Обработка оптимистичной блокировки (заголовок If-Match). |
| DELETE | Удаление ресурса. | - Успешное удаление — 200 OK (с телом) или 204 No Content.- Повторный DELETE для того же ресурса должен возвращать 404 или 410 Gone.- Проверка каскадного удаления связанных данных (если применимо). |
Пример теста на Python с библиотекой requests:
import requests
BASE_URL = "https://api.example.com/v1"
# 1. Тестирование GET (получение списка пользователей)
response = requests.get(f"{BASE_URL}/users")
assert response.status_code == 200
assert response.headers['Content-Type'] == 'application/json'
users = response.json()
assert isinstance(users, list)
# 2. Тестирование POST (создание нового пользователя)
new_user = {"name": "John Doe", "email": "john@example.com"}
response = requests.post(f"{BASE_URL}/users", json=new_user)
assert response.status_code == 201
created_user = response.json()
assert created_user['id'] is not None
assert created_user['name'] == new_user['name']
# Проверка заголовка Location
assert 'Location' in response.headers
# 3. Тестирование ошибок POST (невалидные данные)
bad_user = {"email": "not-an-email"}
response = requests.post(f"{BASE_URL}/users", json=bad_user)
assert response.status_code == 400 # Ожидаем ошибку валидации
error_data = response.json()
assert "validation error" in error_data.get('message', '').lower()
Дополнительные проверки:
- Безопасность: Проверка на уязвимости (инъекции, неправильные CORS-заголовки).
- Идемпотентность: Методы GET, PUT, DELETE должны быть идемпотентными.
- Семантика кодов состояния: Соответствие HTTP-кодов реальному результату операции.