Testes de Integração JavaScript com Docker: Do A ao Z
\n\nNo desenvolvimento web moderno, a qualidade do código não é apenas uma métrica, mas a chave para a estabilidade do produto. O Teste de Integração (Integration Testing) ocupa um lugar fundamental na pirâmide de testes, permitindo verificar a interação entre diferentes módulos, bancos de dados, APIs externas e serviços. No entanto, configurar ambientes isolados e reproduzíveis para esses testes muitas vezes se torna uma dor de cabeça. É aqui que o Docker entra em cena — uma ferramenta de conteinerização ideal para criar ambientes de teste limpos e repetíveis.
\n\nNeste artigo, vamos abordar como organizar testes de integração para aplicações JavaScript (Node.js) usando Docker. Você aprenderá como subir um banco de dados de teste, iniciar dependências em contêineres e escrever testes eficientes que podem ser facilmente integrados em um pipeline de CI/CD.
\n\n1. Por que o Docker é ideal para testes de integração?
\n\nA abordagem tradicional para testes de integração frequentemente exige a configuração manual do ambiente em cada máquina de desenvolvedor ou servidor de CI. Isso leva ao problema "funciona na minha máquina". O Docker resolve esse problema de forma radical:
\n\n- \n
- Isolamento: Cada teste é executado em um contêiner limpo, eliminando a influência de efeitos colaterais de execuções anteriores. \n
- Reprodutibilidade: O mesmo ambiente (versão do Node.js, bancos de dados, bibliotecas do sistema) funciona garantidamente em qualquer lugar: na máquina local do desenvolvedor, no servidor de build e em produção. \n
- Gerenciamento de dependências: Você pode facilmente subir infraestruturas complexas (Redis, PostgreSQL, RabbitMQ) com um único comando
docker-compose up -d. \n - Velocidade: Os contêineres são iniciados em segundos, ao contrário das máquinas virtuais. O Docker armazena camadas em cache, acelerando builds repetidos. \n
No contexto do Node.js, o Docker permite "simular" serviços externos sem sair do ambiente de desenvolvimento. Em vez de acessar uma API de produção, você sobe um contêiner de teste com, por exemplo, json-server ou testcontainers.
2. Configuração do projeto Node.js para testes
\n\nSuponha que temos uma aplicação Express simples que salva usuários no PostgreSQL. Nossa tarefa é testar o endpoint POST /users.
Estrutura do projeto:
\n\nproject/\n├── src/\n│ ├── app.js\n│ ├── db.js\n│ └── routes/\n│ └── users.js\n├── test/\n│ └── integration/\n│ └── users.test.js\n├── docker-compose.test.yml\n├── Dockerfile\n├── package.json\n└── .env.test\n\n\n
Para os testes, usaremos um stack popular: Mocha (framework) + Chai (biblioteca de asserções) + Supertest (teste HTTP).
\n\nInstale as dependências:
\nnpm install --save-dev mocha chai supertest\n\nO arquivo package.json deve conter um script para executar os testes:
{\n "scripts": {\n "test:integration": "mocha test/integration/**/*.test.js --timeout 10000"\n }\n}\n\n3. Criação do ambiente Docker para testes
\n\nO arquivo chave é o docker-compose.test.yml. Ele descreve os serviços necessários para os testes.
version: '3.8'\n\nservices:\n app-test:\n build:\n context: .\n dockerfile: Dockerfile\n environment:\n - NODE_ENV=test\n - DB_HOST=postgres-test\n - DB_PORT=5432\n - DB_USER=test_user\n - DB_PASSWORD=test_pass\n - DB_NAME=test_db\n depends_on:\n postgres-test:\n condition: service_healthy\n command: ["npm", "run", "test:integration"]\n\n postgres-test:\n image: postgres:15-alpine\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_