Saltar al contenido principal

Jest 30: Más rápido, más ligero, mejor

· 12 min de lectura
Svyatoslav Zaytsev
Svyatoslav Zaytsev
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Hoy nos complace anunciar el lanzamiento de Jest 30. Esta versión incluye una cantidad sustancial de cambios, correcciones y mejoras. Aunque es uno de los lanzamientos principales más grandes de Jest hasta la fecha, admitimos que tres años para una versión mayor es demasiado tiempo. En el futuro, nuestro objetivo es realizar lanzamientos principales más frecuentes para mantener Jest excelente durante la próxima década.

Si quieres saltarte las novedades y comenzar directamente, ejecuta npm install jest@^30.0.0 y sigue la guía de migración: Actualizar de Jest 29 a Jest 30.

¿Qué hay de nuevo?

Jest 30 es notablemente más rápido, consume menos memoria y viene con toneladas de nuevas características. Primero, veamos los cambios importantes que pueden romper tu código:

Cambios Rompedores

  • Jest 30 elimina el soporte para Node 14, 16, 19 y 21.

  • jest-environment-jsdom se actualizó de jsdom 21 a 26.

  • La versión mínima compatible de TypeScript es ahora 5.4.

  • Se eliminaron varios alias de expect. eslint-plugin-jest incluye un autofixer que puedes ejecutar para actualizar automáticamente tu base de código.

  • Las propiedades no enumerables de objetos ahora se excluyen por defecto en comparadores como toEqual.

  • Jest ahora admite archivos .mts y .cts por defecto.

  • --testPathPattern fue renombrado a --testPathPatterns.

  • Jest ahora maneja correctamente las promesas que primero son rechazadas y luego capturadas para evitar falsos positivos en las pruebas.

  • Realizamos varias mejoras en la impresión de snapshots de Jest que podrían requerir que actualices tus snapshots. Google descontinuó los enlaces goo.gl que estábamos usando en snapshots. Tampoco nos gusta, pero tendrás que actualizar todos tus snapshots.

  • Jest ahora se empaqueta en un único archivo por paquete. Esto mejora el rendimiento, pero podría romperse si creaste herramientas que acceden a los internos de Jest.

Estos son solo algunos aspectos destacados. La lista completa de cambios importantes está disponible en el CHANGELOG y la guía de migración de Jest 30.

Mejoras de rendimiento y memoria

Jest 30 ofrece mejoras de rendimiento tangibles gracias a muchas optimizaciones, especialmente en resolución de módulos, uso de memoria y aislamiento de pruebas. Al utilizar el nuevo unrs-resolver, la resolución de módulos en Jest se volvió más completa, compatible con estándares y más rápida. Agradecemos a @JounQin por la migración. Dependiendo de tu proyecto, podrías ver ejecuciones de pruebas significativamente más rápidas y menor consumo de memoria. Por ejemplo, una gran aplicación TypeScript con cliente y servidor observó un 37% más de velocidad en pruebas y un 77% menos de uso de memoria en parte de su base de código:

Jest 29Jest 30
Server tests~1350s / 7.8 GB max~850s / 1.8 GB max
Client tests~49s / 1.0 GB max~44s / 0.8 GB max

Jest es rápido, pero debido a su aislamiento de pruebas, el código de usuario lento a menudo exacerba los problemas de rendimiento y genera pruebas lentas. Cuando las pruebas dejan manejadores abiertos como temporizadores sin cerrar o conexiones a otros servicios, puede hacer que Jest se cuelgue o ralentice. Jest 30 ha mejorado en detectar y reportar estos problemas, lo que te ayuda a identificar y corregir pruebas lentas o problemáticas más fácilmente. Por ejemplo, las pruebas en Happo aceleraron un 50% pasando de 14 minutos a 9 minutos al limpiar manejadores abiertos y actualizar a Jest 30.

Si utilizas archivos que consolidan las exportaciones de múltiples módulos en un único archivo (conocidos como "barrel files"), te recomendamos usar herramientas como babel-jest-boost, babel-plugin-transform-barrels o no-barrel-file para evitar cargar grandes bloques de código de aplicación en cada archivo de prueba. Esto puede generar mejoras de rendimiento de hasta 100x.

