Saltar al contenido principal

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.

Sitio web nuevo

@orta ha proporcionado un hermoso rediseño del sitio web de Jest, implementado por los miembros de la comunidad @montogeek y @brainkim.

El objetivo del rediseño fue destacar más lo que hace a Jest increíble y desvincular la idea de que Jest es principalmente una herramienta para probar aplicaciones React: puedes usar Jest con todo tipo de proyectos y queremos que eso sea evidente. Puedes leer más sobre las ideas detrás del rediseño en este issue.

Soporte para TypeScript

Hemos actualizado internamente a Babel 7 para Jest 24, lo que incluye soporte para proyectos TypeScript. Esto significa que Jest puede transpilar TypeScript directamente, siempre que configures Babel para usarlo con @babel/preset-typescript. Una limitación del soporte predeterminado para TypeScript, similar a Flow, es que Babel solo eliminará las anotaciones de tipo para que tu código sea JavaScript válido. No verificará los tipos de tu código.

Aunque Jest ha admitido Babel 7 desde la versión 22 lanzada en diciembre de 2017, requería el uso de un módulo puente para adaptarse al soporte de Babel 6 en Jest. En Jest 24 hemos migrado completamente a Babel 7, con gran ayuda del miembro de la comunidad @milesj. Esto significa que la configuración ahora es más fácil y podemos aprovechar otras características de Babel 7, como la carga de configuración y la transpilación automática de modules. Asegúrate de eliminar babel-core@^7.0.0-bridge.0 ya que ya no es necesario.

Si deseas ejecutar verificaciones de tipos mientras pruebas, deberías usar ts-jest. Necesitarás configurar el transformador, ya que por defecto Jest aplica Babel a archivos .ts (y .tsx). Alternativamente, puedes ejecutar tsc o incluso usar un runner de Jest para transpilar tu TypeScript mientras ejecutas tus pruebas. Consulta jest-runner-tsc para más información.

Consulta la documentación para más detalles.

consejo

Si por alguna razón no puedes actualizar a Babel 7, aún puedes usar Jest 24 con babel@6 siempre que mantengas babel-jest en la versión 23.

test.todo

Jest 23 introdujo un cambio que hacía que las pruebas sin implementación generaran un error en lugar de omitirse. Este cambio se realizó debido a comentarios de que las pruebas omitidas accidentalmente eran difíciles de detectar y rastrear. Sin embargo, este cambio afectó el flujo de trabajo de muchos desarrolladores que usaban esta función para planificar qué pruebas escribir.

En Jest 24, abordamos este problema agregando un test.todo explícito (inspirado en el excelente AVA), que se mostrará por separado en el resumen de pruebas. Te permite esbozar rápidamente qué pruebas deseas escribir, y en el futuro, una regla de ESLint incluso podría advertirte si olvidaste escribir algunas pruebas.

test.todo('invalid input should throw');

test.todo('missing options should be normalized');

test.todo

Mejores mensajes de aserción

Cuando fallan las pruebas, necesitas tomar decisiones seguras y correctas sobre qué cambios son progresos esperados y cuáles son regresiones inesperadas. Es especialmente importante no pasar por alto algunas regresiones ocultas entre mucho progreso. Jest 24 hace que los informes cuando fallan las aserciones sean más claros y concisos para varios comparadores. Como el esfuerzo continuará en Jest 25, podrías notar algunas inconsistencias temporales. Si tus pruebas nunca fallan, no las verás; para el resto, será más fácil depurar por qué algo no funciona como se espera. Gracias al arduo trabajo de @ittordepam y otros colaboradores de la comunidad.

Puedes ver estos cambios en todos estos PRs: 7621, 7557, 7448, 7325, 7241, 7152, 7125, 7107, 6961.

Ejemplos:

Aserción fallida

failing assertion

Error de tipo

different types

Función simulada no llamada

mock functions

Solucionando viejos problemas

Hemos solucionado un par de problemas muy antiguos en esta versión.

El primero que queremos destacar es la desaparición de declaraciones console.log. Jest intercepta y recopila todos los registros para darte un rastreo de pila, así como proporcionarlos a los reportadores para que los manejes como quieras. Sin embargo, esto ha llevado a un problema donde simplemente desaparecían en ciertos casos extremos. Afortunadamente para Jest 24, @spion ha dado un paso al frente y solucionado este problema. ¡Muchas gracias!

El segundo es un problema donde Jest se queda sin memoria si la diferencia en la serialización del valor esperado y recibido tiene un gran número de inserciones (ya sea inesperado por un error en la prueba o defecto en el serializador, o esperado durante fallos temporales en el desarrollo guiado por pruebas). @ittordepam ha reemplazado el algoritmo anterior de diferencias con el paquete diff-sequences, que debería solucionar este problema porque usa la cantidad mínima teórica de memoria. Abre la posibilidad para diferencias por palabras en el futuro, similar a lo que proporciona git. Por favor, consulta este PR y no dudes en contactarnos si quieres ayudar a que eso suceda.

