Aller au contenu principal

Jest 28 : Perte de poids et compatibilité accrue 🫶

· 9 minutes de lecture

Jest 28 est enfin là, et il est livré avec certaines fonctionnalités demandées depuis longtemps, telles que le support du partage de l'exécution de test sur plusieurs machines, les exports de paquets et la possibilité de personnaliser le comportement des faux temporisateurs. Il ne s'agit là que de quelques points marquants et nous en soulignerons d'autres dans cet article du blog.

De plus, comme annoncé dans l'article du blog consacré à Jest 27 l'année dernière, nous avons supprimé de l'installation par défaut certains paquets qui ne sont plus utilisés par défaut. En conséquence, la taille de l'installation a diminué d'environ 1/3.

Changements de rupture

The list of breaking changes is long (and can be seen fully in the changelog), but for migration purposes, we've also written a guide you can follow. Nous espérons que cela rendra la mise à jour aussi simple que possible !

Les principaux changements susceptibles d'avoir un impact sur votre migration sont l'abandon du support de Node 10 et 15 (mais pas de Node 12, qui sera désuet dans quelques jours) et quelques options de configuration renommées.

Veuillez noter que les deux modules supprimés (jest-environment-jsdom et jest-jasmine2) sont toujours activement maintenus et testés de la même manière, donc le seul changement est que vous devrez les installer explicitement.

Le guide devrait, nous l'espérons, rendre la migration triviale, mais notez que si vous utilisez directement l'un des paquets qui composent Jest (tels que jest-worker ou pretty-format), au lieu de simplement exécuter jest, vous devez passer par le changelog pour voir les changements de rupture.

Fonctionnalités

Parlons maintenant des nouvelles fonctionnalités de Jest 28, qui sont bien plus intéressantes ! Et il y en a pas mal, alors accrochez-vous.

Partage de l'exécution des tests

Jest inclut maintenant une nouvelle option CLI --shard, une contribution de Mario Nebl. Elle vous permet d'exécuter des parties de vos tests sur différentes machines, et a été l'une des plus anciennes demandes de fonctionnalités de Jest.

La propre suite de tests de Jest sur CI est passée d'environ 10 minutes à 3 sur Ubuntu, et sur Windows de 20 minutes à 7.

package.json exports

Jest a livré un support minimal des exports en 27.3. Cependant, il ne prenait en charge que le point d'entrée « principal » (.), et seulement si aucun champ main n'était présent dans package.json. Avec Jest 28, nous sommes heureux de vous offrir enfin un support complet !

En relation avec Jest 27, nous avons fourni une condition require ou import. Dans Jest 28, jest-environment-node fournira automatiquement les conditions node et node-addons tandis que jest-environment-jsdom fournira la condition browser.

Cela a été l'un des plus gros problèmes de compatibilité de Jest, et j'espère que cela sera résolu une fois pour toutes.

Faux temporisateurs

Jest 26 a introduit le concept de faux minuteurs « modernes », qui utilise @sinonjs/fake-timers sous le capot, et Jest 27 en a fait la valeur par défaut. Dans Jest 28, nous exposons désormais davantage l'implémentation sous-jacente par le biais des API de configuration et d'exécution. Un grand merci à Tom Mrazauskas qui a contribué à cette fonctionnalité !

Cela vous permet de ne pas simuler le processus process.nextTick qui améliore la compatibilité avec de fausse Promise, ou pour activer advanceTimers qui avance automatiquement les temporisateurs.

Veuillez consulter la configuration de fakeTimers pour plus de détails.

Rapporteur GitHub Actions

Jest est livré avec un rapporteur à utiliser sur GitHub Actions, qui utilisera des annotations pour afficher les erreurs de test en ligne.

Capture d'écran d'erreur de test des actions GitHub

Vous pouvez activer ce rapporteur en passant github-actions dans l'option de configuration reporters.

Un grand merci à Bernie Reiter et aux autres contributeurs pour nous avoir soutenus et avoir finalement obtenu cette fonctionnalité.

testEnvironmentOptions

Vous pouvez maintenant passer testEnvironmentOptions en ligne dans un fichier, comme vous pouvez définir l'environnement de test. Ceci est utile si vous voulez par exemple changer l'URL dans un seul fichier.

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

test('utilisez jsdom et définissez l\'URL dans ce fichier de test', () => {
expect(window.location.href).toBe('https://jestjs.io/');
});

Tous les globaux de Node.js

Si vous utilisez la nouvelle implémentation fetch dans Node v18, vous avez peut-être remarqué que cette fonction n'est pas disponible dans Jest. Le fait de devoir copier manuellement tous les globaux dans les globaux de test est un problème de longue date. Avec Jest 28, ce n'est plus un problème car nous inspectons maintenant l'environnement global dans lequel Jest lui-même s'exécute, et copions tous les globaux qui manquent dans l'environnement de test.

Modules ECMAScript

Peu de choses ont changé dans le support de Jest pour l'ESM natif depuis la sortie de Jest 27. Nous continuons à être bloqués par la stabilisation de Node, et nous espérons que cette situation s'améliorera plus tôt que tard !

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