Limpieza de variables globales entre archivos de prueba

Jest logra el aislamiento entre archivos de prueba ejecutando cada test en un contexto de VM separado, proporcionando a cada archivo un entorno global nuevo. Sin embargo, si tu código no limpia las variables globales después de cada archivo de prueba, puede provocar fugas de memoria en Jest y ralentizar tus ejecuciones. Jest 30 introduce una nueva funcionalidad que te alerta sobre variables globales no limpiadas correctamente tras cada ejecución.

En el futuro, Jest limpiará automáticamente las variables globales tras cada ejecución. Si no recibes advertencias sobre variables globales no limpiadas con Jest 30, ya puedes activar el modo de limpieza completa configurándolo en "on" para beneficiarte de importantes ahorros de memoria y mejoras de rendimiento:

export default {
testEnvironmentOptions: {
globalsCleanup: 'on',
},
};

El valor predeterminado en Jest es globalsCleanup: 'soft'. Para desactivar esta función puedes configurarlo en off. Si necesitas proteger objetos globales específicos de ser limpiados —por ejemplo, utilidades compartidas o cachés— puedes marcarlos como protegidos usando jest-util:

import {protectProperties} from 'jest-util';

protectProperties(globalThis['my-property']);

¡Gracias a @eyalroth por implementar esta funcionalidad!

Nuevas características

Mejoras en soporte para ECMAScript Modules y TypeScript

Se añadió soporte para import.meta.* y file:// al usar ESM nativo con Jest. Además, ahora puedes escribir tus archivos de configuración de Jest en TypeScript, y los archivos .mts y .cts son soportados nativamente sin configuración adicional. Si usas la función nativa de Node para eliminar tipos de TypeScript, ya no cargamos el transformador de TypeScript, acelerando las ejecuciones.

Spies y la palabra clave using

Ahora puedes usar la nueva sintaxis de gestión explícita de recursos de JavaScript (using) con spies de Jest. Si tu entorno lo soporta, escribir using jest.spyOn(obj, 'method') restaurará automáticamente el spy al terminar el bloque, evitando limpieza manual.

test('logs a warning', () => {
using spy = jest.spyOn(console, 'warn');
doSomeThingWarnWorthy();
expect(spy).toHaveBeenCalled();
});

Documentación

expect.arrayOf

Jest 30 introduce un nuevo comparador asimétrico, expect.arrayOf, que permite validar cada elemento de un array contra una condición o tipo. Por ejemplo, puedes verificar que un array contenga solo números:

expect(someArray).toEqual(expect.arrayOf(expect.any(Number)));

Documentación

Nuevo marcador de posición en test.each: %$

Si usas pruebas basadas en datos con test.each, ahora puedes incluir el marcador especial %$ en tus títulos para inyectar el número del caso de prueba. Por ejemplo:

test.each(cases)('Case %$ works as expected', () => {});

reemplazará %$ con el número secuencial de la prueba.

Documentación

jest.advanceTimersToNextFrame()

@sinonjs/fake-timers se actualizó a v13, añadiendo jest.advanceTimersToNextFrame(). Esta función avanza todas las llamadas pendientes de requestAnimationFrame al siguiente fotograma, facilitando las pruebas de animaciones o código que depende de requestAnimationFrame sin tener que adivinar las duraciones en milisegundos.

Documentación

Reintentos de pruebas configurables

Jest 30 mejora jest.retryTimes() con nuevas opciones que te permiten controlar cómo se manejan los reintentos. Puedes especificar un retraso o reintentar inmediatamente una prueba fallida en lugar de esperar a que termine todo el conjunto de pruebas:

// Retry failed tests up to 3 times, waiting 1 second between attempts:
jest.retryTimes(3, {waitBeforeRetry: 1000});

// Immediately retry without waiting for other tests to finish:
jest.retryTimes(3, {retryImmediately: true});

Documentación

jest.unstable_unmockModule()

Jest 30 añade una nueva API experimental jest.unstable_unmockModule() para un control más preciso al desactivar mocks de módulos (especialmente cuando se usa ESM nativo).

Documentación

jest.onGenerateMock(callback)

