Ещё выбираете? Сначала посмотрите Tetiva как аналог Postman или скачайте Tetiva и попробуйте импорт на настоящей коллекции.
Переезд состоит из двух действий: выгрузить из Postman коллекцию в формате Collection v2.1 и импортировать файл в Tetiva. Переносятся структура папок, запросы, заголовки, тела, авторизация, описания, сохранённые ответы и — отдельным файлом — окружения. Скрипты переносятся, если при импорте отметить «Импортировать скрипты». Переменные коллекции становятся окружением с её именем. Не переносится всё, что связано с облаком Postman, и ниже расписано, что именно проверить.
Шаг 1. Выгрузка из Postman#
- В меню коллекции выберите Export и формат Collection v2.1. Сохраните
.json. - Окружения выгружаются отдельно — по файлу на окружение.
Формат v2.0 клиент не примет: импорт остановится с ошибкой unsupported schema, only Postman Collection v2.1 is supported. Если файл достался вам от коллеги и формат неизвестен — откройте его и посмотрите поле info.schema, в нём должно быть v2.1.
Шаг 2. Импорт в Tetiva#
- В корень панели коллекций — кнопка «Импорт» над деревом коллекций → «Импорт из файла…».
- Внутрь существующей коллекции — правый клик по ней → «Импорт из файла…». Импортированное дерево ляжет внутрь неё.
- Выберите
.json. Откроется окно подтверждения. В нём видно, сколько в файле папок, запросов и примеров, куда встанет коллекция, на какие хосты ходят запросы, что изменилось при импорте и какие в файле скрипты. Скрипты импортируются, только если отметить «Импортировать скрипты». После «Импортировать» появится уведомление видаИмпортирована коллекция «Payments API»: 4 папки · 27 запросов · 3 примераи откроется вкладка новой коллекции. - Окружения — селектор окружения в строке запроса → «Настроить окружения…» → кнопка импорта (подсказка «Импорт окружения из Postman или Hoppscotch»). Файл окружения можно выбрать и через «Импорт из файла…».
Корневая коллекция Postman становится обычной коллекцией Tetiva, папки — вложенными коллекциями. Глубина вложенности не ограничена.


