Testes em JavaScript: unit, integration, e2e do A ao Z

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Testes em JavaScript: de testes unitários a testes de ponta a ponta

\n\n

Testes de qualidade são uma parte essencial do desenvolvimento profissional em JavaScript. Neste artigo, abordaremos três níveis principais de teste: testes unitários (unit), testes de integração (integration) e testes de ponta a ponta (e2e). Você aprenderá quais ferramentas usar, como escrever testes em Node.js e como construir uma estratégia de teste eficaz.

\n\n

1. Testes unitários: a base da pirâmide de testes

\n\n

Testes unitários verificam módulos isolados — funções, classes ou métodos individuais. A regra principal: o código testado não deve depender de recursos externos (banco de dados, API, sistema de arquivos).

\n\n

Ferramentas para testes unitários

\n
    \n
  • Jest — o framework mais popular do Facebook. Inclui mocks, snapshots e cobertura de código nativamente.
  • \n
  • Mocha + Chai — uma combinação flexível para quem gosta de configurar tudo manualmente.
  • \n
  • Vitest — um análogo moderno do Jest, otimizado para projetos Vite.
  • \n
\n\n
// Exemplo de teste unitário com Jest\nconst { calculateDiscount } = require('./pricing');\n\ndescribe('calculateDiscount', () => {\n  test('retorna 10% de desconto para valores > 1000', () => {\n    const result = calculateDiscount(1500);\n    expect(result).toBe(1350);\n  });\n\n  test('não aplica desconto para valores <= 1000', () => {\n    const result = calculateDiscount(500);\n    expect(result).toBe(500);\n  });\n\n  test('lida com o valor limite de 1000', () => {\n    const result = calculateDiscount(1000);\n    expect(result).toBe(1000);\n  });\n});
\n\n

Melhores práticas de testes unitários

\n
    \n
  • Teste um comportamento por vez (um assert por teste).
  • \n
  • Use nomes de teste descritivos (given/when/then).
  • \n
  • Evite testar métodos privados — teste a interface pública.
  • \n
  • Mantenha a cobertura de código entre 70-80%.
  • \n
\n\n

2. Testes de integração: verificando a interação entre componentes

\n\n

Testes de integração verificam como diferentes módulos funcionam juntos. No contexto do Node.js, isso geralmente significa testar com um banco de dados real, sistema de arquivos ou APIs externas.

\n\n

Cenários típicos de testes de integração

\n
    \n
  • Interação do controller com a camada de serviço e o banco de dados.
  • \n
  • Verificação de middleware e rotas do Express/Koa.
  • \n
  • Teste de repositórios com um banco de dados de teste (SQLite em memória ou PostgreSQL no Docker).
  • \n
\n\n
// Exemplo de teste de integração com Supertest e Jest\nconst request = require('supertest');\nconst app = require('../app');\nconst { createTestUser, cleanDatabase } = require('./helpers');\n\nbeforeEach(async () => {\n  await cleanDatabase();\n});\n\ndescribe('POST /api/users', () => {\n  test('cria um usuário e retorna 201', async () => {\n    const response = await request(app)\n      .post('/api/users')\n      .send({ name: 'João', email: 'joao@teste.com' });\n\n    expect(response.status).toBe(201);\n    expect(response.body).toHaveProperty('id');\n    expect(response.body.name).toBe('João');\n  });\n\n  test('retorna 400 ao duplicar email', async () => {\n    await createTestUser({ email: 'joao@teste.com' });\n\n    const response = await request(app)\n      .post('/api/users')\n      .send({ name: 'Pedro', email: 'joao@teste.com' });\n\n    expect(response.status).toBe(400);\n    expect(response.body.error).toBe('Email já está em uso');\n  });\n});
\n\n

Configuração da infraestrutura de teste

\n
    \n
  • Docker Compose — para levantar serviços de teste (banco de dados, Redis).
  • \n
  • Testcontainers — gerenciamento programático de contêineres a partir dos testes.
  • \n
  • Banco de dados em memória (ex.: mongodb-memory-server) — para testes rápidos sem dependências externas.
  • \n
\n\n

3. Testes E2E: verificando o sistema como um todo

Blogs

Book Recommendations