Aller au contenu principal

Jest 28 : Alléger et améliorer la compatibilité 🫶

· 9 min de lecture
Simen Bekkhus
Simen Bekkhus
Traduction Bêta Non Officielle

Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →

Jest 28 est enfin là ! Cette version inclut des fonctionnalités longtemps demandées comme le support du sharding pour répartir l'exécution des tests sur plusieurs machines, les package exports et la possibilité de personnaliser le comportement des fake timers. Ce ne sont que quelques points forts personnels, et nous allons en présenter davantage dans cet article.

De plus, comme annoncé dans l'article sur Jest 27 l'année dernière, nous avons retiré certains packages inutilisés par défaut de l'installation standard. Résultat : la taille d'installation a été réduite d'environ un tiers.

Changements cassants

La liste des changements cassants est longue (consultable dans le changelog). Pour faciliter la migration, nous avons rédigé un guide à suivre. Nous espérons que cela rendra la mise à jour aussi fluide que possible !

Les principaux changements cassants concernant votre migration sont l'abandon du support de Node 10 et 15 (mais pas Node 12, dont la fin de vie arrive dans quelques jours) et le renommage de certaines options de configuration.

Notez que les modules retirés (jest-environment-jsdom et jest-jasmine2) restent activement maintenus et testés de la même manière. Le seul changement ici est que vous devrez les installer explicitement.

Ce guide devrait simplifier la migration, mais sachez que si vous utilisez directement des packages composant Jest (comme jest-worker ou pretty-format) au lieu d'exécuter simplement jest, vous devrez consulter le changelog pour voir les éventuels changements cassants.

Fonctionnalités

Passons maintenant aux nouvelles fonctionnalités de Jest 28, bien plus enthousiasmantes ! Elles sont nombreuses, alors attachez vos ceintures.

Sharding des tests

Jest inclut désormais une nouvelle option CLI --shard, contribuée par Mario Nebl. Elle permet d'exécuter des parties de vos tests sur différentes machines, répondant à l'une des demandes les plus anciennes pour Jest.

La suite de tests de Jest elle-même est passée d'environ 10 à 3 minutes sur Ubuntu en CI, et de 20 à 7 minutes sur Windows.

package.json exports

Jest offrait un support minimal des exports depuis la 27.3, mais uniquement pour le point d'entrée principal (.) et seulement si aucun champ main n'était présent dans package.json. Avec Jest 28, nous sommes ravis d'offrir un support complet !

Connexe : dans Jest 27, nous fournissions soit la condition require soit import. Dans Jest 28, jest-environment-node fournira automatiquement les conditions node et node-addons, tandis que jest-environment-jsdom fournira la condition browser.

C'était l'un des plus gros problèmes de compatibilité de Jest, et nous espérons qu'il est désormais résolu une fois pour toutes.

Fake timers

Jest 26 introduisait les fake timers "modernes" utilisant @sinonjs/fake-timers, et Jest 27 les rendait par défaut. Dans Jest 28, nous exposons davantage l'implémentation sous-jacente via des APIs de configuration et d'exécution. Un immense merci à Tom Mrazauskas pour cette contribution !

Cela vous permet d'éviter de simuler process.nextTick, ce qui améliore la compatibilité avec les Promise simulées, ou d'activer advanceTimers qui fait automatiquement avancer les minuteries.

Voir la configuration fakeTimers pour plus de détails.

Reporter GitHub Actions

Jest inclut désormais un reporter spécifique pour GitHub Actions, qui utilise des annotations pour afficher les erreurs de test directement dans le code.

Capture d'écran d'erreur de test dans GitHub Actions

Vous pouvez activer ce reporter en spécifiant github-actions dans l'option de configuration reporters.

Un immense merci à Bernie Reiter et aux autres contributeurs pour leur persévérance qui a permis de concrétiser cette fonctionnalité.

Options testEnvironmentOptions en ligne

Vous pouvez désormais passer les options testEnvironmentOptions directement dans un fichier, comme pour l'environnement de test. C'est utile si vous souhaitez par exemple modifier l'URL dans un seul fichier.

