Saltar al contenido principal

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.

Cambios importantes

La lista de cambios importantes es extensa (puede consultarse completa en el changelog), pero para facilitar la migración, también creamos una guía que puedes seguir. ¡Esperamos que esto haga la actualización lo más fluida posible!

Los principales cambios que podrían afectar tu migración son la eliminación de soporte para Node 10 y 15 (pero no para Node 12, que alcanzará su fin de vida (EOL) en pocos días) y algunas opciones de configuración renombradas.

Ten en cuenta que ambos módulos eliminados (jest-environment-jsdom y jest-jasmine2) siguen manteniéndose activamente y probándose de la misma manera, así que el único cambio importante aquí es que deberás instalarlos explícitamente.

La guía debería hacer la migración trivial, pero si usas directamente alguno de los paquetes que componen Jest (como jest-worker o pretty-format), en lugar de simplemente ejecutar jest, deberás revisar el changelog para ver los cambios importantes.

Características

¡Ahora hablemos de las nuevas características en Jest 28, que son mucho más emocionantes! Y hay bastantes, así que prepárate.

Fragmentación de pruebas

Jest ahora incluye una nueva opción CLI --shard, contribuida por Mario Nebl. Permite ejecutar partes de tus pruebas en diferentes máquinas, y era una de las solicitudes más antiguas para Jest.

La propia suite de pruebas de Jest en CI pasó de unos 10 minutos a 3 en Ubuntu, y en Windows de 20 minutos a 7.

package.json exports

Jest ofreció soporte mínimo para exports en la versión 27.3. Sin embargo, solo admitía el punto de entrada principal (.), y únicamente si no existía un campo main en package.json. ¡Con Jest 28 estamos emocionados de ofrecer finalmente soporte completo!

Relacionado: en Jest 27, ofrecíamos las condiciones require o import. En Jest 28, jest-environment-node ahora proporcionará automáticamente las condiciones node y node-addons, mientras que jest-environment-jsdom proporcionará la condición browser.

Este ha sido uno de los mayores problemas de compatibilidad de Jest, y esperamos que ahora esté resuelto definitivamente.

Temporizadores falsos

Jest 26 introdujo los temporizadores falsos "modernos", que usan @sinonjs/fake-timers internamente, y Jest 27 los hizo predeterminados. En Jest 28, ahora exponemos más de la implementación subyacente mediante APIs de configuración y tiempo de ejecución. ¡Un enorme agradecimiento a Tom Mrazauskas por contribuir esta característica!

Esto te permite no simular process.nextTick, lo que mejora la compatibilidad con Promises simuladas, o habilitar advanceTimers que avanza los temporizadores automáticamente.

Consulta la configuración de fakeTimers para más detalles.

Reportero de GitHub Actions

Jest ahora incluye un reportero para usar en GitHub Actions, que utiliza anotaciones para mostrar errores de pruebas directamente en el flujo.

Captura de error de prueba en GitHub Actions

Puedes activar este reportero agregando github-actions en la opción de configuración reporters.

Un enorme agradecimiento a Bernie Reiter y otros colaboradores por perseverar y finalmente implementar esta función.

testEnvironmentOptions en línea

Ahora puedes pasar testEnvironmentOptions directamente en un archivo, similar a cómo configuras el entorno de prueba. Esto es útil si quieres cambiar, por ejemplo, una URL en un archivo específico.

/**
* @jest-environment jsdom
* @jest-environment-options {"url": "https://jestjs.io/"}
*/

test('use jsdom and set the URL in this test file', () => {
expect(window.location.href).toBe('https://jestjs.io/');
});

Todos los globales de Node.js

Si usas la nueva implementación de fetch en Node v18, habrás notado que no está disponible en Jest. Era un problema persistente que requería copiar manualmente los globales. Con Jest 28, inspeccionamos el entorno global donde se ejecuta Jest y copiamos automáticamente cualquier global faltante en el entorno de prueba.

Módulos ECMAScript (ESM)

Poco ha cambiado en el soporte de ESM nativo desde Jest 27. Seguimos esperando la estabilización en Node, ¡y confiamos en que mejorará pronto!

Sin embargo, hemos añadido algunas funciones nuevas en Jest 28.

URLs data:

Tommaso Bossi contribuyó con soporte para URLs data, permitiéndote definir código JavaScript inline sin usar eval.

import.meta.jest

