Pruebas en JavaScript (Node.js): frameworks y herramientas
Las pruebas de calidad son una parte esencial del desarrollo en Node.js. Permiten detectar errores en etapas tempranas, simplifican la refactorización y aumentan la confiabilidad de las aplicaciones. En el ecosistema de JavaScript existen numerosos frameworks y utilidades para realizar pruebas. En este artículo, examinaremos las herramientas principales, sus capacidades y proporcionaremos ejemplos prácticos.
1. Tipos principales de pruebas
Antes de elegir una herramienta, es importante entender qué tipos de pruebas vas a escribir:
- Pruebas unitarias (Unit) — verifican funciones o módulos individuales de forma aislada.
- Pruebas de integración — verifican la interacción entre varios módulos, bases de datos o APIs externas.
- Pruebas End-to-End (E2E) — simulan las acciones del usuario en el navegador o en la aplicación completa.
2. Jest — framework universal de Facebook
Jest es el framework más popular para pruebas en JavaScript. Incluye todo lo necesario: test-runner, librería de aserciones (assertions), mocks y soporte integrado para cobertura de código.
Instalación:
npm install --save-dev jest
Ejemplo de una prueba unitaria simple para una función de suma:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');
test('la suma de 1 + 2 es igual a 3', () => {
expect(sum(1, 2)).toBe(3);
});
Ejecución de las pruebas:
npx jest
Ventajas de Jest:
- Configuración cero para proyectos en React y Node.
- Ejecución automática en modo watch.
- Mocks y spies integrados.
- Soporte para código asíncrono (async/await, callbacks).
3. Mocha + Chai — combinación flexible
Mocha es un test-runner flexible que no impone una librería de aserciones. La mayoría de las veces se usa junto con Chai, una librería con sintaxis clara (should, expect, assert).
Instalación:
npm install --save-dev mocha chai
Ejemplo de prueba con Chai:
// calculator.js
function divide(a, b) {
if (b === 0) throw new Error('Division by zero');
return a / b;
}
module.exports = { divide };
// test.js
const { 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');
});
});
Ejecución:
npx mocha test.js
Mocha es especialmente útil cuando se necesita un ajuste fino de los informes y la integración con otras herramientas.
4. Supertest — pruebas de servidores HTTP
Supertest es una librería para pruebas de integración de servidores Express (y otros). Permite enviar solicitudes HTTP y verificar las respuestas.
Instalación:
npm install --save-dev supertest
Ejemplo de prueba para una aplicación Express:
// app.js
const express = require('express');
const app = express();
app.get('/hello', (req, res) => res.json({ message: 'Hello World' }));
module.exports = app;
// app.test.js
const 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 se combina perfectamente con Jest o Mocha.