Les URL de data:

Tommaso Bossi a contribué au support des URL de data, ce qui signifie que vous pouvez maintenant définir en ligne du JavaScript à exécuter sans utiliser eval.

import.meta.jest

Alors que vous avez pu accéder à jest via importer {jest} depuis '@jest/globals' dans Jest, nous avons reçu des commentaires sur le fait que c'est moins ergonomique que la variable (apparemment mais pas vraiment) globale jest disponible en CJS. Alors Jest 28 est livré avec import.meta.jest pour permettre un accès plus facile.

Divers

C'est beaucoup de fonctionnalités, et ce sont mes points forts. Cependant, nous avons encore beaucoup d'autres choses que je vais passer rapidement :

Résolveurs asynchrones

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

Fichiers de configuration asynchrones

Si vous avez un travail asynchrone que vous voulez faire en utilisant setupFiles, vous pouvez maintenant exporter une fonction async, que Jest va appeler et attendre avant de charger des tests.

Notez que cette fonctionnalité n'est disponible que pour CJS. Pour ESM, nous vous recommandons d'utiliser de niveau supérieur à la place.

Utilisation de globalThis

En interne, Jest a utilisé global pour se référer à l'environnement global. Cependant, comme cela n'existe que dans Node, et pas dans les navigateurs (window), cela a conduit à une incompatibilité lorsque vous essayez d'utiliser les modules de Jest dans un autre environnement.

Jest 28 utilise globalThis à la place, qui fonctionne dans tous les environnements.

JSDOM 19

Alors que, comme mentionné, Jest ne commercialise plus jest-environment-jsdom dans l'installation par défaut, il est toujours activement maintenu. Dans le cadre de cela, Jest 28 a fait une mise à jour de jsdom@16 à jsdom@19.

TypeScript

Si vous utilisez Jest avec TypeScript, soit dans vos tests ou lors de l'écriture de plugins tels que des exécuteurs personnalisés, Jest 28 apporte de nombreuses améliorations à nos types. Voici une liste non exhaustive des changements dans Jest 28.

expect

Lorsque vous utilisez attendez les propres types de(soit directement, ou via importer {expect} à partir de '@jest/globals'), il est enfin possible d'ajouter des matchers personnalisés. See our example for how to do this.

Plugins personnalisés

Si vous écrivez un exécuteur personnalisé, un reporteur de test, un résolveur ou autre chose, nous exportons maintenant plus de types qui devraient vous aider à taper ces types plus correctement. Il s'agit d'une cible en mouvement, donc si vous êtes l'auteur de quelque chose de branchable dans Jest et que les types ne sont pas aussi utiles qu'ils pourraient l'être, s'il vous plaît remplir un problème !

jest-runner-tsd

jest-runner-tsd est un exécuteur personnalisé pour exécuter des tests de type. C'est ce que Jest utilise lui-même pour tester nos types, et nous espérons qu'il pourra également être utilisé par d'autres ! Comme son nom l'indique, il est basé sur tsd, bien qu'il soit sous le capot utilise la fourche tsd-lite.


Toutes ces améliorations et corrections ont été apportées par Tom Mrazauskas. Merci beaucoup ! 👏

Enfin, la version minimale de support de TypeScript est maintenant 4.3.

jest-light-runner

La dernière chose que nous voulons mettre en évidence dans ce blog, est un nouveau coureur Jest très sympa, créé par Nicolò Ribaudo, appelé jest-light-runner. Cela prend presque tout le DX Jest est connu, et accélère sa vitesse en étant une abstraction plus petite sur le dessus de Node. Les tests de Babel sont devenus presque deux fois plus rapides après la migration. Tant qu'il y a des avertissements, l'existence de cet exécuteur devrait rendre encore plus facile pour les personnes qui ont des modules de Node plus petite taille de tester pour choisir Jest. Merci, Nicolò !

A venir

Alors que Jest 28 est arrivé presque un an après Jest 27, Jest 29 arrivera plus tôt, probablement dans quelques mois. Le plan actuel est alors d'avoir juste un changement de rupture (sauf suppression des versions du nœud), et c'est à défaut snapshotFormat à {escapeString: false, printBasicPrototype: false}. Cela rend les snapshots à la fois plus lisibles et plus faciles à coller.

Cela sera bien sûr possible de passer outre si vous ne voulez pas changer, mais vous pouvez aussi utiliser ces options aujourd'hui si vous ne voulez pas attendre !

Remerciements

Jest 28 contient des contributions de plus de 60 personnes, dont plus de deux tiers sont les premiers contributeurs. Merci beaucoup à tous les contributeurs, anciens et nouveaux. Sans vous, le projet ne serait pas aussi bon qu'il est ! J'aimerais particulièrement remercier Tom Mrazauskas et Feng Yu pour toutes leurs contributions, depuis le code, pour rendre le triage au débogage, qui a fait de Jest 28 ce qu'il est. Merci! 🙏

Merci d'avoir lu, et heureux Jesting! 🃏