O Playwright executa testes em paralelo por padrão, usando múltiplos workers — processos isolados que rodam testes simultaneamente.
Por padrão, o Playwright cria um número de workers igual à metade dos núcleos da CPU. Cada worker tem seu próprio contexto de browser.
CPU: 8 núcleos → 4 workers em paralelo
// playwright.config.ts
export default defineConfig({
// Número fixo de workers
workers: 4,
// Ou percentual da CPU
workers: '50%',
// Para CI (evita sobrecarga no servidor)
workers: process.env.CI ? 1 : undefined,
});Por padrão, testes dentro de um mesmo arquivo rodam em série. Com fullyParallel, todos rodam em paralelo:
export default defineConfig({
fullyParallel: true, // recomendado quando os testes são independentes
});Ou por arquivo/describe:
test.describe.configure({ mode: 'parallel' });
test('teste 1', async ({ page }) => { /* ... */ });
test('teste 2', async ({ page }) => { /* ... */ });
test('teste 3', async ({ page }) => { /* ... */ });
// Os 3 rodam em paraleloPara distribuir testes entre múltiplas máquinas no CI:
# Máquina 1: roda 1/3 dos testes
npx playwright test --shard=1/3
# Máquina 2: roda 2/3 dos testes
npx playwright test --shard=2/3
# Máquina 3: roda 3/3 dos testes
npx playwright test --shard=3/3jobs:
testes:
strategy:
matrix:
shard: [1, 2, 3]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npx playwright install --with-deps
- name: Executar shard ${{ matrix.shard }}
run: npx playwright test --shard=${{ matrix.shard }}/3
- uses: actions/upload-artifact@v4
if: always()
with:
name: resultados-shard-${{ matrix.shard }}
path: test-results/// Quando os testes precisam rodar em ordem específica
test.describe.configure({ mode: 'serial' });Ou para um projeto inteiro:
export default defineConfig({
fullyParallel: false,
workers: 1,
});Para que testes paralelos funcionem bem:
- Testes independentes: cada teste cria e limpa seus próprios dados
- Sem estado compartilhado entre testes (sem variáveis globais mutáveis)
- Dados únicos: use timestamps ou UUIDs para criar dados únicos
- Contextos isolados: cada teste usa sua própria
page(garantido pelo Playwright)
// Bom: dados únicos por teste
test('criar usuário', async ({ page, request }) => {
const email = `usuario_${Date.now()}@teste.com`;
await request.post('/api/usuarios', { data: { email } });
// ...
});Ir para: CI/CD