Se añadió un nuevo método onGenerateMock. Registra una función de callback que se invoca cada vez que Jest genera un mock para un módulo. Este callback te permite modificar el mock antes de que se devuelva a tu entorno de pruebas:

jest.onGenerateMock((modulePath, moduleMock) => {
if (modulePath.includes('Database')) {
moduleMock.connect = jest.fn().mockImplementation(() => {
console.log('Connected to mock DB');
});
}
return moduleMock;
});

Documentación

Otras mejoras

Serialización personalizada de objetos

Las utilidades de comparación de Jest ahora permiten definir una propiedad estática SERIALIZABLE_PROPERTIES en objetos personalizados. Esto te permite controlar qué propiedades se incluyen en snapshots y mensajes de error, haciendo la salida más enfocada y relevante.

Documentación

Soporte para configuración asíncrona

Los archivos de prueba listados en setupFilesAfterEnv ahora pueden exportar funciones asíncronas o usar await de nivel superior, similar a setupFiles.

Y mucho más…

Consulta el CHANGELOG completo para ver todos los cambios, mejoras y nuevas características.

Problemas conocidos

jsdom ha implementado cambios para cumplir mejor con las especificaciones. Esto podría romper algunos casos de uso, especialmente al simular window.location en pruebas. Jest ahora incluye @jest/environment-jsdom-abstract para facilitar la creación de entornos de prueba personalizados basados en jsdom. Si solo necesitas parchear jsdom, puedes aplicar este parche de jsdom en tu proyecto. En el futuro, exploraremos alternativas a jsdom más adecuadas para pruebas.

¿Qué viene después?

Jest ha sido el framework de pruebas JavaScript más popular durante una década. Lo usan millones de desarrolladores en proyectos que van desde pequeñas librerías hasta los mayores codebases del mundo. Con el tiempo hemos acumulado deuda técnica: mantenemos funciones poco usadas y minimizamos cambios importantes para no afectar usuarios. Algunas características deberían existir fuera del core, otras fomentan malas prácticas. Además, cambios en el equipo han ralentizado nuestro progreso. Así abordaremos estos desafíos:

  • Rendimiento/Deuda técnica: Reducir Jest a un núcleo más ligero y eficiente. Eliminar funciones minoritarias y enfocarnos en lo que hace grande a Jest.

  • Ciclos de lanzamiento consistentes: Seremos más regulares con versiones y políticas de desuso.

  • Transparencia: Construir todo abiertamente, compartiendo nuestros planes. Ofrecer más oportunidades para colaborar y aumentar contribuyentes.

  • Sé Audaz: Como equipo de Jest, debemos ser más atrevidos. Hay muchas cosas que impiden que Jest alcance todo su potencial. Es hora de tomar acción.

La buena noticia es que Jest siempre ha estado bien preparado para cumplir con estos principios, desde que construimos el framework como un sistema modular con clara separación de responsabilidades. Ahora es momento de ejecutar. ¡Más sobre esto próximamente!

Agradecimientos

Esta versión no habría sido posible sin el arduo trabajo de nuestra comunidad. Gracias.

@SimenB, @mrazauskas, @Connormiha, @liuxingbaoyu, @k-rajat19, @G-Rath, @charpeni, @dubzzz, @stekycz, @yinm, @lencioni, @phawxby, @lukeapage, @robhogan, @fisker, @k-rajat19, @connectdotz, @alesmenzel, @rickhanlonii, @mbelsky, @brunocabral88, @brandon-leapyear, @nicolo-ribaudo, @dj-stormtrooper, @eryue0220

Un agradecimiento especial a todos quienes hicieron su primera contribución a Jest en esta versión. ¡Gracias por hacer que Jest sea mejor para todos!

