Всем привет!

Хочу поделиться практическим кейсом: как быстро запускать свои тесты из Postman, не только целые коллекции, но и отдельные папки внутри коллекций.

Если надоело открывать Postman и вручную запускать каждую коллекцию или проверять эндпоинты по очереди, то решение есть — Newman, терминальный раннер от команды Postman. Его функционал позволяет:

  • автоматически выгружать все коллекции и окружения,

  • запускать их прямо из командной строки,

  • получать отчёты для анализа или интеграции в CI/CD.

В этом кейсе покажу путь от экспорта коллекций до автоматического прогона тестов через Newman CLI.


Что понадобится

  • Node.js и npm.

  • Аккаунт в Postman и API Key (чтобы выгружать коллекции/окружения через Postman API).

  • Powershell (или другой терминал) — я показываю примеры на PowerShell, но команды легко адаптируются для bash (можно переписать скрипты через любую нейронку).


Как получить API Key в Postman

  1. Открой Postman Web или Desktop.

  2. Перейди в Settings → API Keys.

  3. Нажми Generate API Key, введи имя и скопируй ключ.

Важно: не храните ключ в публичных репозиториях. В CI используйте секреты (GitHub Secrets, GitLab CI variables и т.п.).

Установка Newman

В терминале проверь, что Node.js и npm установлены. Если нет, то нужно скачать по ссылке https://nodejs.org/en/download и установить.

node -v
npm -v

Установи Newman:

npm install -g newman 

Проверь установку:

newman -v

Скрипт: выгрузка коллекций и окружений из Postman

Ниже — пример PowerShell-скрипта export-postman.ps1, который получает все коллекции и окружения через Postman API и сохраняет их в папку postman_output.

# =============================
# Скрипт для экспорта всех коллекций и окружений из Postman
# Использует Postman API Key
# =============================

param(
    [string]$apiKey = ""  # API ключ Postman. Можно передать через параметр при запуске: -apiKey "PMAK-..."
)

# Проверяем, что ключ передан
if (-not $apiKey) {
    Write-Error "Передайте API key через параметр -apiKey или задайте переменную \$apiKey внутри скрипта."
    exit 1
}

# Заголовки для запросов к API Postman
$headers = @{ "X-Api-Key" = $apiKey }

# =============================
# Создаем папку postman_output для вывода коллекций и окружений
# =============================
$outputDir = Join-Path -Path (Get-Location) -ChildPath "postman_output"
if (-not (Test-Path $outputDir)) { 
    New-Item -ItemType Directory -Path $outputDir | Out-Null
    Write-Host "Created output directory: $outputDir"
}

# =============================
# Получение списка всех коллекций
# =============================
$collectionsList = Invoke-RestMethod -Uri "https://api.getpostman.com/collections" -Headers $headers -Method Get

foreach ($col in $collectionsList.collections) {
    $uid = $col.uid
    # Очищаем имя файла от недопустимых символов для файловой системы
    $fileName = "$($col.name).json" -replace '[\\/:*?"<>|]', ''
    
    # Получаем полную коллекцию по UID
    $collection = Invoke-RestMethod -Uri "https://api.getpostman.com/collections/$uid" -Headers $headers -Method Get
    
    # Сохраняем коллекцию в формате JSON
    $collection | ConvertTo-Json -Depth 20 | Out-File -FilePath (Join-Path $outputDir $fileName)
    Write-Host "Saved collection: $fileName"
}

# =============================
# Получение всех окружений
# =============================
$envList = Invoke-RestMethod -Uri "https://api.getpostman.com/environments" -Headers $headers -Method Get

foreach ($env in $envList.environments) {
    $uid = $env.uid
    # Очищаем имя файла от недопустимых символов
    $fileName = "$($env.name).json" -replace '[\\/:*?"<>|]', ''
    
    # Получаем полное окружение по UID
    $environment = Invoke-RestMethod -Uri "https://api.getpostman.com/environments/$uid" -Headers $headers -Method Get
    
    # Сохраняем окружение в формате JSON
    $environment | ConvertTo-Json -Depth 20 | Out-File -FilePath (Join-Path $outputDir $fileName)
    Write-Host "Saved environment: $fileName"
}

# =============================
# Финальное сообщение
# =============================
Write-Host "Export finished. Files are in: $outputDir"

Пояснения:

  • Скрипт использует заголовок X-Api-Key для авторизации (Postman API принимает ключ в этом заголовке).

Запуск:
Для работы приведенной ниже команды нужно находиться в той же папке, что и запускаемый скрипт.

