Запуск Postman-коллекции в CI требует Newman, а параллелизация выше бесплатного лимита требует Postman Cloud. Переход на фикстуру request в Playwright означает тот же раннер, ту же CI-команду (npx playwright test) и ту же систему фикстур которую UI-тесты уже используют. Эта статья разбирает перевод концепций из Postman в Playwright, фикстуру аутентификации которая заменяет pm.environment.set(), и почему при миграции больших коллекций нужно переписывать, а не переводить автоматически.

Таблица соответствий концепций

| Концепция Postman | Аналог в Playwright |

|---|---|

| Collection | Тест-файл |

| Request | request.get(), request.post() и т.д. |

| Pre-request script | Хук beforeEach или настройка фикстуры |

| Test script (pm.test) | Ассерты expect() |

| Environment variable | process.env.VARIABLE |

| Collection variable | Тестовая фикстура или общая константа |

| Authorization → Bearer Token | Заголовок в request.post({ headers: { Authorization: ... } }) |

| Newman (CLI-раннер) | npx playwright test |

Первый тест: из Postman в Playwright

Postman

// POST {{baseUrl}}/auth/login
// Body: { "email": "{{email}}", "password": "{{password}}" }
// Вкладка Tests:
pm.test("Status is 200", function() {
    pm.response.to.have.status(200);
});
pm.test("Returns token", function() {
    const body = pm.response.json();
    pm.expect(body.token).to.be.a('string');
    pm.environment.set("authToken", body.token);
});

Playwright

import { test, expect } from '@playwright/test';

test('login returns auth token', async ({ request }) => {
  const response = await request.post(`${process.env.BASE_URL}/auth/login`, {
    data: {
      email: process.env.TEST_EMAIL,
      password: process.env.TEST_PASSWORD,
    },
  });

  expect(response.status()).toBe(200);

  const body = await response.json();
  expect(typeof body.token).toBe('string');
  expect(body.token.length).toBeGreaterThan(0);
});

Чище. Под версионным контролем. Без зависимости от облака.

Передача токена между тестами

В Postman переменная окружения устанавливается в одном тесте и используется в следующем. В Playwright для этого используй фикстуру или глобальный setup.

Вариант 1: Global setup (для всего сьюта)

// global-setup.ts
import { request } from '@playwright/test';
import fs from 'fs';

export default async function globalSetup() {
  const ctx = await request.newContext();
  const response = await ctx.post(`${process.env.BASE_URL}/auth/login`, {
    data: {
      email: process.env.TEST_EMAIL,
      password: process.env.TEST_PASSWORD,
    },
  });
  const { token } = await response.json();

  // Сохраняем для использования в тестах
  process.env.AUTH_TOKEN = token;
  await ctx.dispose();
}

Вариант 2: Фикстура аутентификации (для каждого теста)

// fixtures/auth.ts
import { test as base, APIRequestContext } from '@playwright/test';

type AuthFixtures = {
  authedRequest: APIRequestContext;
  authToken: string;
};

export const test = base.extend<AuthFixtures>({
  authToken: async ({ request }, use) => {
    const response = await request.post('/auth/login', {
      data: {
        email: process.env.TEST_EMAIL!,
        password: process.env.TEST_PASSWORD!,
      },
    });
    const { token } = await response.json();
    await use(token);
  },

  authedRequest: async ({ playwright, authToken }, use) => {
    const context = await playwright.request.newContext({
      baseURL: process.env.BASE_URL,
      extraHTTPHeaders: {
        Authorization: `Bearer ${authToken}`,
      },
    });
    await use(context);
    await context.dispose();
  },
});

Тесты:

import { test } from '../fixtures/auth';
import { expect } from '@playwright/test';

test('get user profile (authenticated)', async ({ authedRequest }) => {
  const response = await authedRequest.get('/user/profile');
  expect(response.status()).toBe(200);

  const user = await response.json();
  expect(user.email).toBeDefined();
});

Миграция Postman-коллекций

Стратегия миграции для больших коллекций:

1. Экспортируй коллекцию как JSON из Postman

2. Определи критические пути: не каждый Postman-запрос должен стать тестом Playwright. Фокус на тех что запускаешь как регрессию

3. Переводи запрос за запросом, начиная с самых простых (GET-запросы без авторизации)

4. Группируй по ресурсу: один файл на домен API (users.spec.ts, orders.spec.ts, payments.spec.ts)

Не пытайся переводить автоматически. Модель скриптинга Postman не ложится один в один на Playwright, и механический перевод даёт нечитаемые тесты. Переписывай.

Что Postman делает лучше

У Postman по-прежнему есть преимущества для определённых сценариев:

Исследование API. UI Postman быстрее для разовых запросов во время разработки. Не нужно писать код чтобы проверить endpoint. Документация. Из Postman-коллекций можно генерировать документацию API. Playwright-тесты этого не делают. Работа с людьми без опыта в коде. Продакт-менеджер или разработчик не готовый писать код может работать с Postman.

Практическое разделение: Postman для исследования и документирования API в процессе разработки. Playwright для регрессионных сьютов в CI. Они дополняют друг друга.

Запуск API-тестов в CI

После переноса тестов в Playwright CI прост: то же самое что для любого Playwright-сьюта.

# .github/workflows/api-tests.yml
jobs:
  api-tests:
    runs-on: ubuntu-latest
    env:
      BASE_URL: ${{ vars.STAGING_URL }}
      TEST_EMAIL: ${{ secrets.TEST_EMAIL }}
      TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npx playwright test tests/api/

Без Newman. Без Postman Cloud. Без платного плана для CI. Просто npx playwright test.

→ See also: API-тестирование с Playwright APIRequestContext (без Postman) | Postman для QA инженеров: от первого запроса до тест-сьюта API | GitHub Actions для тестов Playwright: полная настройка (2026)