node:test y node:assert
Node 24 incluye un ejecutor de pruebas y un módulo de aserciones nativos para que las pruebas unitarias se ejecuten sin Jest o Vitest para la lógica pura de backend.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
import assert from "node:assert/strict";
import { describe, it } from "node:test";
describe("math", () => {
it("adds", () => {
assert.equal(1 + 1, 2);
});
});node --import tsx --testCuándo usarlo:
- Funciones puras, analizadores y lógica de dominio.
- Quieres cero dependencias del ejecutor de pruebas.
- Librerías que no deben forzar Jest a los consumidores.
Ejemplo de trabajo
// src/pricing/discount.ts
export function applyDiscount(cents: number, percent: number): number {
if (percent < 0 || percent > 100) throw new Error("invalid percent");
return Math.round(cents * (1 - percent / 100));
}// test/pricing/discount.test.ts
import assert from "node:assert/strict";
import { describe, it } from "node:test";
import { applyDiscount } from "../../src/pricing/discount.js";
describe("applyDiscount", () => {
it("reduces price by percentage", () => {
assert.equal(applyDiscount(1000, 10), 900);
});
it("throws on invalid percent", () => {
assert.throws(() => applyDiscount(1000, -1), /invalid percent/);
});
});{
"scripts": {
"test": "node --import tsx --test --test-reporter spec"
}
}Lo que esto demuestra:
- Importaciones ESM con extensiones
.jspara compatibilidad con NodeNext. assert.throwsvalida rutas de error sin una librería de mocking.--test-reporter specproporciona una salida legible en CI.
Inmersión profunda
Cómo funciona
node:testdescubre archivos*.test.ts(o rutas explícitas) y se ejecuta en paralelo por defecto.- Hooks:
before,after,beforeEach,afterEachen el ámbito dedescribe. node:assert/strictlanzaAssertionErroren caso de desajuste (la igualdad profunda usa reglas===para primitivos).- Subpruebas a través de anidamiento
itotest.context()para una agrupación más granular.
Helpers de aserción
| API | Uso |
|---|---|
assert.equal | Igualdad de primitivos |
assert.deepEqual | Estructura de objetos/arrays |
assert.rejects | Lanzamiento asíncrono |
assert.match | Regex en cadenas |
Notas de TypeScript
node --import tsx --test- El cargador
tsxcompila TypeScript sobre la marcha para desarrollo y CI. - La implementación en producción sigue utilizando la compilación
tsc; las pruebas no se envían.
Errores comunes
- No hay ergonomía de mock/spy incorporada - Es verboso sin
node:test/mock(Node 22+). Solución: usamock.fn()denode:testo añade Vitest para mocking pesado. - Pruebas paralelas que comparten estado global - Fallos inestables. Solución:
describe(..., { concurrency: 1 })o aislar el estado por prueba. - Falta tsx en CI -
node --testsintsxfalla en.ts. Solución:tsxcomo devDependency y--import tsx. - Ruta de importación
.tsen las pruebas - Rompe la resolución de ESM. Solución: importa rutas.jsque coincidan con el diseño de emisión. - Ausencia de pruebas de snapshot - No hay snapshots de Jest. Solución: aserción de campos explícitos o adoptar Vitest para las necesidades de snapshot.
Alternativas
| Alternativa | Cuándo usar | Cuándo no usar |
|---|---|---|
| Vitest | Mocking, snapshots, ecosistema Vite | Librería pequeña que evita dependencias |
| Jest | Suite existente ya en Jest | Proyecto nuevo sin legado |
| tap / ava | Pipelines de salida TAP | Equipo estandarizado en node:test |
Preguntas frecuentes
¿Está node:test listo para producción?
Sí, en Node 18+; Node 24 Active LTS es el objetivo. API estable para describe/it/assert.
¿Cómo ejecuto un solo archivo?
node --import tsx --test test/pricing/discount.test.ts¿Cómo funcionan los mocks?
import { mock } from "node:test";
const fn = mock.fn(() => 42);Disponible en versiones modernas de Node para necesidades simples de spy.
¿Puedo usarlo con NestJS?
Sí, para pruebas unitarias de servicios de forma aislada. Nest e2e a menudo usa Jest por defecto; node:test funciona con el cableado manual de Test.createTestingModule.
¿Cómo omito pruebas?
it.skip("razón", fn) o describe.skip para cuarentena temporal con omisión visible en el reporter.
¿Qué reportero para CI?
spec legible para humanos; tap para analizadores; dot salida mínima.
¿Cómo pruebo funciones asíncronas?
Devuelve promesas de las callbacks it o usa funciones async; los fallos rechazan la prueba.
¿Soporte de cobertura?
node --import tsx --experimental-test-coverage --testExperimental; Vitest/Istanbul son maduros para puertas de cobertura.
¿Modo de vigilancia?
No hay modo de vigilancia incorporado; usa patrones tsx watch --test o Vitest para el ciclo TDD.
¿Cómo se ordenan los hooks?
before se ejecuta una vez por describe; beforeEach antes de cada it; lo opuesto para los hooks after.
Relacionado
- Conceptos básicos de pruebas - visión general de la pirámide
- Vitest - cuando necesitas mocks y vigilancia
- Supertest e integración HTTP - pruebas de capa HTTP
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.