Node: Testing
Descubre cómo implementar testing en Node.js con librerías como Mocha, Jest o Chai. Automatiza la verificación de tu código, mejora la calidad de tus proyectos y obtén estadísticas de cobertura de manera eficiente.
Aprende Node GRATIS y certifícateA la hora de desarrollar proyectos en Node.js, contar con un sistema de testing sólido garantiza la confiabilidad de la aplicación y previene errores en producción. A continuación, se describen los pasos y herramientas más comunes para aplicar pruebas unitarias, de integración y de cobertura.
Importancia del testing en Node.js
En Node.js, el enfoque asíncrono y la reutilización de módulos requieren asegurar que cada parte funcione según lo esperado. Un testing adecuado disminuye la probabilidad de fallos y optimiza la mantenibilidad, permitiendo que el equipo de desarrollo identifique los problemas antes de implementar cambios en el entorno productivo.
Configuración inicial del proyecto
Para comenzar, se recomienda tener un archivo package.json bien definido en el proyecto. En este archivo se registran las dependencias de testing y los scripts que automatizan la ejecución de pruebas. Tras inicializar el proyecto con:
npm init -y
se agregan las librerías de testing que se requieran.
Elección de frameworks de pruebas
Existen varias librerías populares para testing en Node.js:
- Mocha: Destaca por su flexibilidad y su amplia adopción en la comunidad.
- Jest: Es mantenida por el equipo de React, provee un entorno de prueba completo y facilita la configuración de mocks.
- Chai: Ofrece funciones de aserción y se integra bien con Mocha para realizar verificaciones con sintaxis clara.
- AVA: Enfatiza la ejecución de pruebas en paralelo, maximizando la velocidad en equipos potentes.
Cada herramienta presenta ventajas particulares, aunque todas brindan la capacidad de ejecutar pruebas automatizadas en Node.js.
Ejemplo con Mocha y Chai
La dupla Mocha + Chai es habitual para escribir pruebas en un estilo BDD (Behavior Driven Development). Se instalan con:
npm install mocha chai --save-dev
Luego, se puede crear una carpeta test
y un archivo test/usuario.test.js
:
const { expect } = require('chai');
describe('Módulo de usuario', () => {
it('Debe crear un usuario con nombre y edad', () => {
const usuario = { nombre: 'Ana', edad: 25 };
expect(usuario).to.have.property('nombre').that.equals('Ana');
expect(usuario).to.have.property('edad').that.equals(25);
});
});
En el archivo package.json, se define el script de testing:
{
"scripts": {
"test": "mocha"
}
}
Al ejecutar npm test
, se inician las pruebas y se genera un reporte de los resultados.
Ejemplo con Jest
Para quienes prefieran una solución integrada, Jest agrupa en un solo paquete las funciones de pruebas unitarias, mocks y coverage. Para instalarlo:
npm install jest --save-dev
Un ejemplo de prueba con Jest luce así:
// archivo: test/calculadora.test.js
function sumar(a, b) {
return a + b;
}
test('sumar 2 + 3 debe dar 5', () => {
expect(sumar(2, 3)).toBe(5);
});
Tras añadir "test": "jest"
en package.json, npm test
ejecuta las comprobaciones de manera sencilla.
Mocks y simulación de dependencias
En proyectos de Node.js, es frecuente que ciertos módulos dependan de servicios externos o funcionalidades complejas. Para aislar la lógica principal de estas dependencias, se usan mocks o stubs que simulan comportamientos y devuelven datos controlados. Esto ayuda a probar la aplicación en un entorno estable sin depender de recursos externos.
Cobertura de código
Medir la cobertura de las pruebas garantiza que la mayor parte del proyecto esté verificada. Con Jest, basta con añadir la bandera --coverage
en el script de testing para generar un reporte. En Mocha, se suele integrar nyc
:
npm install nyc --save-dev
Luego, en el package.json:
{
"scripts": {
"test": "nyc mocha"
}
}
De este modo, se visualiza el porcentaje de líneas, funciones y archivos cubiertos por pruebas, identificando qué partes del código requieren mayor atención.
Pruebas de integración
Las pruebas de integración comprueban la interacción entre varios módulos de la aplicación. En Node.js, se suelen usar los mismos frameworks que en las pruebas unitarias, pero se inician servicios reales o simulados para asegurar que múltiples componentes funcionen en conjunto. Por ejemplo, si un proyecto necesita conectarse a una base de datos, se ejecuta el servicio en un entorno de prueba para verificar operaciones CRUD.
Ejecución continua y entornos de CI
Automatizar el testing en plataformas de CI (Continuous Integration), como GitHub Actions o GitLab CI, otorga confianza en cada actualización de la base de código. Configurar un archivo de pipeline que ejecute npm test
en cada push o pull request evita que cambios defectuosos lleguen a la rama principal.
Buenas prácticas para testing en Node.js
- Mantener las pruebas en carpetas separadas con nombres relevantes.
- Escribir pruebas claras y aisladas, que verifiquen una única funcionalidad cada vez.
- Utilizar variables de entorno específicas y datos ficticios para no afectar el entorno de producción.
- Emplear test doubles para simular servicios externos en las pruebas de unidad.
- Revisar periódicamente la cobertura para detectar áreas sin verificar.
Lecciones de este módulo de Node
Lecciones de programación del módulo Testing del curso de Node.