Aunque podías acceder a jest mediante import {jest} from '@jest/globals', recibimos comentarios sobre su menor ergonomía frente a la variable global jest de CJS. Por eso Jest 28 incluye import.meta.jest para un acceso más sencillo.

Misceláneos

Son muchas funciones y mis favoritas personales, pero aún hay más que revisaré brevemente:

Resolvedores asíncronos

Ian VanSchooten contribuyó con soporte para resolvedores asíncronos, permitiendo mejores integraciones con herramientas como Vite.

Archivos de configuración asíncronos

Si necesitas trabajo asíncrono en setupFiles, ahora puedes exportar una async function que Jest ejecutará y esperará antes de cargar las pruebas.

Nota: Esta función solo está disponible para CJS. En ESM, recomendamos usar await de nivel superior.

Uso de globalThis

Internamente, Jest ha estado usando global para referirse al entorno global. Sin embargo, dado que esto solo existe en Node y no en navegadores (window), esto generaba incompatibilidades al intentar usar módulos de Jest en otros entornos.

Jest 28 utiliza globalThis en su lugar, que funciona en todos los entornos.

JSDOM 19

Si bien, como se mencionó, Jest ya no incluye jest-environment-jsdom en la instalación predeterminada, sigue siendo mantenido activamente. Como parte de esto, Jest 28 ha actualizado de jsdom@16 a jsdom@19.

TypeScript

Si usas Jest con TypeScript, ya sea en tus pruebas o al escribir plugins como runners personalizados, Jest 28 viene con mejoras extensas en nuestros tipos. Aquí tienes una lista no exhaustiva de los cambios en Jest 28.

expect

Al usar los tipos propios de expect (directamente o mediante import {expect} from '@jest/globals'), ahora finalmente es posible agregar matchers personalizados. Consulta nuestro ejemplo para ver cómo hacerlo.

Plugins personalizados

Si escribes un runner personalizado, un reportero de pruebas, un resolver o algo similar, ahora exportamos más tipos que deberían ayudarte a tiparlos correctamente. Este es un objetivo en evolución, así que si eres autor de algo conectable en Jest y los tipos no son tan útiles como podrían ser, ¡por favor abre un issue!

jest-runner-tsd

jest-runner-tsd es un runner personalizado para ejecutar pruebas de tipos. ¡Esto es lo que Jest usa internamente para probar nuestros tipos, y esperamos que otros también puedan usarlo! Como su nombre indica, está basado en tsd, aunque internamente usa el fork tsd-lite.


Todas estas mejoras y correcciones han sido contribuidas por Tom Mrazauskas. ¡Muchas gracias, Tom! 👏

Finalmente, la versión mínima soportada de TypeScript ahora es 4.3.

jest-light-runner

Lo último que queremos destacar en esta publicación es un nuevo runner de Jest muy interesante, creado por Nicolò Ribaudo, llamado jest-light-runner. Esto toma casi toda la experiencia de desarrollo que Jest ofrece y la acelera significativamente al ser una abstracción más ligera sobre Node. Las pruebas de Babel se volvieron casi el doble de rápidas después de migrar. Aunque hay advertencias, la existencia de este runner debería facilitar aún más que las personas con módulos Node más pequeños elijan Jest. ¡Gracias, Nicolò!

Futuro

Aunque Jest 28 llegó casi un año después de Jest 27, Jest 29 llegará antes, probablemente en unos pocos meses. El plan actual es tener solo un cambio importante (excepto la eliminación de versiones de Node), que es establecer snapshotFormat por defecto como {escapeString: false, printBasicPrototype: false}. Esto hace que los snapshots sean más legibles y más fáciles de copiar y pegar.

Por supuesto, será posible anular esto si no deseas cambiar, ¡pero también puedes usar esas opciones hoy si no quieres esperar!

Agradecimientos

Jest 28 contiene contribuciones de más de 60 personas, de las cuales más de dos tercios son colaboradores por primera vez. ¡Muchas gracias a todos los colaboradores, antiguos y nuevos! Sin ustedes, el proyecto no sería ni la mitad de bueno de lo que es. Me gustaría agradecer especialmente a Tom Mrazauskas y Feng Yu por todas sus contribuciones, desde código hasta clasificación de problemas y depuración, que hicieron de Jest 28 lo que es. ¡Gracias! 🙏

¡Gracias por leer y felices pruebas con Jest! 🃏