Jest 20: 💖 Pruebas Deliciosas & 🏃🏽 Ejecutor Multi-Proyecto
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Hace unos meses anunciamos Jest 19 que incluía importantes nuevas funciones y era el mayor lanzamiento de Jest hasta entonces. Jest 20 tiene el doble de cambios respecto a la versión anterior, presenta una reescritura completa del ejecutor de pruebas y añade nuevas APIs de testing. Esta nueva versión permite un nivel sin precedentes de personalización y configuración para proyectos, todo ello facilitando al máximo la actualización. Más allá de las Pruebas JavaScript Sin Dolor, creemos que Jest ofrece ahora una Experiencia Deliciosa de Pruebas JavaScript. Exploremos en profundidad las mejores nuevas funciones y cambios:
Ejecutor Multi-Proyecto & Revisión de Configuración
Hasta ahora, Jest solo podía operar en un proyecto a la vez. Esto resulta engorroso cuando trabajas con muchos proyectos pequeños que tienen su propia configuración. Con Jest 20, reescribimos completamente el ejecutor de pruebas para manejar múltiples proyectos simultáneamente dentro de una única instancia de Jest, por ejemplo si trabajas tanto en un frontend React como en un backend node.js. Aquí un video de Jest ejecutando pruebas para React, Relay, Yarn y Jest al mismo tiempo:

Jest ahora colapsa la guía de uso tras la primera ejecución para ahorrar espacio vertical en la terminal.
Además, rediseñamos completamente el sistema de configuración de Jest. Ahora puedes pasar cualquier opción de configuración por CLI para sobrescribir las especificadas en tu archivo de configuración. Paralelamente, configuramos Jest para buscar por defecto un archivo jest.config.js, lo que permite definir configuraciones mediante JavaScript además de hacerlo vía package.json como antes. Gracias a estas nuevas funcionalidades, puedes combinar Jest de formas más potentes que nunca. Por ejemplo, para identificar qué pruebas ejecutaría Jest basándose en archivos modificados de un commit en múltiples proyectos de un monorepo, ahora puedes combinar argumentos CLI así:
$ jest --projects projectA projectB --listTests --findRelatedTests projectA/banana.js projectB/kiwi.js
[
"projectA/banana.test.js",
"projectB/kiwi.test.js",
"projectB/pineapple.test.js",
]
Esto es especialmente útil en sistemas de integración continua (CI) donde quizá quieras ejecutar solo un subconjunto de pruebas para Pull Requests, evitando que Jest ejecute miles de archivos de prueba en cada cambio mínimo.
Finalmente, ahora mapeamos correctamente la cobertura de código con TypeScript y ejecutamos cobertura para archivos no probados en procesos worker, acelerando significativamente esta funcionalidad.
APIs de Pruebas Nuevas & Mejoradas
Realizamos varias adiciones y mejoras en las APIs de testing que ayudarán a escribir pruebas más efectivas. ¡Queremos destacar que todas estas mejoras fueron realizadas enteramente por miembros de la comunidad!
-
Mejor testing asíncrono: Nuevo soporte para async/Promises mediante modificadores resolves/rejects en expect:
expect(Promise(…)).resolves.toEqual(…). Ver documentación. -
Expect
naserciones: Junto al existenteexpect.assertions(n), el nuevoexpect.hasAssertions()asegura que una prueba tenga al menos una aserción. -
Plugin Lint: Se añadió la regla
valid-expectaeslint-plugin-jestpara garantizar que se llame a una aserción tras invocarexpect. Esto previene errores como unexpect(banana);huérfano sin llamada a aserción. -
Plugins Pretty-Format: Se añadieron nuevos plugins pretty-format a Jest. Ahora formateamos elegantemente estructuras de datos Immutable.js y HtmlElements en fallos de aserción y snapshots.
-
Entorno Personalizado: Ahora puedes añadir una anotación
@jest-environment node|jsdomen el comentario doc-block de un archivo de prueba para usar un entorno diferente al predeterminado en pruebas individuales.
Aquí hay un ejemplo de cómo todas las nuevas APIs juntas harán las pruebas más encantadoras:
/**
* @jest-environment node
*/
test('compares apples and bananas', async () => {
expect.hasAssertions(); // Ensure this test has at least one assertion.
await expect(
Promise.resolve(Immutable.Map({apples: 1, bananas: 2})),
).resolves.toEqual(Immutable.Map({apples: 1, bananas: 3}));
expect('banana'); // valid-expect in eslint-plugin-jest will show an error.
});
Este ejemplo mostrará un error de prueba similar a este:

