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

Ответ

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

Ответ 18+ 🔞

О, слушай, вот тебе тема, которая, блядь, всех этих распиздяев-разработчиков вгоняет в ступор, а потом они удивляются, почему их API нихуя не работает! Тестирование HTTP-методов, ёпта!

Представь себе, что твой сервер — это такой суровый барин в усадьбе, а HTTP-методы — это его приказы. «ПОДАТЬ!», «СОЗДАТЬ!», «ИЗМЕНИТЬ!», «НАХУЙ УДАЛИТЬ!». И если лакей (то есть сервер) на команду «ПОДАТЬ!» начинает, блядь, выносить сор из избы — это пиздец, контора накрывается медным тазом.

Вот смотри, таблица, чтобы не быть мудаком, который всё в кучу мешает:

Метод На что смотреть, как ястреб, блядь Примеры, чтобы не обосраться
GET Просто дай данные, сука. Ничего не меняй! — Нормальный запрос — 200 OK и данные в порядке.
— Спросил про лешего (/users/9999) — получи 404 Not Found, иди нахуй.
— Заголовки, блядь, проверь! Чтобы Content-Type был application/json, а не text/plain, ёпта!
— Пагинация, фильтры — всё это должно работать, а не просто так болтаться.
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.
— Удалил два раза одно и то же — должен получить 404 или 410 Gone, а не упасть с ошибкой, как дурак.
— Если удаление каскадное (за собой тянет другие данные), проверь, чтобы не осталось сирот-записей в базе, которые нихуя не нужны.

А вот, блядь, пример кода на Python, чтобы ты не думал, что это всё высосано из пальца. Код не трогаю, он святой.

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()

И ещё, блядь, не забудь про дополнительные штуки, которые отделяют мужчин от мальчиков:

  • Безопасность: Проверь, чтобы через твои эндпоинты нельзя было, как через дырявое ведро, SQL-инъекции или XSS-атаки запускать. И CORS-заголовки, ёпта, чтобы не было «Access-Control-Allow-Origin: *» там, где это пиздец как не нужно.
  • Идемпотентность: GET, PUT, DELETE — сколько раз ни выполняй один и тот же запрос, результат должен быть как от первого раза. Не должно быть такого, что после второго DELETE у тебя сервер ложится с криком «БЛЯДЬ, Я ЕГО УЖЕ УДАЛИЛ!».
  • Семантика кодов: Это, сука, самое важное! Код ответа должен реально отражать, что случилось. 200 — значит ОК. 404 — значит не найдено. 500 — значит сервер обосрался. Нельзя на все случаи жизни слать 200 с {«error»: true} внутри — это моветон и пиздабольство высшей пробы.

Вот так вот, блядь. Кажется, просто, а как начнёшь проверять — оказывается, половина API сделана какими-то мартышками, которые про HTTP слышали только краем уха.