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);
});Playwright:
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();
}Abordagem 2: Fixture de auth (por teste)
// 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:
- Exporte sua coleção como JSON do Postman
- Identifique os caminhos críticos: nem toda requisição Postman precisa virar um teste Playwright. Foque nas que você roda como regressão
- Traduza requisição por requisição, começando pelas mais simples (GET sem auth)
- 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.
→ Veja também: Testes de API com o APIRequestContext do Playwright (Sem Postman) | Postman para Engenheiros QA: Do Primeiro Request à Suite de Testes de API | GitHub Actions para Testes Playwright: A Configuração Completa (2026)