/**
* @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/');
});

Toutes les variables globales Node.js

Si vous utilisez la nouvelle implémentation de fetch dans Node v18, vous avez peut-être remarqué que cette fonction n'est pas disponible dans Jest. C'était un problème de longue date qui nous obligeait à copier manuellement les variables globales dans les globales de test. Avec Jest 28, ce n'est plus un problème car nous inspectons désormais l'environnement global dans lequel Jest lui-même s'exécute, et copions toutes les variables globales manquantes dans l'environnement de test.

Modules ECMAScript

Peu de choses ont changé dans le support d'ESM natif de Jest depuis la sortie de Jest 27. Nous restons bloqués par la stabilisation dans Node, et espérons que cette situation s'améliorera rapidement !

Cependant, nous avons pu ajouter quelques nouvelles fonctionnalités dans Jest 28.

URLs data:

Tommaso Bossi a contribué au support des URLs data, vous permettant désormais de définir du JavaScript directement dans le code sans utiliser eval.

import.meta.jest

Bien qu'il soit possible d'accéder à jest via import {jest} from '@jest/globals', nous avons reçu des retours indiquant que cette approche est moins ergonomique que la variable globale jest (apparemment, mais pas réellement globale) disponible en CJS. Jest 28 introduit donc import.meta.jest pour un accès plus simple.

Divers

Voilà déjà beaucoup de fonctionnalités, qui sont mes points forts personnels. Cependant, nous en avons encore d'autres que je vais parcourir rapidement :

Résolveurs asynchrones

Ian VanSchooten a contribué au support des résolveurs asynchrones, permettant à des outils comme Vite d'avoir de meilleures intégrations avec Jest.

Fichiers de configuration asynchrones

Si vous avez du travail asynchrone à effectuer avec setupFiles, vous pouvez désormais exporter une async function que Jest appellera et attendra avant de charger les tests.

Notez que cette fonctionnalité n'est disponible qu'en CJS. Pour les ESM, nous recommandons plutôt d'utiliser await au niveau supérieur.

Utilisation de globalThis

En interne, Jest utilisait global pour faire référence à l'environnement global. Cependant, comme cela n'existe que dans Node et non dans les navigateurs (window), cela créait des incompatibilités lors de l'utilisation des modules Jest dans d'autres environnements.

Jest 28 utilise désormais globalThis, qui fonctionne dans tous les environnements.

JSDOM 19

Comme mentionné, Jest n'inclut plus jest-environment-jsdom dans l'installation par défaut, mais il reste activement maintenu. Dans cette optique, Jest 28 est passé de jsdom@16 à jsdom@19.

TypeScript

Si vous utilisez Jest avec TypeScript, que ce soit dans vos tests ou pour écrire des plugins comme des runners personnalisés, Jest 28 propose d'importantes améliorations de typage. Voici une liste non exhaustive des changements dans Jest 28.

expect

Lorsque vous utilisez les types propres à expect (directement ou via import {expect} from '@jest/globals'), il est enfin possible d'ajouter des matchers personnalisés. Consultez notre exemple pour voir comment procéder.

Plugins personnalisés

Si vous écrivez un runner personnalisé, un rapporteur de tests, un résolveur ou autre, nous exportons désormais plus de types pour vous aider à mieux typer ces éléments. Ce domaine évoluant rapidement, si vous développez des extensions pour Jest et que les types ne sont pas assez utiles, n'hésitez pas à ouvrir un ticket !

jest-runner-tsd

jest-runner-tsd est un runner personnalisé pour exécuter des tests de typage. Jest l'utilise lui-même pour tester ses types, et nous espérons qu'il pourra servir à d'autres ! Comme son nom l'indique, il est basé sur tsd, bien qu'il utilise en réalité le fork tsd-lite.


Toutes ces améliorations et corrections ont été contribuées par Tom Mrazauskas. Un immense merci, Tom ! 👏

Enfin, la version minimale prise en charge de TypeScript est désormais la 4.3.

jest-light-runner

Le dernier élément que nous souhaitons mettre en avant dans cet article est un nouveau runner Jest très innovant, créé par Nicolò Ribaudo : jest-light-runner. Il conserve quasiment toute l'expérience développeur propre à Jest tout en accélérant considérablement les tests grâce à une abstraction plus légère au-dessus de Node. Les tests de Babel sont devenus presque deux fois plus rapides après sa migration. Bien qu'il y ait des limites, ce runner devrait faciliter encore plus l'adoption de Jest pour tester de petits modules Node. Merci Nicolò !

Futur

Alors que Jest 28 est arrivé presque un an après Jest 27, Jest 29 arrivera plus rapidement, probablement dans quelques mois. Le changement cassant prévu (hormis l'abandon de versions de Node) sera de définir par défaut snapshotFormat sur {escapeString: false, printBasicPrototype: false}. Cela rendra les snapshots plus lisibles et plus faciles à copier-coller.

Vous pourrez bien sûr outrepasser ce comportement si vous ne souhaitez pas changer, mais vous pouvez déjà utiliser ces options dès aujourd'hui si vous n'avez pas envie d'attendre !

Remerciements

Jest 28 a reçu les contributions de plus de 60 personnes, dont plus des deux tiers étaient des contributeurs pour la première fois. Un immense merci à tous les contributeurs, anciens et nouveaux. Sans vous, le projet ne serait pas aussi abouti qu'il ne l'est aujourd'hui ! Je tiens tout particulièrement à remercier Tom Mrazauskas et Feng Yu pour toutes leurs contributions, du code au triage des problèmes en passant par le débogage, qui ont façonné Jest 28. Merci ! 🙏

Merci de votre lecture, et bon test avec Jest ! 🃏