Leodario.com

Leodario.com – Tudo sobre Tecnologia

Aula 71 – API JavaScript, Node.js e Express – Testing Fundamentals – Unit vs Integration vs E2E

Imagem destacada da aula de API

Introdução (3 min)

Imagine uma fábrica de carros. Para garantir a qualidade do produto final, inspecionamos cada parte individualmente (motor, freios, etc.), depois verificamos se todas as partes funcionam juntas harmoniosamente e, por fim, testamos o carro completo na estrada. Testar APIs é semelhante: verificamos componentes isolados, a interação entre eles e o sistema como um todo.

Testes são essenciais para APIs modernas, pois garantem confiabilidade, facilitam a manutenção e permitem evoluções seguras. Nesta aula, você compreenderá os diferentes níveis de teste: unitário, de integração e end-to-end (E2E), e como aplicá-los em Node.js/Express.

No contexto do Node.js/Express, esses testes se integram perfeitamente ao fluxo de desenvolvimento, assegurando a qualidade da sua API desde o início.

Conceito Fundamental (7 min)

Testes unitários verificam unidades isoladas de código, como funções individuais, garantindo que cada parte funcione corretamente de forma independente. A terminologia comum inclui mocks e stubs para simular dependências externas. Imagine testar apenas o motor do carro, sem o resto do veículo.

Testes de integração avaliam a interação entre diferentes módulos ou componentes da sua API. Verificamos se as partes trabalham juntas como esperado, por exemplo, se o motor e a transmissão funcionam em sincronia. Em APIs, isso pode envolver testar a comunicação entre diferentes endpoints ou com um banco de dados.

Testes E2E (End-to-End) simulam o fluxo completo de uma requisição, desde a interface do usuário até o banco de dados e de volta. É como testar o carro completo em condições reais de uso. As ferramentas populares incluem Cypress, Puppeteer e Selenium.

Cada tipo de teste possui vantagens e desvantagens. Testes unitários são rápidos e fáceis de implementar, mas podem não capturar erros de integração. Testes E2E são mais abrangentes, porém mais lentos e complexos. A combinação estratégica dos três tipos é vital para uma cobertura de teste eficaz.

Implementação Prática (10 min)

// server.js
const express = require('express');
const app = express();
const port = 3000;

// Função a ser testada (unidade) function somar(a, b) { return a + b; }

app.get('/soma', (req, res) => { const num1 = parseInt(req.query.num1); const num2 = parseInt(req.query.num2);

// Validação robusta dos parâmetros de entrada. if (isNaN(num1) || isNaN(num2)) { return res.status(400).json({ error: 'Parâmetros inválidos' }); }

const resultado = somar(num1, num2); res.json({ resultado }); });

// Error handling para capturar exceções não tratadas app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ error: 'Erro interno do servidor' }); });

app.listen(port, () => { console.log(Servidor rodando em http://localhost:${port}); });

// testes.js (exemplo com Jest) const { somar } = require('./server');

describe('Testes Unitários', () => { it('Soma dois números corretamente', () => { expect(somar(2, 3)).toBe(5); });

it('Lida com números negativos', () => { expect(somar(-2, 3)).toBe(1); }); });


Instalação das dependências (Jest)

📚 Informações da Aula

Curso: API Completo - Node.js & Express

Tempo estimado: 25 minutos

Pré-requisitos: JavaScript básico

npm install --save-dev jest

Execução dos testes

npm test

Este exemplo demonstra um teste unitário simples para a função somar. A configuração para HostGator Plano M seria idêntica, garantindo compatibilidade total. Observe o error handling robusto e a validação de entrada. Adapte o código para o seu projeto e adicione testes de integração e E2E conforme necessário.

Exercício Hands-On (5 min)

Crie um novo endpoint/subtrair que recebe dois números como parâmetros de consulta e retorna a subtração. Implemente testes unitários para verificar a funcionalidade, incluindo casos de borda como subtrair zero e lidar com números negativos.

Solução:

// Adicione o endpoint /subtrair no server.js
// ... código anterior ...
function subtrair(a, b) {
  return a - b;
}

app.get('/subtrair', (req, res) => { // ... (implementação similar ao /soma, com validação e error handling) }); // ... resto do código ...

// Adicione os testes unitários no testes.js // ... código anterior ... describe('Testes Unitários para Subtração', () => { it('Subtrai dois números corretamente', () => { expect(subtrair(5, 2)).toBe(3); });

it('Lida com subtração por zero', () => { expect(subtrair(5, 0)).toBe(5); });

it('Lida com números negativos', () => { expect(subtrair(2, 5)).toBe(-3); }); });

Para testar, execute npm test. Para troubleshooting, verifique o console para mensagens de erro. Próximos passos: explore frameworks de teste como Supertest para testes de integração e Cypress para testes E2E. Continue praticando e aprofundando seus conhecimentos em testes para construir APIs robustas e confiáveis.

🚀 Pronto para a próxima aula?

Continue sua jornada no desenvolvimento de APIs e domine Node.js & Express!

📚 Ver todas as aulas