Lesson 21 of 26

Урок 21 — Postman: полное руководство для QA

Название: Postman — инструмент №1 для тестирования API
Описание: Полное руководство по Postman для QA-инженера: интерфейс, Collections, Environment, Variables, автоматические тесты, Pre-request Scripts, newman для CI/CD.
Почему это важно для QA: Postman — это стандарт в индустрии. Без его знания невозможно тестировать API. Он используется повсеместно — от стартапов до крупных корпораций.


1. Что такое Postman

Postman — это инструмент для тестирования, разработки и документирования API. Позволяет отправлять HTTP-запросы, проверять ответы и автоматизировать API-тесты без написания кода.

Что можно делать в Postman

  • Отправлять любые HTTP-запросы (GET, POST, PUT, PATCH, DELETE)
  • Проверять ответы (статус код, тело, заголовки)
  • Писать автоматические тесты на JavaScript
  • Организовывать запросы в Collections
  • Управлять окружениями (dev, staging, production)
  • Запускать тесты в CI/CD через newman
  • Мокировать API (Mock Server)

2. Интерфейс Postman

┌─────────────────────────────────────────────────────────┐
│ [Collections] [Environments] [History]                   │ ← левая панель
├─────────────────────────────────────────────────────────┤
│ GET ▼ │ https://api.example.com/users         │ [Send]  │ ← строка запроса
├─────────────────────────────────────────────────────────┤
│ Params │ Authorization │ Headers │ Body │ Pre-request    │ ← вкладки запроса
│        │               │         │      │ Scripts │ Tests│
├─────────────────────────────────────────────────────────┤
│ Status: 200 OK   Time: 234 ms   Size: 1.2 KB            │ ← статус ответа
├─────────────────────────────────────────────────────────┤
│ Body │ Cookies │ Headers │ Test Results                  │ ← вкладки ответа
│ { "id": 1, "name": "John" }                             │
└─────────────────────────────────────────────────────────┘

3. Первый запрос

Шаги для GET-запроса

1. Открыть Postman → New → HTTP Request
2. Выбрать метод: GET
3. Ввести URL: https://jsonplaceholder.typicode.com/users/1
4. Нажать Send
5. Получить ответ:
{
  "id": 1,
  "name": "Leanne Graham",
  "username": "Bret",
  "email": "Sincere@april.biz"
}

Шаги для POST-запроса

1. Выбрать метод: POST
2. URL: https://jsonplaceholder.typicode.com/posts
3. Вкладка Body → выбрать "raw" → JSON
4. Ввести тело:
{
  "title": "Тестовый пост",
  "body": "Содержимое поста",
  "userId": 1
}
5. Send → ожидаем 201 Created

4. Collections — организация запросов

Collection — это папка для группировки связанных API-запросов.

Структура Collection

📁 Shop API (Collection)
├── 📁 Auth
│   ├── POST Login
│   ├── POST Logout
│   └── POST Refresh Token
├── 📁 Products
│   ├── GET All Products
│   ├── GET Product by ID
│   ├── POST Create Product
│   ├── PUT Update Product
│   └── DELETE Product
├── 📁 Orders
│   ├── GET My Orders
│   ├── POST Create Order
│   └── PATCH Cancel Order
└── 📁 Users
    ├── GET User Profile
    └── PUT Update Profile

Создание Collection

1. Left sidebar → Collections → + (New Collection)
2. Дать название: "Shop API"
3. Добавить описание: "API для интернет-магазина"
4. Save → внутри создать папки и запросы

5. Environments и Variables

Проблема без Environments

URL для dev:     http://localhost:3000/api/users
URL для staging: https://staging.shop.com/api/users
URL для prod:    https://shop.com/api/users

Без Environments: нужно менять URL в каждом запросе вручную
С Environments:  меняем одну переменную и все запросы обновляются

Создание Environment

1. Environments → + (New Environment)
2. Название: "Staging"
3. Добавить переменные:
   Variable        Initial Value           Current Value
   baseUrl         https://staging.shop    https://staging.shop
   authToken       (пусто)                 eyJhbGciOiJIUzI1NiJ9...
   userId          (пусто)                 42

Использование переменных в запросах

URL: {{baseUrl}}/api/users/{{userId}}

Header:
Authorization: Bearer {{authToken}}

В Body:
{
  "email": "{{testEmail}}"
}

Виды переменных в Postman

ОбластьСинтаксисВидимость
Global{{var}}Весь Postman
Environment{{var}}Текущий Environment
Collection{{var}}Вся Collection
Local (в скриптах)pm.variables.get("var")Текущий запрос

6. Tests — автоматические проверки

Во вкладке Tests пишем JavaScript для автоматической проверки ответа.

Базовые проверки

javascriptjavascript
// Проверка статус кода
pm.test("Статус код 200", () => {
  pm.response.to.have.status(200);
});

// Проверка времени ответа
pm.test("Время ответа < 500мс", () => {
  pm.expect(pm.response.responseTime).to.be.below(500);
});

// Проверка структуры ответа
pm.test("Ответ содержит поле id", () => {
  const body = pm.response.json();
  pm.expect(body).to.have.property("id");
  pm.expect(body.id).to.be.a("number");
});

// Проверка наличия заголовка
pm.test("Заголовок Content-Type: application/json", () => {
  pm.response.to.have.header("Content-Type");
  pm.expect(pm.response.headers.get("Content-Type")).to.include("application/json");
});

Продвинутые проверки

