Saltar al contenido principal

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:

  • [expect, jest-mock, pretty-format] Eliminación de archivos de compilación ES5 con un nuevo soporte mínimo de ES2015 (Node 8), que solo se usaban para compilaciones de navegador (#9945)

    Migración: Con este cambio, transferimos la responsabilidad de empaquetar los paquetes afectados a los usuarios, en lugar de que Jest los proporcione listos para usar, ya que ellos conocen mejor sus entornos objetivo. Si deseas recuperar esta funcionalidad, estamos abiertos a publicar estos paquetes por separado. ¡Se aceptan contribuciones (PRs)!

  • [jest-config, jest-resolve] Eliminación del soporte para el campo browser (#9943)

    Migración: Instala el módulo browser-resolve y usa la siguiente configuración:

    {
    "jest": {
    "resolver": "<rootDir>/resolver.js"
    }
    }
    // resolver.js
    const browserResolve = require('browser-resolve');

    module.exports = browserResolve.sync;
  • Las definiciones de TypeScript requieren un mínimo de TypeScript v3.8 (#9823)

Con estos cambios, Jest 26 ahora es 4 MiB más pequeño que Jest 25.5.4 (53 → 49 MiB). Ten en cuenta que muchas dependencias como Babel probablemente ya formen parte de tu proyecto. El tamaño propio de Jest se redujo en 1.2 MiB (4.3 → 3.1 MiB).

Aunque este es un buen comienzo, no es suficiente para que Jest sea significativamente más ligero. Planeamos reducir gradualmente el tamaño de Jest y su árbol de dependencias hasta en un 70%. La mayoría de los cambios para reducir la configuración predeterminada de Jest serán pequeños cambios importantes, y queremos involucrar a la comunidad tanto como sea posible. Por lo tanto, implementaremos los siguientes cambios en Jest 27 y Jest 28 usando un proceso de lanzamiento "Tic-Tac":

  • Jest 27 incluirá de forma predeterminada un nuevo ejecutor de pruebas "jest-circus" y el entorno Node.js. jest-jasmine2 y jest-environment-jsdom seguirán incluidos para que los usuarios puedan seguir usándolos cambiando una línea en la configuración.

  • Jest 28 eliminará jest-jasmine2 y jest-environment-jsdom de la distribución predeterminada de Jest. Los paquetes seguirán siendo mantenidos activamente como parte del proyecto Jest y se publicarán por separado. Los usuarios necesitarán instalar estos paquetes para usarlos.

Al actualizar a estas versiones principales, Jest te guiará a través de los cambios necesarios. Si deseas adelantarte y migrar a los nuevos valores predeterminados ahora, y tu proyecto no requiere un entorno DOM, puedes actualizar a Jest 26 y agregar las siguientes opciones de configuración:

{
"jest": {
"testEnvironment": "node",
"testRunner": "jest-circus/runner"
}
}

Jest seguirá incluyendo babel-jest activado por defecto. Actualmente impulsa varias funcionalidades de Jest más allá de compilar sintaxis moderna de JavaScript a algo comprensible para versiones actuales de Node.js y navegadores: también habilita la cobertura de código y el mocking de módulos ES en Jest. Actualmente Jest incluye soporte experimental para cobertura V8 y soporte nativo para Módulos ES (¡más sobre esto más adelante!). No es posible simular módulos ES estáticos según la especificación sin transformar primero el código, así que fomentaremos patrones que funcionen sin la transformación que hoy realizamos con Babel. Una vez que la cobertura V8 y el soporte nativo para ESM se estabilicen en Jest, también podremos eliminar babel-jest como predeterminado, pero seguiremos manteniéndolo.

Nuevos timers falsos

Con Jest 26 lanzamos una nueva implementación de timers falsos basada en @sinonjs/fake-timers. Llevamos años queriendo hacer esto y nos alegra que finalmente haya progresado lo suficiente para cubrir todos los casos de uso existentes de timers falsos en Jest.

La nueva implementación incluye funcionalidades adicionales como simulación de Date, queueMicrotask y más (consulte este README). Funciona de forma transparente usando las mismas APIs de temporizadores como jest.runAllTimers() – revisa la documentación en nuestro sitio web.

Confiamos en que esta implementación está lista para producción, pero no queremos obligar a reescribir tests si dependen de diferencias sutiles entre la implementación antigua y la nueva. En Jest 26, esta nueva implementación será opcional y puede activarse llamando a jest.useFakeTimers('modern') o pasando modern a la opción timers en tu configuración si ya usabas timers falsos en todos los tests.

En Jest 27 cambiaremos la implementación predeterminada a la versión "moderna", pero seguiremos dando soporte y manteniendo la implementación legacy que puede usarse con jest.useFakeTimers('legacy'). Si no estás seguro de poder actualizar todos tus tests para cuando salga Jest 27, puedes agregar esto ahora a tus tests para mantener el comportamiento anterior.

¡Agradecemos a Carl-Erik Kopseng, Benjamin Gruenbaum y otros mantenedores de @sinonjs/fake-timers por su ayuda y paciencia al colaborar con nosotros para hacer esto posible! Emocionante.

Una nueva forma de usar Jest - @jest/globals

Jest ha dependido de globales popularizados por el framework de pruebas Jasmine y otros, como describe, it, test y expect. Si bien este es un patrón ampliamente usado, muchas personas prefieren importar funciones de pruebas en lugar de usar globales. Para cubrir este caso, añadimos un nuevo paquete @jest/globals que permite importar funciones de pruebas: import {expect, jest, test} from '@jest/globals';.

Consideraciones:

  • Actualmente los globales aún existen en el entorno, pero introduciremos un modo para deshabilitarlos en el futuro. Tampoco puedes usar const jest = require('@jest/globals') porque la variable jest sigue siendo global por ahora.

  • Actualmente no hay forma de añadir matchers personalizados a las definiciones de TypeScript al usar globales así.

  • Si bien esto permite ejecutar tests sin globales, aún no permite ejecutarlos sin el runner de pruebas de Jest.

Soporte nativo para ESM

Como mencionamos en la publicación de Jest 25, hemos estado trabajando en el soporte nativo para los Módulos ECMAScript. Aún no es estable, pero ya está listo para ser probado. ¡Nos encantaría recibir tus comentarios y reportes de errores! Para ver el estado actual, puedes consultar este issue o buscar todos los issues con la etiqueta ES Modules.

Otros Cambios Rompedores en Jest 26

  • Se eliminó el soporte para Node 8 (#9423)

  • [jest-environment-jsdom] Actualización de jsdom a v16 (#9606)

  • [jest-runtime] Eliminación de los métodos obsoletos require.requireActual y require.requireMock (#9854)

  • [jest-haste-map] Eliminación de providesModuleNodeModules (#8535)

  • [jest-circus] Los tests fallarán si una prueba utiliza un callback done y tiene valores de retorno (#9129)

  • [jest-circus] Se lanzará un error adecuado si una prueba o hook se define de forma asíncrona (#8096)

Cuídense

Actualmente todos estamos viviendo un tiempo de incertidumbre sin precedentes. Si tienes dificultades económicas, nos gustaría utilizar el fondo Open Collective de Jest para ayudar a los contribuidores nuevos y existentes. Asignamos recompensas a algunos issues y estamos abiertos a ofrecer recompensas en cualquiera de nuestros issues abiertos actuales. Puedes mencionar que un issue debería tener una recompensa en el mismo issue o contactar a @cpojer mediante mensaje privado en Twitter.

Por favor, cuídense.