Uma coleção Postman rodando no CI exige Newman, e paralelização acima do tier gratuito exige o Postman Cloud. Migrar para a fixture request do Playwright significa o mesmo runner e o mesmo comando no CI (npx playwright test). O sistema de fixtures é o mesmo que seus testes de UI já usam.
A tradução conceitual
| Conceito Postman | Equivalente no Playwright |
|-----------------|--------------------------|
| Collection | Arquivo de teste |
| Request | request.get(), request.post(), etc. |
| Pre-request script | Hook beforeEach ou setup de fixture |
| Test script (pm.test) | Asserções expect() |
| Variável de environment | process.env.VARIABLE |
| Variável de collection | Fixture de teste ou constante compartilhada |
| Authorization > Bearer Token | Header em request.post({ headers: { Authorization: ... } }) |
| Newman (CLI runner) | npx playwright test |
Seu primeiro teste Postman reescrito no Playwright
Postman:// POST {{baseUrl}}/auth/login
// Body: { "email": "{{email}}", "password": "{{password}}" }
// Aba 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);
});import { test, expect } from '@playwright/test';
test('login retorna token de auth', 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);
});Mais limpo. Com controle de versão. Sem dependência de nuvem.
Compartilhando token de auth entre testes
No Postman, você define uma variável de environment em um teste e a usa no próximo. No Playwright, use uma fixture ou global setup.
Abordagem 1: Global setup (para toda a suite)// 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();
// Salva para os testes usarem
process.env.AUTH_TOKEN = token;
await ctx.dispose();
}// 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();
},
});Nos testes:
import { test } from '../fixtures/auth';
import { expect } from '@playwright/test';
test('buscar perfil do usuário (autenticado)', async ({ authedRequest }) => {
const response = await authedRequest.get('/user/profile');
expect(response.status()).toBe(200);
const user = await response.json();
expect(user.email).toBeDefined();
});Migrando coleções Postman
Para coleções Postman grandes, a estratégia de migração:
1. Exporte sua coleção como JSON do Postman
2. Identifique os caminhos críticos: nem toda requisição Postman precisa virar um teste Playwright. Foque nas que você roda como regressão
3. Traduza requisição por requisição, começando pelas mais simples (GET sem auth)
4. Agrupe por recurso: um arquivo por domínio de API (users.spec.ts, orders.spec.ts, payments.spec.ts)
Não tente traduzir automaticamente. O modelo de scripting do Postman não mapeia limpo para o Playwright, e a tradução mecânica produz testes ilegíveis. Reescreva.
O que o Postman faz melhor
O Postman ainda tem vantagens para certos fluxos de trabalho:
Testes exploratórios: a UI do Postman é mais rápida para requisições pontuais durante o desenvolvimento. Você não precisa escrever código para testar um endpoint. Documentação: coleções Postman podem gerar documentação de API. Testes Playwright não. Colaboração com não programadores: um product manager ou desenvolvedor que não está confortável com código consegue usar o Postman.A divisão prática: use o Postman para explorar e documentar APIs durante o desenvolvimento. Use o Playwright para suites de regressão que rodam no CI. Eles se complementam.
Rodando testes de API no CI
Depois de mover os testes para o Playwright, o CI é simples: igual a qualquer outra suite 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/Sem Newman. Sem Postman Cloud. Sem plano pago para CI. Só npx playwright test.