Postman

Как QA использует Postman на практике: исследование API, коллекции, переменные окружения и быстрый feedback по интеграциям.

Обновлено:

Содержание

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

Из чего состоит рабочая коллекция

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

С чего начать исследование API

Сначала найди договорённость о поведении: OpenAPI, требования, примеры клиента, ограничения ролей. Проверь адрес стенда и версию сервиса, затем отправь минимальный допустимый запрос. Убери необязательные поля и выясни, какое из них действительно влияет на результат. Сохрани рабочий пример с описанием назначения. После этого меняй по одному условию: тип поля, отсутствие обязательного значения, права пользователя, состояние объекта. Так наблюдение превращается в управляемый эксперимент.

Переменные без скрытой зависимости

Адрес сервиса вынеси в baseUrl, идентификатор созданного заказа — в orderId. Выражение {{baseUrl}}/orders/{{orderId}} читается лучше случайного адреса с постоянным номером. В Postman значение переменной зависит от области видимости: глобальной, коллекции, окружения, данных итерации и локальной. Одинаковое имя в нескольких областях усложняет отладку. Перед прогоном проверь выбранное окружение и разрешённое значение адреса; не полагайся только на название вкладки.

Токены и пароли хранят в предназначенном для секретов механизме, а для CI передают через секреты среды выполнения. Перед экспортом отдельно просматривают значения переменных и примеры ответов. Пометка чувствительного значения и маскирование в интерфейсе сами по себе не доказывают, что его нет в файле, консоли или приложенном отчёте.

Практика: создание и чтение заказа

Допустим, тестовый API по контракту создаёт заказ через POST /orders и возвращает 201, id и totalMinor в минимальных денежных единицах. Есть пользователь buyer-a, тестовый товар и отключённое реальное списание. Договоримся, что один товар стоит 1250, количество равно двум, доставка бесплатна. Это наши исходные данные и проверяемое ожидание, а не универсальный формат любого API.

  1. 1.Отправь создание заказа с quantity=2. Ожидаются 201, непустой идентификатор и totalMinor=2500; сохрани id только после проверки ответа.
  2. 2.Выполни GET /orders/{{orderId}} тем же пользователем. Ожидаются тот же владелец, состав и сумма; успешное создание должно подтверждаться чтением.
  3. 3.Повтори чтение пользователем buyer-b. Ожидается предусмотренный контрактом отказ без содержимого чужого заказа; конкретный код зависит от политики сервиса.
  4. 4.Отправь quantity=0. Ожидается согласованная ошибка валидации и отсутствие нового заказа; проверь побочный эффект доступным способом.

Проверки, которые действительно что-то доказывают

Скрипт после ответа должен проверять бизнес-значение и структуру, а не только HTTP-код. Например, в запросе создания можно записать следующие assertions. Условие сохранения id защищает следующий шаг от очевидно неверных данных, но не делает всю цепочку независимой от состояния.

javascript
pm.test('Создан заказ', () => {
  pm.response.to.have.status(201);
  const body = pm.response.json();
  pm.expect(body.id).to.be.a('string').and.not.empty;
  pm.expect(body.totalMinor).to.eql(2500);
});
if (pm.response.code === 201) {
  const body = pm.response.json();
  if (typeof body.id === 'string' && body.id.length > 0) {
    pm.environment.set('orderId', body.id);
  }
}

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

Повторяемый прогон и уборка данных

Коллекция должна создавать собственные данные или явно документировать подготовку. Перед повтором очисти старый orderId, чтобы не прочитать заказ предыдущего запуска. Укажи, как удаляются либо помечаются тестовые сущности и что делать после частичного падения. Для конкурентных прогонов используй уникальный маркер запуска. Один общий пользователь и один постоянный заказ часто превращают корректные проверки в случайную гонку между тестировщиками.

Что учитывать при запуске в CI