@eyalroth, @KhaledElmorsy, @mohammednumaan, @bensternthal, @BondarenkoAlex, @phryneas, @jayvdb, @brandonchinn178, @latin-1, @rmartine-ias, @fa93hws, @Dunqing, @gustav0d, @noritaka1166, @andreibereczki, @Dreamsorcerer, @satanTime, @icholy, @ecraig12345, @cgm-16, @sebastiancarlos, @dancer1325, @loganrosen, @zakingslayerv22, @dev-intj, @tez3998, @anbnyc, @pengqiseven, @thypon, @co63oc, @danielrentz, @jonasongg, @andrew-the-drawer, @phryneas, @hyperupcall, @tonyd33, @madcapnmckay, @dongwa, @gagan-bhullar-tech, @ikonst, @ZuBB, @jzaefferer, @brandonnorsworthy, @henny1105, @DmitryMakhnev, @askoufis, @RahulARanger, @Jon-Biz, @fynsta, @KonnorRogers, @BondarenkoAlex, @mouadhbb, @kemuridama, @Avi-E-Koenig, @davidroeca, @akwodkiewicz, @mukul-turing, @dnicolson, @colinacassidy, @ofekm97, @haze, @Vadimchesh, @peterdenham, @ShuZhong, @manoraj, @nicolo-ribaudo, @georgekaran, @MathieuFedrigo, @hkdobrev, @Germandrummer92, @CheadleCheadle, @notaphplover, @danbeam, @arescrimson, @yepitschunked, @JimminiKin, @DerTimonius, @vkml, @ginabethrussell, @jeremiah-snee-openx, @WillianAgostini, @casey-lentz, @faizanu94, @someone635, @rafaelrabelos, @RayBrokeSomething, @DaniAcu, @mattkubej, @tr1ckydev, @shresthasurav, @the-ress, @Mutesa-Cedric, @nolddor, @alexreardon, @Peeja, @verycosy, @mknight-atl, @maro1993, @Eric-Tyrrell22

Jest 29: Cambios en el formato de snapshots

· 2 min de lectura
Simen Bekkhus
Simen Bekkhus
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Jest 29 ya está aquí, apenas unos meses después de Jest 28. Como mencionamos en la publicación de Jest 28, esta versión incluye solo un par de cambios importantes (breaking changes) para facilitar al máximo la actualización.

Jest se une a la OpenJS Foundation

· Un min de lectura
Ricky Hanlon
Ricky Hanlon
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Imagen de banner para Meta Open Source y OpenJS Foundation

¡Hoy nos complace anunciar que Jest se une a la OpenJS Foundation!

Este cambio transfiere la propiedad del proyecto desde Meta al equipo central de Jest a través de la OpenJS Foundation como un Proyecto de Impacto. Estamos agradecidos a Meta por crear Jest y por todo su apoyo a lo largo de los años, ¡y esperamos con ilusión el futuro de Jest como un proyecto propiedad de la comunidad de Jest!

Consulta los anuncios en el blog de Ingeniería de Meta y el blog de la OpenJS Foundation para más información.

Jest 28: Reduciendo peso y mejorando compatibilidad 🫶

· 9 min de lectura
Simen Bekkhus
Simen Bekkhus
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Jest 28 ya está aquí, y viene con características muy solicitadas como soporte para fragmentación (sharding) de pruebas en múltiples máquinas, package exports y la capacidad de personalizar el comportamiento de temporizadores falsos (fake timers). Estos son solo algunos aspectos destacados personales, y profundizaremos más en esta publicación de blog.

Además, como anunciamos en la publicación de Jest 27 el año pasado, hemos eliminado de la instalación predeterminada algunos paquetes que ya no se usan por defecto. Como resultado, el tamaño de instalación se redujo aproximadamente un tercio.

Jest 27: Nuevos valores predeterminados para Jest, edición 2021 ⏩

· 8 min de lectura
Tim Seckinger
Tim Seckinger
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

En la publicación de Jest 26 hace aproximadamente un año, anunciamos que después de dos lanzamientos principales con pocos cambios disruptivos, Jest 27 activaría algunos interruptores para establecer mejores valores predeterminados para proyectos nuevos o que puedan migrar sin problemas. Esto nos da la oportunidad de eliminar algunos paquetes de la distribución predeterminada de Jest 28 y publicarlos como módulos instalables y conectables por separado. Todos los que adopten los nuevos valores predeterminados se beneficiarán de un tamaño de instalación más pequeño, mientras que quienes necesiten estos paquetes aún podrán instalarlos por separado.