.\export-postman.ps1 -apiKey "ВАШ_КЛЮЧ_ЗДЕСЬ"

Далее в терминале вы увидите отчет о сохранении коллекций и окружений. Также появится папка postman_output с .json-файлами коллекций и окружений.

Форма отчета
Форма отчета
Структура папок и файлов в примере
Структура папок и файлов в примере

Запуск тестов через Newman

Создадим run_tests.ps1, который прогоняет все коллекции или выбранные папки с запросами. Нужно только указать свои названия jsonфайлов с коллекциями и окружениями.

# =======================================================
# Универсальный запуск Postman-коллекций через Newman
# Поддержка папок (folder)
# Скрипт продолжает выполнение при ошибках
# =======================================================

# Папка, где лежат выгруженные коллекции и .json окружения
$COLLECTIONS_DIR = "postman_output"

# Общий файл окружения
$envFile = Join-Path $COLLECTIONS_DIR "Test_env.json"

# Проверяем наличие файла окружения
if (-Not (Test-Path $envFile)) {
    Write-Host "Файл окружения не найден: $envFile" -ForegroundColor Red
    exit 1
}

# =======================================================
# Настройка коллекций и задач
# Каждая коллекция содержит:
#   file  = путь к JSON-файлу коллекции
#   tasks = список задач внутри коллекции
#           каждая задача может запускать:
#              - всю коллекцию (если folder = "")
#              - конкретную папку (если folder != "")
# =======================================================
$collectionsToRun = @(
    @{ 
        file  = Join-Path $COLLECTIONS_DIR "user_authorization.json"
        tasks = @( 
            # Прогон всей коллекции user_authorization
            @{ folder = "" }  
        )
    },
    @{ 
        file  = Join-Path $COLLECTIONS_DIR "shop.json"
        tasks = @(
            # Прогон папки "orders" внутри коллекции shop
            @{ folder = "orders" }
        )
    }
)

# =======================================================
# Проверка существования файлов коллекций
# =======================================================
foreach ($item in $collectionsToRun) {
    if (-Not (Test-Path $item.file)) {
        Write-Host "Файл коллекции не найден: $($item.file)" -ForegroundColor Red
        exit 1
    }
}

# =======================================================
# Определяем путь к Newman
# Сначала ищем локально в node_modules, потом глобально
# =======================================================
$localNewman = Join-Path $PSScriptRoot "node_modules\.bin\newman.cmd"
if (Test-Path $localNewman) {
    $newmanCmd = $localNewman
} else {
    # предполагаем, что глобально установлен
    $newmanCmd = "newman"
}

# =======================================================
# Основной цикл по коллекциям и задачам
# =======================================================
$hasErrors = $false

foreach ($item in $collectionsToRun) {
    $colPath = $item.file

    foreach ($task in $item.tasks) {
        $folder = $task.folder

        # Формируем аргументы для Newman
        $args = @("run", $colPath, "-e", $envFile)
        if ($folder -ne "") {
            # Добавляем флаг --folder, если указан
            $args += @("--folder", $folder)
        }

        # Логируем текущую задачу
        Write-Host "=== Running: $colPath | Folder: '$folder' ===" -ForegroundColor Cyan

        try {
            # Выполняем Newman
            & $newmanCmd @args

            # Проверка кода возврата
            if ($LASTEXITCODE -ne 0) {
                Write-Host "Ошибка при выполнении задачи." -ForegroundColor Red
                $hasErrors = $true  # отмечаем ошибку, но продолжаем
            } else {
                Write-Host "Задача выполнена успешно." -ForegroundColor Green
            }
        }
        catch {
            Write-Host "Ошибка при запуске Newman: $_" -ForegroundColor Red
            $hasErrors = $true
        }
    }
}

# =======================================================
# Финальное сообщение
# =======================================================
if ($hasErrors) {
    Write-Host "---- Завершено с ошибками ----" -ForegroundColor Yellow
    exit 1
} else {
    Write-Host "---- Все задачи выполнены успешно ----" -ForegroundColor Green
    exit 0
}

После запуска тесты прогоняются в консоли и выводится результат по каждой коллекции:

Пример терминального отчета
Пример терминального отчета

Итог

Использование Postman + Newman позволяет автоматизировать процесс ручного запуска тестов. Также можно с его помощью:

  • получать удобные отчёты для анализа и хранения,

  • интегрировать тесты в CI/CD, чтобы они работали автоматически при каждом коммите.

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

Комментарии (0)