К содержимому
Журнал QIO

Сайты и разработка4 мин чтения

Ответ 201 ничего не доказывает: 20 проверок API, которые ловят ошибки

Проверять API удобно на одном сквозном сценарии, а не на списке эндпоинтов. В разборе, опубликованном в блоге Нетологии на Хабре, за основу взят запрос на создание заказа: сначала проверяется успешный ответ, затем по одному меняются условия. Часть проверок повторяется в каждом проекте, и их удобно сразу автоматизировать в Postman, поэтому дальше идут и сами проверки, и способ их закрепить.

Ответ 201 ничего не доказывает: 20 проверок API, которые ловят ошибки

Сценарий, на котором всё строится

Базовый запрос — создание заказа с обязательными полями и действующим токеном: товар, количество, адрес доставки. Сервер отвечает 201 Created, заголовком Location с адресом созданного ресурса и телом с идентификатором, составом, статусом и суммой.

По RFC 9110 статус 201 означает, что запрос выполнен и привёл к созданию ресурса. Дальше сценарий разворачивается: после POST заказ запрашивают через GET и сравнивают данные, затем меняют через PATCH, снова читают, удаляют и проверяют, что объект действительно исчез.

Важное правило перед каждым тестом: фиксировать три вещи — исходный запрос, ожидаемый ответ и состояние системы после операции.

Четыре лотка с пятью, пятью, тремя и семью жетонами
Двадцать проверок распадаются на четыре группы: ответ, входные данные, ошибки и доступ, состояние системы.

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

Успешный ответ: пять проверок

Первая группа отвечает на вопрос, правильно ли отработала операция, а не просто вернулся ли ответ.

  • Статус-код: совпадает с документацией и не скрывает ошибку в теле ответа.
  • Структура ответа: есть все обязательные поля и нет неожиданных.
  • Типы и форматы данных: идентификатор, количество, дата создания соответствуют схеме.
  • Значения данных: вернулось то, что отправляли, — товар, количество, адрес.
  • Бизнес-логика: сумма посчитана по формуле из требований, а не переписана из запроса; статус получил допустимое начальное значение; скидка, доставка, налоги и округление применены в правильном порядке.

Входные данные и ошибки: восемь проверок

Дальше в том же запросе меняют по одному условию за раз. Если убрать сразу и адрес, и товар, непонятно, на что именно ответил сервер.

Проверяют обязательные поля, пустые и null-значения, неверные типы и форматы, граничные и недопустимые значения, лишние и неизвестные поля. Для негативных сценариев мало кода из класса 4xx: ответ должен объяснять причину отказа, указывать на конкретное поле и при этом не раскрывать внутренние детали — трассировку стека, SQL-запрос, путь на диске.

Доступ и состояние системы: семь проверок

Самая интересная часть начинается там, где заканчивается один ответ. Проверяют запрос без валидной аутентификации, доступ к чужим объектам и разграничение по ролям и функциям.

Затем смотрят на систему целиком: состояние объекта после операции, связанные бизнес-правила и побочные эффекты, повторный запрос и идемпотентность, согласованность связанных эндпоинтов. Пример из разбора: после заказа двух единиц товара остаток должен уменьшиться на два, после отмены — восстановиться, а связанная платёжная или складская операция перейти в правильное состояние.

Отдельно стоит требование к чистоте контракта: в ответе не должно быть хешей паролей, внутренних идентификаторов и чужих адресов почты. OWASP рекомендует ограничивать ответ минимально необходимым набором полей.

Что проверяют, когда контракт сложнее

Двадцатью пунктами список не заканчивается, набор выбирают по контракту и архитектуре: пагинация, сортировка и фильтрация, ограничение частоты запросов, версионирование и обратная совместимость, конкурентные обновления и оптимистическая блокировка, таймауты и деградация внешних зависимостей, фича-флаги, асинхронные операции со статусом 202 Accepted, вебхуки с подписью и повторами, кэширование с ETag и ответом 304.

Как это закрепить в Postman

Ручная проверка нужна, пока ожидаемый результат ещё уточняется. Когда сценарий стабилизировался, его переносят в коллекцию: base_url и токен выносят в окружение, после создания заказа сохраняют идентификатор в переменную коллекции, следующие запросы обращаются к нему, а проверки живут во вкладке скриптов после ответа.

Collection Runner прогоняет цепочку целиком, а та же коллекция запускается по расписанию или в CI/CD. Автоматизировать имеет смысл только устойчивые проверки: если ожидаемый результат ещё меняется, тест будет ломаться чаще, чем находить ошибки.

Итог

Двадцать проверок — это не ритуал, а способ отделить «ответ пришёл» от «система сделала правильно». Половина списка проверяет не ответ, а последствия, и именно там обычно живут дорогие ошибки.

Источники

  1. Как тестировать API: 20 проверок, которые должен уметь делать QA, Нетология на Хабре
  2. RFC 9110: HTTP Semantics
  • API
  • Postman
  • RFC 9110
  • OpenAPI
  • OWASP

Подписаться на журнал

Новые разборы о сайтах, SEO и ИИ выходят в журнале QIO. Подпишитесь в Google, по RSS или в Telegram, чтобы получать их первыми.

Читайте также

Чем можем помочь?
Обсудить проект