Какие HTTP-методы вы знаете и как они применяются в тестировании API?

Ответ

В тестировании REST API я постоянно работаю со стандартными HTTP-методами, которые соответствуют операциям CRUD:

  • GET: Запрос данных от сервера. Использую для проверки получения ресурсов (например, списка пользователей). Должен быть безопасным (не менять состояние) и идемпотентным.
  • POST: Отправка данных для создания нового ресурса. Тестирую создание сущностей, валидацию входящих данных и коды ответа (201 Created).
  • PUT: Полное обновление существующего ресурса. Проверяю замену всех полей объекта.
  • PATCH: Частичное обновление ресурса. Тестирую сценарии, когда нужно изменить только одно-два поля.
  • DELETE: Удаление ресурса. Проверяю, что ресурс действительно удаляется и возвращается корректный статус (204 No Content).
  • HEAD, OPTIONS: Использую реже, в основном для проверки метаданных или CORS-заголовков.

Пример теста на Python с библиотекой requests:

import requests

# Тестирование GET-запроса
response = requests.get('https://api.example.com/v1/users/123')
assert response.status_code == 200
assert response.json()['id'] == 123

# Тестирование POST-запроса с передачей тела
new_user = {'name': 'Alice', 'email': 'alice@example.com'}
response = requests.post('https://api.example.com/v1/users', json=new_user)
assert response.status_code == 201
assert 'id' in response.json()

При тестировании важно проверять не только успешные сценарии, но и обработку ошибок (4xx, 5xx), а также соблюдение принципов идемпотентности и безопасности методов.

Ответ 18+ 🔞

А, ну это ж про наши любимые HTTP-методы, ебать мои старые костыли! Сидишь, тестишь эти REST API, а там всё по полочкам, как в армии. Каждый метод — свой чин, свои обязанности. Слушай, разложу как есть.

GET — это наш разведчик, тихий и незаметный. Его задача: сходить, посмотреть, что там на сервере лежит, и вернуться с докладом. Ничего не трогает, не ломает. Просто читает. Идемпотентный, то есть сколько раз ни кинь — хуй с горы, всегда один результат должен быть. Тестишь — проверяешь, что список пользователей приходит, а не счёт на оплату за электричество.

POST — это уже десантник, создатель. Прилетает с пачкой данных и говорит: «Принимай нового рекрута!». Тестишь создание всего: юзеров, заказов, котиков. Главное — смотреть, чтобы в ответе был статус 201 Created, а не какая-нибудь херня. И чтобы ID новому созданцу присвоили, а то без паспорта затеряется.

PUT — это переписчик истории, ёпта. Приходит и говорит: «Всё, что было про этого пользователя — забыли. Вот новый паспорт, новые данные, живите с этим». Полное обновление, с ног до головы. Проверяешь, что старые поля нахуй сгинули, а новые — на месте.

PATCH — его младший брат, хитрая жопа. Не хочет весь объект таскать, только точечно исправить. «У этого юзера только email поменялся, остальное оставь». Тестишь именно такие сценарии — поменял один атрибут, а остальные как были, так и остались.

DELETE — ликвидатор. Пришёл, увидел, стёр с лица сервера. Проверяешь, что после него ресурс реально исчезает, а в ответе красуется гордый 204 No Content — мол, работа сделана, вопросов нет.

Ну а HEAD с OPTIONS — это такие штабные писари. Редко нужны, но без них иногда никуда. Один заголовки проверяет, другой по CORS'у отчитывается.

Вот, смотри, как на Python с requests это выглядит, простейший пример:

import requests

# GET-запрос — пошёл посмотрел, что за юзер под номером 123
response = requests.get('https://api.example.com/v1/users/123')
assert response.status_code == 200  # Должен ответить "ок"
assert response.json()['id'] == 123  # И в теле именно тот ID, который просили

# POST-запрос — создаём новую Алису
new_user = {'name': 'Alice', 'email': 'alice@example.com'}
response = requests.post('https://api.example.com/v1/users', json=new_user)
assert response.status_code == 201  # Обязательно 201 — создано!
assert 'id' in response.json()  # И сервер должен выдать новоиспечённый ID

Но это всё, конечно, цветочки. Ягодки начинаются, когда тестишь не только радужные сценарии. Обязательно надо проверить, как API отбивается от кривых данных — ошибки 4xx (это клиент накосячил) и 5xx (это сервер грохнулся). И святое — принципы идемпотентности и безопасности. Чтобы GET сто раз не создал сто заказов, а DELETE, выполненный дважды, не вызвал ошибку «уже удалён». В общем, доверия ебать ноль, проверяй всё до последнего байта.

Видео-ответы