На собесе на QA почти всегда просят рассказать, как вы тестируете API руками, а иногда дают Postman и живой эндпоинт. Разберём инструменты по задачам.
Postman: основа
- Коллекция: папки с запросами. Можно экспортировать в JSON и положить в git.
- Окружение (environment): набор переменных под стенд:
baseUrl, логины, токены. - Переменные пишутся в двойных фигурных скобках:
{{baseUrl}}/users/{{userId}}.
Области переменных от широкой к узкой: глобальные, коллекция, окружение, данные итерации, локальные. Узкая перекрывает широкую: если token есть и в коллекции, и в окружении, подставится значение из окружения. Путаница с областями частая причина «почему ушёл старый токен».
Скрипты
У запроса, папки и коллекции есть два вида скриптов на JavaScript:
- Pre-request: до отправки. Сгенерировать данные, получить токен, подписать запрос.
- Post-response (раньше вкладка Tests): после ответа. Проверки и сохранение значений.
pm.test("заказ создан", () => {
pm.response.to.have.status(201);
const body = pm.response.json();
pm.expect(body.status).to.eql("new");
pm.collectionVariables.set("orderId", body.id);
});
Следующий запрос использует {{orderId}}. Так строятся цепочки: создать, прочитать, изменить, удалить. Схему ответа проверяет pm.response.to.have.jsonSchema(schema).
Запуск пачкой и в CI
- Collection Runner прогоняет коллекцию в Postman. С файлом данных CSV или JSON каждая строка становится итерацией, а колонки переменными: так делают data-driven тесты.
- Newman запускает коллекцию из командной строки, его ставят в CI:
newman run api.postman_collection.json -e stage.postman_environment.json -d users.csv -r cli,junit
Есть и Postman CLI от самого Postman. Секреты в коллекцию не коммитят: передают переменными CI.
Insomnia и Bruno
Insomnia похож на Postman: коллекции, окружения, поддержка REST, GraphQL, gRPC и WebSocket. Bruno хранит коллекции обычными файлами в репозитории и работает офлайн, поэтому его выбирают команды, которым важно ревьюить тесты в git. Принципы везде одинаковы, на собесе важнее понимание, чем конкретная кнопка.
curl
Нужен, когда под рукой только терминал, и для баг-репортов: команда воспроизводит запрос однозначно.
curl -i -X POST https://api.shop.ru/orders \
-H "Authorization: Bearer eyJ..." \
-H "Content-Type: application/json" \
-d '{"productId": 7}'
-iпоказать заголовки ответа,-Iотправить HEAD,-vподробности, включая TLS.-dтело. С ним curl сам шлёт POST, но с типом формыapplication/x-www-form-urlencoded. Для JSON добавляйте заголовок или используйте--json.-Lследовать за редиректами,-u user:passBasic-авторизация.
DevTools браузера
Вкладка Network: все запросы страницы, заголовки, тело, тайминги. Copy as cURL копирует запрос с заголовками и cookie, его можно вставить в терминал или импортировать в Postman. HAR-файл удобно приложить к багу, но в нём ваши cookie и токены: чистите перед публикацией.
Прокси для мобильных
Charles, Fiddler, mitmproxy перехватывают трафик телефона. Нужно:
- Указать прокси в настройках Wi-Fi.
- Установить и сделать доверенным корневой сертификат прокси.
- На Android, начиная с 7-й версии, приложение по умолчанию не доверяет пользовательским сертификатам, нужна тестовая сборка с разрешением. SSL pinning тоже отключают в тестовой сборке.
Главная польза прокси не в просмотре, а в подмене: вернуть 500, пустой список, огромное поле, задержку, и посмотреть, как клиент это переживёт.
Моки
Когда зависимость не готова или нестабильна, её заменяют мок-сервером: моки Postman, WireMock, Mockoon, MockServer. Мок умеет то, чего не дождёшься от настоящего сервиса: таймаут, 503, битый JSON.
Частые ошибки
- Хранить пароли и боевые токены в экспортированной коллекции.
- Писать тесты, зависящие от порядка запуска.
- Проверять только
status, без тела и схемы. - Забыть
Content-Typeпри отправке JSON через curl.
Что спросят на собесе
- Как вы организуете коллекцию в Postman?
- Как передать значение из одного запроса в другой?
- Что такое окружения и области переменных?
- Как запустить коллекцию в CI?
- Как посмотреть запросы мобильного приложения?