javascriptjavascript
// Проверка массива в ответе
pm.test("Список пользователей не пустой", () => {
  const users = pm.response.json();
  pm.expect(users).to.be.an("array");
  pm.expect(users.length).to.be.greaterThan(0);
});

// Проверка структуры каждого элемента
pm.test("Каждый пользователь имеет id, name, email", () => {
  const users = pm.response.json();
  users.forEach((user) => {
    pm.expect(user).to.have.keys(["id", "name", "email"]);
  });
});

// Сохранение данных из ответа в переменную для следующего запроса
pm.test("Токен получен и сохранён", () => {
  const body = pm.response.json();
  pm.expect(body.token).to.be.a("string");
  pm.environment.set("authToken", body.token);  // сохраняем в Environment
});

7. Pre-request Scripts

Код, выполняемый до отправки запроса. Полезен для подготовки данных.

javascriptjavascript
// Установка текущего времени
const timestamp = new Date().toISOString();
pm.environment.set("currentTimestamp", timestamp);

// Генерация уникального email для теста
const randomNum = Math.floor(Math.random() * 10000);
pm.environment.set("testEmail", `test_${randomNum}@test.com`);

// Динамическое вычисление даты (через 7 дней)
const futureDate = new Date();
futureDate.setDate(futureDate.getDate() + 7);
pm.environment.set("futureDate", futureDate.toISOString().split("T")[0]);

8. Authorization — настройка авторизации

Bearer Token

Authorization вкладка → Bearer Token → вставить {{authToken}}

Basic Auth

Authorization → Basic Auth → Username: admin, Password: secret
Postman автоматически кодирует в Base64 и добавляет заголовок:
Authorization: Basic YWRtaW46c2VjcmV0

Авторизация на уровне Collection

1. Нажать на Collection → Edit
2. Authorization → Bearer Token → {{authToken}}
3. Все запросы в Collection наследуют авторизацию
4. Отдельный запрос может переопределить или использовать "Inherit from parent"

9. Collection Runner

Запускает все запросы в Collection последовательно.

Как запустить

1. Collection → Run collection (кнопка ▶)
2. Выбрать Environment
3. Задать количество итераций (1, 10, 100)
4. Delay между запросами (опционально)
5. Run → видим результаты всех тестов

Data Files — тестирование с разными данными

javascriptjavascript
// data.csv:
email,password,expectedStatus
valid@test.com,ValidPass123,200
invalid@test.com,WrongPass,401
,ValidPass123,400
valid@test.com,,400

В Body:

jsonjson
{
  "email": "{{email}}",
  "password": "{{password}}"
}

В Tests:

javascriptjavascript
pm.test(`Статус ${pm.iterationData.get("expectedStatus")}`, () => {
  pm.response.to.have.status(parseInt(pm.iterationData.get("expectedStatus")));
});

10. Newman — Postman в командной строке

Newman — CLI-инструмент для запуска Postman Collections в терминале и CI/CD.

Установка

bashbash
npm install -g newman
npm install -g newman-reporter-htmlextra  # для HTML-отчётов

Запуск Collection

bashbash
# Простой запуск
newman run "Shop API.postman_collection.json"

# С окружением
newman run "Shop API.postman_collection.json" \
  -e "Staging.postman_environment.json"

# С HTML-отчётом
newman run "Shop API.postman_collection.json" \
  -e "Staging.postman_environment.json" \
  -r htmlextra \
  --reporter-htmlextra-export ./reports/api-report.html

# С данными для итераций
newman run "Shop API.postman_collection.json" \
  -d test-data.csv \
  --iteration-count 3

Интеграция в GitHub Actions

yamlyaml
# .github/workflows/api-tests.yml
name: API Tests
on: [push, pull_request]

jobs:
  api-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install Newman
        run: npm install -g newman newman-reporter-htmlextra
      - name: Run API Tests
        run: |
          newman run tests/Shop API.postman_collection.json \
            -e tests/Staging.postman_environment.json \
            -r htmlextra \
            --reporter-htmlextra-export reports/api-report.html
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: api-report
          path: reports/api-report.html

11. Mock Server в Postman

Позволяет создать фиктивный сервер для тестирования frontend без готового backend.

1. Collection → ... → Mock Collection
2. Задать имя: "Shop API Mock"
3. Postman создаёт URL: https://xxxxxxxx.mock.pstmn.io

Для каждого запроса добавить пример ответа (Example):
GET /users → 200 OK + { "users": [...] }
POST /users → 201 Created + { "id": 123 }

12. Полезные встроенные переменные

javascriptjavascript
// Динамические значения (используются в Body)
{{$guid}}           → случайный UUID
{{$timestamp}}      → текущий Unix timestamp
{{$randomEmail}}    → случайный email
{{$randomFirstName}}→ случайное имя
{{$randomInt}}      → случайное целое число
{{$randomBoolean}}  → true или false

Итог

POSTMAN — инструмент для API тестирования

Основы:
├── HTTP-запросы: GET, POST, PUT, PATCH, DELETE
├── Collections: организация запросов по папкам
├── Environments: переменные для разных окружений

Автоматизация:
├── Tests (pm.test): автоматические проверки ответов
├── Pre-request Scripts: подготовка данных
├── Collection Runner: прогон всех тестов
└── Newman: запуск в CLI и CI/CD

Продвинутое:
├── Data Files: тестирование с разными данными
├── Mock Server: имитация API
└── GitHub Actions: интеграция в пайплайн