Все разделы

Основные возможности

Скрипты

На этой странице

Скрипты в Tetiva — это JavaScript, который выполняется до отправки запроса (Pre-request) и после получения ответа (Post-response). Pre-скрипт подставляет заголовок, пересчитывает подпись или кладёт значение в переменную окружения; post-скрипт читает ответ, сохраняет из него токен и проверяет результат через pm.test. Скрипты живут на вкладке Scripts запроса или коллекции, выполняются в песочнице без доступа к файлам и сети, а всё, что они напечатали, попадает во вкладку Tests рядом с ответом.

Где писать#

Вкладка Scripts есть у каждого запроса и у каждой коллекции (Open Details в контекстном меню коллекции). Внутри — две кнопки: Pre-request и Post-response, каждая со своим редактором. Оба редактора остаются смонтированными, поэтому история отмен не теряется при переключении.

Редактор понимает pm. и подсказывает методы по мере набора, а {{var}} подсвечиваются и резолвятся так же, как в теле запроса: наведите курсор — увидите значение из активного окружения, секреты замаскированы.

Tetiva
v0.17.0
Вкладка Scripts в Tetiva: post-response скрипт с pm.test и результатами тестовВкладка Scripts в Tetiva: post-response скрипт с pm.test и результатами тестов
Post-скрипт сохраняет токен и проверяет ответ — результат виден во вкладке Tests

Наследование: запрос → коллекция → родитель#

Скрипт запроса перекрывает скрипт коллекции целиком. Если поле у запроса пустое, Tetiva идёт вверх по дереву коллекций и берёт первый непустой скрипт (глубина обхода — до 50 уровней). Pre и post наследуются независимо: post-скрипт может прийти от коллекции, пока pre-скрипт задан на самом запросе.

Общий для всей коллекции скрипт авторизации поэтому пишется один раз в корневой коллекции — и работает для всех вложенных запросов, пока запрос не переопределит его своим.

API pm.*#

Доступно в обеих фазах:

ВызовЧто делает
console.log(...)Печатает в блок Console вкладки Tests. warn, error, info пишут в тот же поток, уровней нет
pm.environment.get(key)Значение переменной или undefined
pm.environment.set(key, value)Задать переменную; значение приводится к строке
pm.environment.unset(key)Убрать переменную из набора этого запуска
pm.request.methodМетод запроса
pm.request.urlURL после подстановки переменных
pm.request.protocolhttp, grpc или graphql
pm.request.headers.upsert({ key, value })Добавить заголовок или заменить существующий
pm.request.headers.remove(key)Удалить заголовок

pm.request доступен в обеих фазах, но headers.upsert и headers.remove в post-скрипте ни на что не влияют: запрос уже ушёл, и его изменённую копию никто не читает.

Только для gRPC: pm.request.service, pm.request.grpcMethod, pm.request.message (тело в JSON), а также pm.request.metadata с методами get(key), set(key, value), remove(key) и toObject(). Метаданные приходят в скрипт копией: set меняет то, что уйдёт на сервер, но запись в коллекции остаётся нетронутой. Подробнее — gRPC.

Только для GraphQL: pm.request.graphqlVariables и pm.request.graphqlOperation. См. GraphQL.

Только в post-скрипте:

ВызовЧто делает
pm.response.codeКод ответа числом
pm.response.statusАлиас pm.response.code — то же число, не текст
pm.response.text()Тело ответа строкой
pm.response.json()Тело, разобранное как JSON; при невалидном JSON возвращает undefined, а не бросает исключение
pm.test(name, fn)Тест: fn без исключения — PASS, с исключением — FAIL и текст ошибки

У gRPC добавляются pm.response.statusText (имя статуса) и pm.response.metadata — обычный объект, где каждому ключу соответствует первое значение.

Библиотеки утверждений нет: pm.expect и chai не подключены, проверки пишутся обычным JS с throw.

Что происходит с переменными#

Значения, которые скрипт положил через pm.environment.set, после выполнения запроса записываются в активное окружение: существующие переменные обновляются, недостающие создаются как обычные (не секретные). Если активного окружения нет, изменения живут только внутри запуска. Разбор приоритетов — на странице Окружения и переменные.

Ограничения песочницы#

  • Файловой системы и сети нет: fetch, XMLHttpRequest, WebSocket, require, process, module, Buffer, __dirname не определены.
  • Таймеров нет: setTimeout и setInterval отсутствуют. Promise доступен, но отложить код нечем.
  • Стандартные JSON и Math на месте.
  • Состояние не переживает запуск: каждый скрипт получает свежую машину, глобальные переменные из прошлого запуска не видны.
  • На каждую фазу — 5 секунд. Скрипт, который не реагирует на остановку (классический случай — регулярное выражение с возвратами), остаётся доигрывать в фоне, но окно и остальные вкладки при этом не зависают.
  • Ограничения памяти нет. Это стоит помнить, открывая чужую коллекцию.

Ошибка или таймаут pre-скрипта не отменяет запрос: он уходит с заголовками, которые были до скрипта, а текст ошибки появляется в Script Errors. Так же ведёт себя и post-скрипт — ответ вы всё равно увидите.

Тесты и консоль#

Вкладка Tests рядом с ответом собирает три блока: Test Results с PASS/FAIL по каждому pm.test, Console с выводом обеих фаз (строки помечены [pre] и [post]) и Script Errors с фазой и текстом ошибки. Бейдж на вкладке показывает «пройдено/всего», а при одних лишь console-строках — точку. Подробнее про панель ответа — Просмотр ответа.

Примеры#

Pre-скрипт: подпись и заголовок трассировки.

pm.request.headers.upsert({ key: "X-Request-Id", value: String(Date.now()) })

var token = pm.environment.get("access_token")
if (!token) {
  console.warn("access_token пуст — сначала выполните запрос логина")
}

Post-скрипт: сохранить токен и проверить ответ.

var data = pm.response.json()

pm.test("статус 200", function () {
  if (pm.response.code !== 200) throw new Error("получили " + pm.response.code)
})

pm.test("токен пришёл", function () {
  if (!data || !data.access_token) throw new Error("в теле нет access_token")
})

if (data && data.access_token) {
  pm.environment.set("access_token", data.access_token)
}

Копирование cURL и скрипты#

Пункт Copy as cURL прогоняет pre-скрипт в режиме dry-run: изменения заголовков и переменных попадают в команду, но не сохраняются в базу и не создают запись в истории. Подробности — Импорт и экспорт.

Скрипты, написанные для Postman, чаще всего требуют правок: поддержано подмножество pm.*, перечисленное выше. Что переносится при миграции, разобрано на странице Переход с Postman.

обновлено