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


Наследование: запрос → коллекция → родитель#
Скрипт запроса перекрывает скрипт коллекции целиком. Если поле у запроса пустое, 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.url | URL после подстановки переменных |
pm.request.protocol | http, 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.