Pruebas en JavaScript (Node.js): frameworks y herramientas
Las pruebas son una parte esencial del desarrollo de software confiable. En el ecosistema de Node.js, existen muchas herramientas para automatizar pruebas, desde bibliotecas simples de aserciones hasta frameworks potentes. En este artículo, revisaremos los principales frameworks y herramientas que te ayudarán a escribir pruebas de calidad para aplicaciones en Node.js.
¿Por qué es importante probar las aplicaciones Node.js?
Node.js se usa a menudo para desarrollo backend, APIs y microservicios. Los errores en estos sistemas pueden provocar costosos tiempos de inactividad o fugas de datos. Las pruebas automatizadas permiten:
- Encontrar rápidamente regresiones durante la refactorización
- Documentar el comportamiento del código
- Garantizar la estabilidad al integrarse con bases de datos y servicios externos
- Acelerar las revisiones de código gracias a escenarios verificables
Tipos principales de pruebas en Node.js
- Pruebas unitarias — verifican funciones o módulos individuales de forma aislada.
- Pruebas de integración — prueban la interacción de varios módulos (por ejemplo, con BD o API).
- Pruebas E2E — simulan acciones del usuario a través del navegador o solicitudes HTTP.
Jest — framework universal de Facebook
Jest es el framework más popular para pruebas en JavaScript. Incluye todo lo necesario: ejecutor de pruebas, biblioteca de aserciones, mocks y soporte integrado para asincronía.
// 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 soporta:
- Detección automática de archivos de prueba (
*.test.js) - Mocks y espías integrados
- Cobertura de código mediante la bandera
--coverage - Trabajo con código asíncrono mediante
async/await
Mocha + Chai — la flexibilidad clásica
Mocha es un ejecutor de pruebas que proporciona una estructura para las pruebas (describe, it). Para las aserciones se suele usar la biblioteca Chai, que ofrece varios 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 a menudo se combina con:
- Chai — para aserciones legibles
- Sinon — para mocks, stubs y espías
- Supertest — para probar servidores HTTP
Sinon — mocks y espías potentes
Sinon.JS es una biblioteca para crear dobles de prueba. Permite aislar el código bajo prueba de dependencias externas.
const sinon = require('sinon');const { expect } = require('chai');
const userService = { getUser: (id) => { /* llamada 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 — pruebas de servidores HTTP
Supertest permite probar servidores Express/Koa sin ejecutarlos en un puerto real. Emula solicitudes HTTP y verifica las respuestas.
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