Testes que passam localmente mas falham no CI quase sempre não são bugs nos testes: são diferenças de ambiente entre versões do Node, builds do navegador ou dependências de sistema que faltam. O Docker resolve isso empacotando o Playwright, os binários dos navegadores e todas as dependências em uma única imagem. Ela roda de forma idêntica no seu laptop, na máquina de um colega e no CI.
Por que QA engineers precisam do Docker
Sem Docker:- Seus testes passam localmente com Node 20, falham no CI com Node 18
- A versão do Chrome no CI difere do laptop
- Variáveis de ambiente configuradas diferente em cada máquina
- Um novo membro do time passa um dia tentando fazer os testes rodar
- Os testes rodam no mesmo container localmente e no CI
- Todos usam as mesmas versões de Node, Chrome e dependências
- Novo membro do time:
docker compose up— testes rodando em 2 minutos
Conceitos básicos
Image
Uma image é um blueprint: um snapshot somente-leitura de um sistema de arquivos com software instalado. Pense como uma classe no código.
playwright/playwright:latest — imagem com Playwright e navegadores pré-instalados
node:20-alpine — Node.js 20 no Alpine Linux mínimoContainer
Um container é uma instância em execução de uma imagem. Vários containers podem rodar a partir da mesma imagem simultaneamente. Como criar vários objetos a partir da mesma classe.
Dockerfile
Instruções para construir uma imagem customizada. Você começa de uma imagem base e adiciona seus arquivos e configurações.
Docker Compose
Ferramenta para rodar vários containers juntos. Seus testes podem precisar de um servidor web e de um banco de dados rodando. O Compose inicia tudo com um único comando.
Seu primeiro Dockerfile para Playwright
O Playwright fornece imagens Docker oficiais com navegadores pré-instalados:
# Dockerfile
FROM mcr.microsoft.com/playwright:v1.44.0-jammy
# Diretório de trabalho dentro do container
WORKDIR /app
# Copia os arquivos de dependências primeiro (otimização de cache)
COPY package.json package-lock.json ./
# Instala as dependências Node
RUN npm ci
# Copia o restante do projeto
COPY . .
# Comando padrão: rodar todos os testes
CMD ["npx", "playwright", "test"]docker build -t my-playwright-tests .docker run my-playwright-testsChrome, Firefox e WebKit estão todos dentro do container. Nenhuma instalação de navegador necessária na máquina host.
Rodando testes com Docker
Execução básica
# Rodar todos os testes
docker run my-playwright-tests
# Rodar um arquivo específico
docker run my-playwright-tests npx playwright test tests/login.spec.ts
# Rodar com variável de ambiente
docker run -e BASE_URL=https://staging.myapp.com my-playwright-tests
# Montar diretório local (para ver os resultados dos testes)
docker run -v $(pwd)/playwright-report:/app/playwright-report my-playwright-testsSalvando resultados dos testes
O sistema de arquivos do container some quando ele para. Use volume mounts para salvar relatórios:
docker run \
-v $(pwd)/playwright-report:/app/playwright-report \
-v $(pwd)/test-results:/app/test-results \
my-playwright-testsO playwright-report/ aparece na sua máquina local após a execução.
Docker Compose para testes full stack
Testar de verdade frequentemente exige que a aplicação também esteja rodando. O Compose inicia tudo junto.
# docker-compose.yml
version: '3.8'
services:
# A aplicação sendo testada
app:
image: myapp:latest
ports:
- "3000:3000"
environment:
- NODE_ENV=test
- DATABASE_URL=postgresql://postgres:postgres@db:5432/testdb
depends_on:
db:
condition: service_healthy
# Banco de dados
db:
image: postgres:16
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: testdb
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
# Testes Playwright
tests:
build: .
environment:
- BASE_URL=http://app:3000
depends_on:
- app
volumes:
- ./playwright-report:/app/playwright-report
- ./test-results:/app/test-resultsdocker compose up --exit-code-from testsO que acontece nessa ordem:
- Inicia o banco de dados
- Espera ele estar healthy
- Inicia a aplicação
- Roda os testes
- Retorna o exit code dos testes (para o CI saber se passou ou falhou)
--exit-code-from tests faz o processo terminar com o exit code do container de testes.
Otimizando o Dockerfile
O cache de camadas torna os rebuilds rápidos. A regra principal: coloque o que muda raramente no topo.
FROM mcr.microsoft.com/playwright:v1.44.0-jammy
WORKDIR /app
# 1. Copia os arquivos de dependências (mudam raramente)
COPY package.json package-lock.json ./
# Esta camada fica em cache até o package.json mudar
RUN npm ci
# 2. Copia o restante (muda a cada commit)
COPY . .
CMD ["npx", "playwright", "test"]Se você só alterou arquivos de teste, o Docker reutiliza a camada do npm ci do cache. Tempo de build: segundos em vez de minutos.
Integração com CI/CD
GitHub Actions
# .github/workflows/playwright.yml
name: Playwright Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build test image
run: docker build -t playwright-tests .
- name: Run tests
run: |
docker run \
-v ${{ github.workspace }}/playwright-report:/app/playwright-report \
-e BASE_URL=${{ secrets.STAGING_URL }} \
playwright-tests
- name: Upload report
uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/GitLab CI
# .gitlab-ci.yml
test:
image: docker:latest
services:
- docker:dind
script:
- docker build -t tests .
- docker run
-v $(pwd)/playwright-report:/app/playwright-report
-e BASE_URL=$STAGING_URL
tests
artifacts:
when: always
paths:
- playwright-report/Comandos Docker úteis para QA
# Listar containers em execução
docker ps
# Listar todas as imagens
docker images
# Parar todos os containers em execução
docker stop $(docker ps -q)
# Remover todos os containers parados
docker container prune
# Remover imagens não utilizadas
docker image prune
# Acompanhar logs do container
docker logs -f <container-id>
# Abrir um shell dentro de um container em execução (ótimo para debug)
docker exec -it <container-id> /bin/bash
# Rodar um container de forma interativa
docker run -it my-playwright-tests /bin/bashDebugando dentro de um container
Quando os testes falham apenas no container:
# Iniciar o container com shell em vez dos testes
docker run -it my-playwright-tests /bin/bash
# Agora você está dentro do container
# Verificar o que está instalado
node --version
npx playwright --version
# Rodar testes manualmente
npx playwright test tests/login.spec.ts --headed --debug
# Verificar variáveis de ambiente
env | grep BASE_URLProblemas comuns:
BASE_URLapontando paralocalhost(funciona no host, falha no container: use o nome do serviço em vez disso)- Variáveis de ambiente faltando
- Permissões de arquivo (arquivos criados fora do container podem pertencer ao root dentro dele)
A imagem oficial do Playwright para Docker
# Baixar a imagem do Playwright
docker pull mcr.microsoft.com/playwright:v1.44.0-jammy
# Ver o que está dentro
docker run -it mcr.microsoft.com/playwright:v1.44.0-jammy /bin/bash
# Verificar navegadores instalados
npx playwright install --listTags importantes:
v1.44.0-jammy: versão específica do Playwright no Ubuntu 22.04 (Jammy)latest: versão mais recente (pode quebrar quando o Playwright atualiza)- Sempre fixe em uma versão específica em produção
Resumo
| Conceito | O que é |
|----------|---------|
| Image | Blueprint com software pré-instalado |
| Container | Instância em execução de uma imagem |
| Dockerfile | Instruções para construir uma imagem customizada |
| Docker Compose | Roda vários containers juntos |
| Volume mount | Compartilha arquivos entre host e container |
Para o Playwright especificamente:
1. Use mcr.microsoft.com/playwright como imagem base — navegadores incluídos
2. Monte os diretórios de relatório para os resultados sobreviverem ao container parar
3. Use o Compose para iniciar sua aplicação e os testes juntos
4. Fixe as versões das imagens: latest causa quebras inesperadas
Docker transforma "funciona na minha máquina" em "funciona em qualquer lugar". Para QA, isso significa que os testes estão realmente testando o software, não brigando com diferenças de ambiente.
→ Veja também: Docker para Testadores: Executando Playwright em Contêineres | CI/CD para QA: GitHub Actions, Jenkins e GitLab Comparados | GitHub Actions para Testes Playwright: A Configuração Completa (2026)