Otros aspectos destacados

  • Tenemos algunas mejoras para globalSetup y globalTeardown: la transformación de código se aplicará a ellos de manera similar a setupFiles y ahora son compatibles como parte de projects.

  • Puedes configurar la ubicación de los snapshots de Jest, lo cual es útil principalmente si estás construyendo herramientas que usan Jest en un proceso de construcción más grande.

  • Una particularidad de la CLI de Jest era que mientras algunas opciones usaban camelCase (como runInBand), otras no (como no-cache). En Jest 24, ambos formatos son reconocidos, lo que significa que puedes escribir los argumentos de la CLI como prefieras.

  • Hemos renombrado setupTestFrameworkScriptFile a setupFilesAfterEnv, y lo convertimos en un array. Esperamos que esto haga más evidente el propósito de esta opción. Tenemos planes para renovar más la configuración en la próxima versión mayor; consulta el párrafo en la sección siguiente.

  • Para reducir la "magia" que Jest realiza para "simplemente funcionar™", en esta versión decidimos eliminar la inyección automática de regenerator-runtime, que a veces se usa en código asíncrono compilado. Incluir regenerator-runtime no siempre es necesario y creemos que es responsabilidad del usuario incluirlo si es necesario. Si usas @babel/preset-env con targets configurado para una versión moderna de Node (ej. Node 6+), no necesitarás incluirlo. Consulta nuestra documentación sobre Uso de Babel para más información.

  • Node.js 10 incluyó un módulo experimental llamado worker_threads, similar a los Worker threads del navegador. jest-worker, parte de la plataforma Jest, podrá usar worker_threads si está disponible en lugar de child_process, ¡lo que lo hace aún más rápido! Los benchmarks muestran una mejora del 50%. Debido a su naturaleza experimental, no está activado cuando se usa Jest como ejecutor de pruebas, pero ¡puedes usarlo en tus proyectos hoy mismo! Planeamos activarlo por defecto cuando pierda su estatus experimental en Node.js.

Cambios Rompedores

Aunque todos los cambios importantes están listados en el changelog, hay algunos que vale la pena destacar:

  • Actualizamos a Micromatch 3. Esto podría no afectar a todos los usuarios, pero es más estricto al interpretar globs que la versión 2 usada en Jest 23. Lee este hilo y los issues relacionados para ver ejemplos de globs inválidos en caso de problemas.

  • Eliminamos restos de código necesarios para Node 4. Anteriormente era técnicamente posible ejecutar Jest 23 en Node 4, pero ya no es posible sin polyfills y transpilación.

  • Cambios en la serialización de funciones mock en snapshots: verifica cuidadosamente tus snapshots actualizados después de la actualización. PR relacionado.

  • Jest ya no inyecta automáticamente regenerator-runtime. Si ves errores relacionados, asegúrate de configurar Babel para transpilar correctamente funciones async, usando por ejemplo @babel/preset-env. PR relacionado.

El futuro

Nos sentimos profundamente honrados por los resultados en State Of JS 2018, donde Jest ganó el premio "Mayor Satisfacción". Otro gran hito en 2018 fue en octubre, cuando Jest superó por primera vez los 2 millones de descargas semanales. Gracias.

Estamos muy agradecidos por la confianza que la comunidad ha depositado en nosotros, y esperamos consolidarla en el futuro. Aseguraremos que Jest 24 y futuras versiones sigan construyendo sobre esta increíble base, y continúen siendo parte integral del kit de herramientas de los desarrolladores JavaScript.

Esta ha sido la primera versión donde hemos explorado la idea de usar nuestros fondos de Open Collective para crear programas de recompensas por errores. Funcionó bien para involucrar a desarrolladores externos en la implementación de la nueva página de inicio, y somos optimistas respecto a un error persistente donde los globales de Jest no coinciden con los globales de Node. Nos encantaría hacer más de esto: si tienes un error recurrente que sea buen candidato para nuestro programa de recompensas, por favor avísanos. Mientras tanto, puedes encontrar todos los tickets con recompensa mediante la etiqueta de issues.

Ya hemos empezado a planificar la próxima versión de Jest 25, donde la mayor característica planeada será una renovación completa de nuestra configuración, que actualmente es bastante difícil de entender debido a opciones superpuestas y la mezcla de globs con expresiones regulares. Agradecemos mucho los comentarios sobre cómo te gustaría que fuera la configuración de Jest, que puedes compartir en este issue.

Quizás también hayas escuchado que planeamos migrar la base de código de Flow a TypeScript. Confiamos en que esta migración permitirá que más colaboradores se sumen para hacer del 2019 un año aún mejor para las pruebas en JavaScript. 🚀 El plan es implementar esto en una versión menor en un futuro no muy lejano. Puedes dejar tus comentarios sobre esta decisión en el RFC.

Por último, si alguna vez te has preguntado cómo está construido Jest, @cpojer ha grabado un video con una visión arquitectónica sobre cómo funciona Jest internamente. No dudes en contactarnos si tienes más preguntas al respecto. El video está disponible en nuestro sitio web.

¡Feliz testing con Jest! 🃏