Con el primer cambio importante en los valores predeterminados desde los Nuevos valores predeterminados para Jest que llegaron con la versión seminal 15, Jest 27 ya está aquí para mantener Jest rápido, ligero y relevante en el futuro. Explicaremos esos cambios en los valores predeterminados y otros cambios disruptivos notables en esta publicación, pero primero, ¡vamos a conocer algunas características nuevas emocionantes!

Actualización del sitio web de Jest

· 2 min de lectura
Sébastien Lorber
Docusaurus maintainer
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

¡Nos complace presentar el nuevo sitio web de Jest!

El sitio de Jest se actualizó de Docusaurus 1 a Docusaurus 2, siendo uno de los primeros en adoptar el soporte para i18n recién lanzado en Docusaurus 2.

Entonces, ¿qué hay de nuevo exactamente?

Jest 26: Tic Tac

· 7 min de lectura
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Cuando comenzamos a reconstruir Jest hace cinco años, nuestro objetivo era crear un ejecutor de pruebas con configuración cero y todo incluido que fuera accesible para principiantes, extensible para casi todos los casos de uso de pruebas y escalable para proyectos grandes. Uno de los lanzamientos clave fue Jest 15, que integró todo y proporcionó configuraciones predeterminadas que permitían ejecutar Jest frecuentemente sin configuración adicional. Sin embargo, este enfoque tiene una gran desventaja: Jest instala muchas dependencias en tus proyectos que quizás no necesites.

Ahora estamos abordando esta limitación y trabajando para reducir el tamaño de instalación de Jest manteniendo su accesibilidad y extensibilidad. Hemos implementado los siguientes cambios importantes en Jest 26:

Jest 25: 🚀 Sentando las bases para el futuro

· 7 min de lectura
Simen Bekkhus
Simen Bekkhus
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Jest 25 está sentando las bases para muchos cambios importantes en el futuro. Por ello, hemos minimizado los cambios disruptivos, aunque las modificaciones internas de arquitectura pueden requerir atención durante la actualización. Los principales cambios incluyen: actualización de JSDOM de v11 a v15, ejecución de pruebas entre 10-15% más rápida, nueva vista de diferencias para snapshots obsoletos y eliminación del soporte para Node 6.

Han habido más de 200 commits desde Jest 24.9 gracias a más de 80 colaboradores diferentes. Como siempre, revisa el registro de cambios (changelog) para ver la lista completa de actualizaciones.

Jest 24: 💅 Renovado, Pulido y Compatible con TypeScript

· 10 min de lectura
Simen Bekkhus
Simen Bekkhus
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

¡Hoy nos complace anunciar la próxima versión principal de Jest: la versión 24! Han pasado 4 meses desde la última versión menor y 8 meses desde Jest 23, por lo que esta actualización es importante y trae algo para todos. Los aspectos destacados incluyen soporte integrado para TypeScript al actualizar los componentes internos de Jest a Babel 7, corrección de problemas persistentes como la falta de salida en la consola y problemas de rendimiento al calcular diferencias grandes, y un sitio web completamente renovado y brillante. ✨

Para ver la lista completa de cambios, consulta el registro de cambios.

Apoyando el código abierto de Jest

· 4 min de lectura
Ricky Hanlon
Ricky Hanlon
Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Jest es mantenido por una comunidad de colaboradores de código abierto y empleados de Facebook.

Nuestros colaboradores de código abierto trabajan en representación de la comunidad para crear nuevas funciones, corregir errores y mantener el backlog de incidencias. Los empleados de Facebook realizan las mismas tareas, enfocados en problemas específicos de la escala de Facebook, y ejecutan todas las versiones propuestas en la enorme suite de pruebas de Facebook antes de su publicación.

Todos contribuimos para que las pruebas sean una experiencia agradable.

En la Jest Summit anunciamos el Jest Open Collective. Esta es nuestra forma de apoyar los esfuerzos de la comunidad de código abierto de Jest. Para ser absolutamente claros: los empleados de Facebook no pueden beneficiarse del Jest Open Collective. El único propósito del colectivo es apoyar el lado de código abierto de la comunidad de Jest.

En esta publicación describiremos qué es el Jest Open Collective, su estructura y nuestros objetivos.