На октябрь 2026 года документация Postman v12 описывает формат коллекций v3 и рекомендует Postman CLI. Newman объявлен устаревшим, больше не поддерживается и не исполняет v3. Поэтому сначала зафиксируй формат коллекции, доступные скрипты и выбранный runner. Перенос рабочего запроса из приложения в CI обязательно проверь пробным запуском: локальный vault, cookies и возможности интерфейса не следует считать автоматически доступными другой среде.

Для асинхронной операции успешный ответ может означать только принятие задания. Если создание возвращает статус обработки, заранее определи способ ожидания конечного состояния, предельное время и допустимые промежуточные ответы. Не заменяй такую проверку случайной длинной паузой: быстрый стенд потеряет время, медленный останется нестабильным. Отдельно проверь повторное обращение после timeout: неизвестный клиенту результат операции не равен отсутствию созданного объекта. При поддержке idempotency key сохрани его между повторами одного намерения и проверь, что не возник второй заказ.

Как расследовать расхождение

Сравни фактически отправленный URL, авторизацию, заголовки и тело; затем статус, ответ и время. Проверь разрешение переменных и автоматические перенаправления. Успешный ручной запуск при падающем CI часто объясняется другим токеном, часовым поясом, отсутствующими данными либо сетью. В дефект приложи минимальный обезличенный запрос, ожидание по контракту, фактический ответ, сборку и correlation id. Полный дамп окружения обычно приносит больше лишних данных, чем пользы.

Типичные ошибки и результат работы QA

Распространённые ошибки — хранить всю регрессию в несохранённых вкладках, считать зелёный статус доказательством корректности, вручную менять адрес в десятках запросов и запускать изменяющие операции на неверном стенде. Ещё одна проблема — бесконтрольная цепочка, где первый сбой порождает двадцать вторичных ошибок. Хорошая коллекция содержит понятную подготовку, осмысленные проверки, диагностируемые зависимости и безопасную уборку. Тогда Postman помогает обсуждать поведение API на основании воспроизводимых фактов.

Что ещё почитать

Воспроизводимая локальная коллекция: статус, схема и состояние

Рассмотрим вымышленный API с GET /items и POST /items. По его контракту имя непустое, количество — целое от 1 до 10; корректная запись возвращает 201, выход за диапазон — 422, некорректный JSON — 400. Это условия примера, а не всех API. Перед каждым прогоном восстанавливайте одноразовую фикстуру с одной исходной записью.

plain text
Порядок	Запрос	Ожидаемый результат
1	Сбросить учебную фикстуру	Одна исходная запись
2	GET /items	200; items — массив длины 1
3	POST /items {"name":"Pen","quantity":2}	201; id=2, name=Pen, quantity=2
4	POST /items {"name":"Pen","quantity":11}	422; ошибка quantity-range
5	POST /items с некорректным JSON	400; ошибка invalid-json
6	GET /items	Ровно 2 записи; отклонённые запросы ничего не добавили

Проверка только статуса пропускает неверный бизнес-результат. Добавьте проверку схемы обязательных полей и типов, затем сравните значимые значения. Итоговое чтение подтверждает сохранение данных и отсутствие побочных записей. Храните baseUrl в отдельном окружении; не помещайте реальные учётные данные в учебный экспорт.

plain text
pm.test('Created', () => pm.response.to.have.status(201));
pm.test('Business values', () => {
  const item = pm.response.json();
  pm.expect(item.name).to.eql('Pen');
  pm.expect(item.quantity).to.eql(2);
});

Для новой автоматизации ориентируйтесь на актуальный Postman CLI: официальная рекомендация теперь указывает на поддерживаемый CLI. Newman оставлен как вариант совместимости для существующих коллекций v2.1. Для локального экспорта v2.1 команда совместимости: newman run collection.json -e environment.json. Учебный сервер привяжите к loopback и перед прогоном восстановите одноразовую фикстуру.

Продолжить изучение

Newman

Negative API testing

JSON и XML

Postman CLI guidance

Collection runner reference