Что включает в себя тестирование HTTP-методов при проверке API?

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

Ответ

Тестирование 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-кодов реальному результату операции.