Testes em JavaScript (Node.js): frameworks e ferramentas
Testes de qualidade são uma parte essencial do desenvolvimento em Node.js. Eles permitem identificar erros em estágios iniciais, simplificam a refatoração e aumentam a confiabilidade das aplicações. No ecossistema JavaScript, existem diversos frameworks e utilitários para testes. Neste artigo, vamos explorar as principais ferramentas, suas funcionalidades e fornecer exemplos práticos.
1. Principais tipos de testes
Antes de escolher uma ferramenta, é importante entender quais tipos de testes você irá escrever:
- Testes Unitários (Unit) — verificam funções ou módulos individuais de forma isolada.
- Testes de Integração — verificam a interação entre vários módulos, banco de dados ou APIs externas.
- Testes End-to-End (E2E) — simulam ações do usuário no navegador ou na aplicação completa.
2. Jest — framework universal do Facebook
Jest é o framework mais popular para testes em JavaScript. Ele inclui tudo o que é necessário: test runner, biblioteca de asserções (assertions), mocks e suporte integrado para cobertura de código.
Instalação:
npm install --save-dev jestExemplo de um teste unitário simples para uma função de soma:
// sum.jsfunction sum(a, b) { return a + b;}module.exports = sum;
// sum.test.jsconst sum = require('./sum');
test('soma 1 + 2 é igual a 3', () => { expect(sum(1, 2)).toBe(3);});Execução dos testes:
npx jestVantagens do Jest:
- Configuração zero para projetos em React e Node.
- Execução automática em modo watch.
- Mocks e spies integrados.
- Suporte para código assíncrono (async/await, callbacks).
3. Mocha + Chai — combinação flexível
Mocha é um test runner flexível que não impõe uma biblioteca de asserções. Geralmente é usado com Chai — uma biblioteca com sintaxe clara (should, expect, assert).
Instalação:
npm install --save-dev mocha chaiExemplo de teste com Chai:
// calculator.jsfunction divide(a, b) { if (b === 0) throw new Error('Division by zero'); return a / b;}module.exports = { divide };
// test.jsconst { expect } = require('chai');const { divide } = require('./calculator');
describe('Calculator', function() { it('should divide two numbers', function() { expect(divide(10, 2)).to.equal(5); });
it('should throw error when dividing by zero', function() { expect(() => divide(10, 0)).to.throw('Division by zero'); });});Execução:
npx mocha test.jsMocha é especialmente útil quando é necessário um ajuste fino nos relatórios e integração com outras ferramentas.
4. Supertest — teste de servidores HTTP
Supertest é uma biblioteca para testes de integração em servidores Express (e outros). Ela permite enviar requisições HTTP e verificar as respostas.
Instalação:
npm install --save-dev supertestExemplo de teste para uma aplicação Express:
// app.jsconst express = require('express');const app = express();app.get('/hello', (req, res) => res.json({ message: 'Hello World' }));module.exports = app;
// app.test.jsconst request = require('supertest');const app = require('./app');
describe('GET /hello', function() { it('responds with json', function(done) { request(app) .get('/hello') .expect('Content-Type', /json/) .expect(200) .then(response => { expect(response.body.message).toBe('Hello World'); done(); }); });});Supertest funciona muito bem combinado com Jest ou Mocha.