Testes de Integração JavaScript com Docker: Nível Avançado
Testes de integração são uma etapa essencial no desenvolvimento de aplicações web modernas. Eles permitem verificar a interação entre diferentes componentes do sistema: banco de dados, cache, APIs externas e a própria aplicação. O Docker torna esse processo previsível, isolado e reproduzível. Neste artigo, exploraremos técnicas avançadas de testes de integração JavaScript (Node.js) usando Docker.
Por que usar Docker em testes de integração?
Os testes de integração tradicionais enfrentam problemas como:
- Diferenças nos ambientes de desenvolvimento, CI e produção.
- Poluição de dados em bancos de dados compartilhados.
- Dificuldade em executar dependências (Redis, PostgreSQL, Kafka).
O Docker resolve esses problemas fornecendo contêineres leves e isolados. Cada teste pode iniciar sua própria infraestrutura, destruindo-a após a conclusão. Isso garante resultados limpos e reproduzíveis.
Configuração do ambiente de teste com Docker Compose
Para testes avançados, usaremos um docker-compose.yml que descreve todos os serviços necessários para os testes: a própria aplicação, banco de dados, cache e servidores mock.
Exemplo de docker-compose.test.yml:
version: '3.8'services: app: build: . environment: - NODE_ENV=test - DB_HOST=postgres_test - REDIS_HOST=redis_test - MOCK_SERVER_URL=http://mock-server:8080 depends_on: - postgres_test - redis_test - mock-server command: ["npm", "run", "test:integration"]
postgres_test: image: postgres:15-alpine environment: POSTGRES_DB: testdb POSTGRES_USER: test POSTGRES_PASSWORD: test tmpfs: /var/lib/postgresql/data
redis_test: image: redis:7-alpine tmpfs: /data
mock-server: image: mockserver/mockserver:latest environment: MOCKSERVER_LOG_LEVEL: ERRORPontos-chave:
- tmpfs: os dados do banco de dados e Redis são armazenados na memória RAM, acelerando os testes.
- mock-server: serviço isolado para simular APIs externas.
- NODE_ENV=test: alterna a aplicação para a configuração de teste.
Escrevendo testes de integração com Testcontainers
A biblioteca testcontainers para Node.js permite gerenciar contêineres programaticamente diretamente dos testes. Isso oferece flexibilidade: você pode iniciar contêineres específicos para cada conjunto de testes.
Instalação:
npm install --save-dev testcontainersExemplo de teste com PostgreSQL:
const { GenericContainer } = require('testcontainers');const { Client } = require('pg');
describe('User Repository Integration Test', () => { let container; let client;
beforeAll(async () => { // Inicia o contêiner PostgreSQL container = await new GenericContainer('postgres:15-alpine') .withEnvironment({ POSTGRES_DB: 'testdb', POSTGRES_USER: 'test', POSTGRES_PASSWORD: 'test' }) .withExposedPorts(5432) .start();
// Conecta ao contêiner client = new Client({ host: container.getHost(), port: container.getMappedPort(5432), database: 'testdb', user: 'test', password: 'test' }); await client.connect();
// Cria o esquema await client.query(` CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) UNIQUE ) `); });
afterAll(async () => { await client.end(); await container.stop(); });
test('should insert and retrieve user', async () => { await client.query(