Cambios Rompedores
Como en cada lanzamiento importante, realizamos varios cambios significativos para permitir mejoras futuras y llevar la experiencia de pruebas a un nuevo nivel. Esta vez, nos esforzamos por modificar solo APIs que no afectarán a la mayoría de usuarios de Jest:
-
Bifurcación de Jasmine 2.5: Finalmente decidimos bifurcar Jasmine y tomar control del ejecutor de pruebas de Jest. Esto nos permitirá mejorar todos los aspectos de las pruebas unitarias en el futuro, pero por ahora nos enfocamos en reescrituras incrementales y reducir la superficie de la API. Si encuentras pruebas fallando por APIs de Jasmine que ahora faltan, debería existir un equivalente en los objetos
jestoexpect. Así mismo, eliminamos muchas características de Jasmine poco usadas en la mayoría de bases de código. -
Nuevas instantáneas en CI: Las instantáneas siempre deben guardarse junto con sus pruebas y módulos correspondientes. Modificamos Jest para no guardar nuevas instantáneas automáticamente en entornos de Integración Continua (CI) o al usar el flag
--ci. Para sobrescribir este comportamiento (generalmente no recomendado), usa el flag--updateSnapshot. -
Babel-Polyfill: Jest solía cargar
babel-polyfillautomáticamente al usar babel-jest, lo que causaba fugas de memoria dentro de Jest. En la mayoría de versiones de Node.js, no es necesario cargarbabel-polyfill, así que eliminamos esta carga automática. Ahora Jest solo incluyeregenerator-runtimepor defecto, usado comúnmente para soportar async/await en versiones antiguas de Node.js. Si necesitasbabel-polyfill, puedes cargarlo manualmente en tus archivos de configuración.
Otras mejoras
-
Documentación: La documentación es crucial para compartir buenas prácticas y enseñar a escribir pruebas efectivas que mejoren el software. Recientemente expandimos la documentación de Jest con un FAQ sobre Snapshot Testing, una guía de uso con bibliotecas JavaScript comunes, y documentación de las nuevas características mencionadas.
-
Traducciones: Pedimos tu ayuda para traducir la documentación de Jest y facilitar su aprendizaje.
-
Reporters personalizados: Jest ahora soporta reporters personalizados mediante la opción
reportersen la configuración. Puedes personalizar la salida de Jest e integrarlo con otras herramientas generando reportes en formatos como XML. Ver documentación. -
Salud del código: Solo fue posible iterar tan rápido en Jest gracias a dedicar tiempo significativo a la salud del códigobase. Fuimos adoptantes tempranos de prettier, aumentamos notablemente la cobertura de Flow, bifurcamos Jasmine para mejorar nuestra biblioteca de ejecución, y refactorizamos partes importantes de Jest para asegurar su éxito futuro.
-
Correcciones de errores: Como siempre, realizamos numerosas correcciones. El changelog completo está en el repositorio de Jest.
Charlas sobre Jest
Recientemente, el equipo central de Jest y colaboradores comenzaron a hablar más sobre Jest y su experiencia en conferencias:
-
Rogelio Guzman presentó Jest Snapshots and Beyond en React Conf.
-
Yo hablé sobre Building High-Quality JavaScript Tools en la conferencia F8 de Facebook.
Como siempre, este lanzamiento no habría sido posible sin ustedes, la comunidad de JavaScript. Estamos increíblemente agradecidos por tener la oportunidad de trabajar juntos para mejorar las pruebas en JavaScript. Si les gustaría contribuir a Jest, no duden en contactarnos en GitHub o en Discord.
