Jest 25 : 🚀 Poser les fondations du futur
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 25 pose les bases de nombreux changements majeurs à venir. Nous avons donc limité au maximum les breaking changes, mais les modifications d'architecture interne pourraient nécessiter une attention particulière lors de la mise à jour. Les principaux changements sont : mise à jour de JSDOM de la v11 à la v15, exécution des tests 10 à 15 % plus rapide, nouvelle vue diff pour les snapshots obsolètes et abandon du support de Node 6.
Plus de 200 commits ont été réalisés depuis Jest 24.9 par plus de 80 contributeurs différents. Comme toujours, consultez le changelog pour la liste complète des modifications.
Adieu Node 6
Node 6 a atteint sa fin de vie le 30 avril 2019, et Jest 25 tourne la page. Abandonner Node 6 nous permet de mettre à jour nos dépendances, la principale étant JSDOM, désormais en version 15. Cette mise à jour signifie également que nous n'avons plus besoin de transpiler la syntaxe async-await, ce qui entraîne à la fois une exécution du code plus rapide et une consommation mémoire réduite. Bonus : le code transpilé de Jest devrait être plus facile à déboguer si vous vous aventurez dans ce terrier particulier.
Bien que Node 8 ait également atteint sa fin de vie, Jest 25 continue de le supporter pour faciliter la mise à jour pour ceux qui utilisent encore Node 8. Cela implique cependant des compromis, comme le fait que JSDOM v16 a été publié sans support de Node 8. Vous devrez donc utiliser jest-environment-jsdom-sixteen si vous souhaitez utiliser la dernière version.
Améliorations des performances
Nous avons reçu des rapports indiquant que Jest avait ralenti au cours des dernières versions. Jest 25 inclut Micromatch mis à jour, ce qui apporte des gains considérables au démarrage, ainsi que des corrections de bugs et optimisations qui ramènent Jest à la vitesse qu'il avait avec Jest 23. Pour Jest lui-même, comme mentionné en début d'article, cela signifie une réduction de 10 à 15 % du temps d'exécution des tests. Nous cherchons bien sûr toujours à nous améliorer, alors testez par rapport aux versions antérieures et ouvrez des issues si nous pouvons faire mieux !
Couverture de code V8
L'instrumentation de couverture de code actuelle de Jest repose sur babel-plugin-istanbul qui insère du code de collecte avant la génération des rapports. Cependant, cette approche est assez lente et gourmande en mémoire, surtout pour les gros fichiers et bases de code. Heureusement, V8 intègre nativement la couverture de code, de plus en plus utilisable dans Node grâce au travail de Benjamin Coe et des équipes V8 et Node.js. Jest 25 offre un support expérimental via le nouveau flag --coverage-provider. Consultez sa documentation pour les limitations et son utilisation.
Penser vite et lentement quand les tests échouent
L'effort inutile pour interpréter les rapports d'échec entrave :
-
"penser vite" pour reconnaître des motifs issus de votre expérience
-
"penser lentement" pour analyser les changements et déterminer s'ils sont des évolutions attendues ou des régressions inattendues
Jest 25 parachève un effort commencé dans Jest 24 pour améliorer tous les matchers :
-
ligne de description correcte, incluant les modificateurs
.rejects,.resolveset.not -
libellés concis et alignement cohérent pour les valeurs attendues et reçues
-
surlignage inverse des différences de sous-chaînes quand les valeurs sont des strings
-
comptage des lignes modifiées pour déterminer s'il s'agit de suppressions ou d'insertions
Un grand merci au mainteneur Jest Mark Pedrotti pour avoir mené cet effort et son travail continu pour optimiser les erreurs d'assertion.
Couleurs des différences quand les snapshots échouent
Le changement le plus visible pour remplacer la confusion par la confiance concerne les couleurs des lignes modifiées dans les différences lorsque les tests de capture échouent :
-
- Snapshotpasse du vert au magenta -
+ Receivedpasse du rouge au turquoise en premier plan sur fond cyan/aqua
Exemples de rapports de tests de capture (avant à gauche et après à droite)
- Le décompte des lignes modifiées confirme votre première impression sur la direction du changement (lignes supprimées ou insérées)

- Les couleurs de fond attirent votre regard pour comparer les lignes modifiées adjacentes

- Les couleurs de fond vous aident aussi à identifier quels tests
toThrownécessitent une décision de mise à jour de la capture

