Jest 28 : Perte de poids et compatibilité accrue 🫶
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
La liste des changements de rupture est longue (et peut être vue entièrement dans le changelog), mais pour des raisons de migration, nous avons également écrit un guide que vous pouvez suivre. 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.
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. Voir notre exemple pour savoir comment faire cela.
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! 🃏