Ответ
Тестирование 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 слышали только краем уха.