Voici pourquoi nous avons choisi ces couleurs distinctives :
-
Les 95% de personnes ayant une vision colorimétrique normale peuvent immédiatement distinguer les rapports de tests de capture des autres matchers.
-
Cela résout le conflit entre la signification vert/rouge dans les tests Jest versus rouge/vert dans les revues de code.
-
Contrairement au rouge/vert qui suggère que la mise à jour est l'action par défaut, ce choix indique que les différences nécessitent un examen minutieux pour détecter d'éventuelles régressions dans les échecs locaux de tests de capture.
L'écart de teinte entre le magenta (300°) et le turquoise/cyan/aqua (180°) améliore l'accessibilité visuelle, et le fond clair des lignes modifiées garantit un contraste constant sur les thèmes sombres et clairs.
Si vous maintenez un outil en ligne de commande, vous trouverez des pistes pour améliorer son accessibilité dans #9132.
Prise en charge des modules ECMAScript (ESM)
Node 13 supporte nativement les ESM, et nous avons entamé des travaux préliminaires pour leur prise en charge dans Jest. Jest 25 accepte désormais les fichiers de configuration jest.config.cjs et jest.config.mjs, mais les tests eux-mêmes ne peuvent pas encore utiliser ESM sans transformation via Babel ou TypeScript en CJS.
Les API que Jest utilisera sont encore expérimentales - ne comptez pas sur un support immédiat. L'équipe Modules de Node.js travaille activement sur ces APIs. Nous suivrons leur évolution pour fournir des retours. Suivez cette issue pour les avancées sur l'implémentation dans Jest.
Autres améliorations et mises à jour
-
Jest dépasse désormais 1000 contributeurs uniques. Un jalon remarquable ! Merci à tous ceux qui rendent les tests plus agréables.
-
Grâce à Josh Rosenstein, Jest prend désormais en charge
BigIntdans la plupart des matchers commetoBeGreaterThan. Jest comprend aussi nativement les littéraux bigint. -
La fonctionnalité
--detect-leaksétait inopérante sur Node 12+ - ce problème est corrigé dans Jest 25. -
Comme annoncé pour Jest 24, la base de code de Jest a été réécrite en TypeScript (finalisé dans Jest 24.3). Si vous utilisez des composants isolés de Jest, bénéficiez d'une meilleure intégration IDE. Nous travaillons à améliorer la compatibilité des mocks avec les systèmes de types - vos contributions sont les bienvenues ici ! Nous étudions aussi le transfert des typages d'utilisation depuis DefinitelyTyped vers Jest.
-
Le paquet
jest-diffexporte désormais des fonctions commediffLinesUnifiedetdiffStringsUnifiedavec des options de configuration, permettant à d'autres applications de formater les différences de manière personnalisée. Pour plus d'informations et des exemples de code, consultez son nouveau fichierREADME.mddans le dépôt Jest ou sur les dépôts de paquets. -
Grâce au membre de la communauté Wei An An, Jest ne mettra plus en évidence les matchers asymétriques qui réussissent dans les erreurs d'attente. C'était un point problématique de longue date avec les matchers asymétriques, et nous sommes ravis qu'il soit enfin résolu.
-
Pour la deuxième année consécutive, Jest a remporté le prix de la plus grande satisfaction du State of JS. Nous sommes extrêmement reconnaissants envers la communauté pour son soutien, et espérons capitaliser sur cet élan pour rendre 2020 encore meilleur !
Plans pour l'avenir
-
La configuration de Jest est vaste et quelque peu maladroite - il existe souvent au moins deux façons de faire la même chose, parfois plus encore. Pour Jest 26, nous espérons condenser la configuration et la rendre plus prévisible. Consultez cette issue pour plus de détails.
-
Nous espérons également fournir une API programmatique appropriée pour exécuter Jest, facilitant ainsi son intégration dans les IDE et autres outils. Suivez cette issue pour le suivi.
-
Une PR ouverte propose d'ajouter Lolex comme implémentation des faux minuteries de Jest depuis décembre 2017. Bien que nous ne l'intégrions pas aux API publiques de Jest 25, son support est techniquement inclus. Nous étudions comment l'exposer pour permettre des tests et expérimentations. Son utilisation permet de simuler
Dateet d'autres fonctions de minuterie que Jest ne prend actuellement pas en charge. Notez que cela reste expérimental, et un support API approprié viendra dans une version ultérieure. Suivez cette PR pour les dernières actualisations.
Bon test ! 🃏
