Запуск 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.