Соответствие концепций#
| Postman | Tetiva |
|---|---|
| Collection | Коллекция верхнего уровня: имя, описание, авторизация |
| Folder | Вложенная коллекция: имя, описание, авторизация |
| Request | Запрос: имя, метод, URL, заголовки, тело, авторизация |
| Отключённый заголовок | Заголовок со снятой галочкой — значение сохраняется |
| Auth: Bearer, Basic, API Key | Те же типы; у API Key переносятся имя, значение и размещение — header или query |
| Auth: OAuth 2.0, JWT, Digest, AWS Signature | Те же схемы; гранты OAuth 2.0 и алгоритм JWT переносятся, authorization_code_with_pkce приезжает как Authorization Code |
| Auth: NTLM, Hawk и прочие | No Auth; после импорта показывается список того, что не перенеслось |
Запрос без блока auth | Inherit: авторизация берётся у папки или коллекции; явный noauth становится No Auth |
| Описание запроса | Описание на вкладке Docs |
| Body: raw + JSON | Тело типа JSON |
| Body: raw + XML или HTML | Тело типа XML |
| Body: raw без языка, текст | Тело типа Raw |
| Body: form-data | Тело типа Form; поля-файлы нужно выбрать заново |
| Body: GraphQL | Запрос GraphQL — POST, query и variables на своих местах |
| Body: x-www-form-urlencoded | Тело типа Form с исходными ключами, значениями и флажками включения |
| Body: binary | Тело binary без файла — выберите его заново |
| Pre-request и Tests скрипты | Pre-request и post-response скрипты, если отметить «Импортировать скрипты» |
| Сохранённые ответы (Examples) | Примеры ответов; пример с телом больше 256 КБ пропускается |
| Collection variables | Окружение с именем коллекции: выберите его в списке окружений |
| Environment (отдельный файл) | Окружение; переменные с типом secret остаются секретными, выключенные — выключенными |
| Метод вне списка GET…HEAD | GET |
Что не переносится#
| Что | Что делать |
|---|---|
| Глобальные переменные | Файл globals станет окружением «Globals» или с именем файла: глобального уровня в Tetiva нет |
Значения path-переменных (:id) | В URL остаётся плейсхолдер — подставьте переменную окружения |
| Mock-серверы, мониторы, Runner, Flows | Аналогов нет |
Что проверить после импорта#
Авторизация по наследству. Запрос без собственного блока auth импортируется с режимом Inherit и, как в Postman, берёт авторизацию у папки или коллекции выше по дереву. Явный noauth становится No Auth. Как работает цепочка наследования, описано на странице Авторизация.
Скрипты. Импортируются, только если в окне подтверждения отмечено «Импортировать скрипты». Объект pm в Tetiva реализован частично, поэтому неподдерживаемые вызовы pm.* придётся поправить руками — см. таблицу ниже.
Схемы, которых нет. NTLM, Hawk и прочая экзотика приезжают как No Auth, но не молча: после импорта висит уведомление со списком — по строке на блок авторизации, с именем коллекции, папки или запроса и причиной. Пройдитесь по нему и настройте эти запросы заново, см. Авторизация.
Файлы. Тело binary и поля-файлы в form-data приезжают без файла: выберите его заново на вкладке Body.
Переменные окружения. Выключенные в Postman переменные остаются выключенными. Переменные коллекции попадают в отдельное окружение, и пока вы его не выберете, {{переменные}} из них не подставятся.
Секреты. Переменные с типом secret остаются секретными, но значения в файле Postman лежат открытым текстом — не оставляйте выгрузку в общей папке.
Скрипты: что понимает pm.*#
Скрипты Tetiva выполняются на движке goja — это JavaScript, но не Node и не браузер. Объект pm реализован частично: тесты на pm.test и pm.expect обычно работают без правок, а pm.sendRequest, pm.globals и require придётся заменить. Полное описание — на странице Скрипты.
| Вызов | Статус |
|---|---|
pm.environment.get(key), set(key, value), unset(key) | Работает |
pm.variables.get, set, unset, has, replaceIn, toObject | Работает: значение из pre-скрипта подставляется в {{переменные}} этого запроса и видно его post-скрипту, но в окружение не сохраняется; get при отсутствии локального значения берёт его из окружения |
pm.request.method, pm.request.url, pm.request.protocol | Работает; url — строка, а не объект, protocol — http, grpc, graphql или websocket |
pm.request.headers.add({ key, value }), upsert({ key, value }), remove(key) | Работает; регистр имени не важен, как в Postman, других методов у headers нет |
pm.response.code, pm.response.statusText, pm.response.text(), pm.response.json() | Работает в post-response скрипте; statusText — только gRPC, у HTTP и GraphQL там undefined. Есть и headers.get(name), headers.has(name), responseTime |
pm.response.status | Работает: текст статуса, «OK», как в Postman; у gRPC — имя статуса |
pm.test(name, fn) | Работает; результаты видны на вкладке Tests |
console.log, info, warn, error | Работает, вывод складывается в консоль запуска; объекты и массивы печатаются как JSON |
btoa(), atob() | Работает, так что pre-скрипт, собирающий заголовок Basic, переносится как есть; atob читает и base64url, например payload JWT |
pm.expect(...), pm.response.to.have.status(...) | Работает: chai 4.5, как в Postman; pm.response.to умеет status, header, body, jsonBody, json и классы статусов |
pm.collectionVariables.get/set/unset | Работает с переменными активного окружения |
pm.globals | Нет: вызов падает с ошибкой pm.globals is not supported in Tetiva; use pm.environment |
pm.sendRequest(), pm.setNextRequest() | Нет; pm.sendRequest падает с сообщением, что скриптам сеть недоступна |
require(), работа с файлами и сетью из скрипта | Нет — песочница закрыта, лимит выполнения 5 секунд |
Типичный тест из Postman работает без правок:
pm.test("status is 200", function () {
pm.response.to.have.status(200);
});
pm.environment.set("token", pm.response.json().access_token);Тест проваливается, если не выполнилось утверждение или функция бросила исключение. Для проваленного утверждения вкладка Tests показывает только его сообщение, как в Postman, а для другой ошибки — ещё и номер строки, где она возникла. Pre-скрипт, бросивший исключение вне pm.test, останавливает отправку, как и в Postman: панель ответа пишет Request not sent, текст ошибки и её строку. Post-скрипт с ошибкой сохраняет тесты, которые успели пройти.
Обратно в Postman#
Экспорт работает в ту же сторону: правый клик по коллекции → «Экспорт в Postman», файл сохраняется как <имя>.postman_collection.json в формате v2.1. Окружение выгружается из окна «Окружения» пунктом «Экспорт в Postman».
Скрипты и примеры ответов экспортируются. gRPC-запросы формат Postman не описывает, поэтому они пропускаются с предупреждением. У WebSocket-запроса в файл попадают адрес и заголовки, но не сообщения. Подробности — на странице Импорт и экспорт.