Testes em JavaScript (Node.js): frameworks e ferramentas
Testes são uma parte essencial do desenvolvimento de software confiável. No ecossistema Node.js, existem muitas ferramentas para automatizar testes, desde bibliotecas assert simples até frameworks poderosos. Neste artigo, veremos os principais frameworks e ferramentas que ajudarão você a escrever testes de qualidade para aplicações Node.js.
Por que é importante testar aplicações Node.js?
Node.js é frequentemente usado para desenvolvimento de servidores, APIs e microsserviços. Erros nesses sistemas podem levar a paralisações caras ou vazamento de dados. Testes automatizados permitem:
- Encontrar rapidamente regressões durante refatorações
- Documentar o comportamento do código
- Garantir estabilidade na integração com bancos de dados e serviços externos
- Acelerar revisões de código com cenários verificáveis
Principais tipos de testes em Node.js
- Testes unitários — verificam funções ou módulos individuais de forma isolada.
- Testes de integração — testam a interação de vários módulos (por exemplo, com BD ou API).
- Testes E2E — simulam ações do usuário através do navegador ou requisições HTTP.
Jest — framework universal do Facebook
Jest é o framework mais popular para testar JavaScript. Ele inclui tudo o que é necessário: executor de testes, biblioteca de asserções, mocks e suporte embutido para assincronia.
// math.jsfunction add(a, b) { return a + b;}module.exports = { add };
// math.test.jsconst { add } = require('./math');
test('adds 1 + 2 to equal 3', () => { expect(add(1, 2)).toBe(3);});Jest suporta:
- Descoberta automática de arquivos de teste (
*.test.js) - Mocks e espiões embutidos
- Cobertura de código (coverage) com a flag
--coverage - Trabalho com código assíncrono via
async/await
Mocha + Chai — a flexibilidade clássica
Mocha é um executor de testes que fornece estrutura para testes (describe, it). Para asserções, geralmente se usa a biblioteca Chai, que oferece vários estilos (assert, expect, should).
const chai = require('chai');const expect = chai.expect;const { add } = require('./math');
describe('Math operations', () => { it('should add two numbers', () => { expect(add(2, 3)).to.equal(5); });});Mocha é frequentemente combinado com:
- Chai — para asserções legíveis
- Sinon — para mocks, stubs e espiões
- Supertest — para testar servidores HTTP
Sinon — mocks e espiões poderosos
Sinon.JS é uma biblioteca para criar dublês de teste. Ela permite isolar o código testado de dependências externas.
const sinon = require('sinon');const { expect } = require('chai');
const userService = { getUser: (id) => { /* chamada externa */ }};
describe('User controller', () => { it('should call getUser with correct id', () => { const spy = sinon.spy(userService, 'getUser'); userService.getUser(123); expect(spy.calledWith(123)).to.be.true; spy.restore(); });});Supertest — testando servidores HTTP
Supertest permite testar servidores Express/Koa sem iniciá-los em uma porta real. Ele emula requisições HTTP e verifica as respostas.
const request = require('supertest');const express = require('express');
const app = express();app.get('/hello', (req, res) => { res.status(200).json({ message: 'Hello World' });});
describe('GET /hello', () => { it('responds with json', (done) => { request(app) .get('/hello') .expect('Content-Type', /j