Aller au contenu principal

Jest 25¬†: ūüöÄ pose des fondations pour le futur

Jest 25 pose les bases de nombreux changements majeurs à l'avenir. Nous avons donc limité au maximum les changements de rupture, mais les modifications de l'architecture interne peuvent nécessiter une attention particulière pendant la mise à niveau. Les principaux changements sont une mise à niveau de JSDOM de la v11 à la v15, des tests 10-15% plus rapides, une nouvelle vue diff pour les instantanés périmés et l'abandon du support de Node 6.

There has been more than 200 commits since Jest 24.9 by more than 80 different contributors, so as always, take a look at the changelog for a full list of changes.

Au revoir Node 6#

Node 6 est en fin de vie depuis le 30 avril 2019, et Jest 25 le laisse derrière lui. L'abandon de Node 6 signifie que nous pouvons mettre à jour nos dépendances, la principale étant JSDOM, qui a été mise à jour à la version 15. La mise à niveau signifie également que nous ne devons plus transpiler la syntaxe async-await, ce qui se traduit à la fois par une exécution plus rapide du code et une moindre consommation de mémoire. En prime, le code transpilé de Jest devrait être plus facile à déboguer si quelqu'un se retrouve à dévaler cette pente.

Même si Node 8 est également entré en fin de vie, Jest 25 continuera à le prendre en charge afin de rendre la mise à niveau aussi facile que possible pour ceux d'entre nous qui prennent encore en charge Node 8. Elle s'accompagne cependant de quelques compromis, comme le fait que JSDOM v16 a été publié sans le support de Node 8, vous devrez donc utiliser jest-environment-jsdom-sixteen si vous voulez utiliser la dernière version.

Améliorations des performances#

Nous avons reçu des rapports indiquant que Jest a ralenti au cours des deux dernières versions. Jest 25 comprend une mise à jour de Micromatch, qui apporte des gains énormes en temps de démarrage, et quelques corrections de bogues et ajustements de performance qui ramène Jest à la vitesse à laquelle il était pour Jest 23. Pour Jest lui-même, comme mentionné au début de cet article, cela signifie une réduction de 10-15% du temps d'exécution des tests. Bien entendu, nous cherchons toujours à nous améliorer, alors n'hésitez pas à comparer les résultats avec ceux des versions précédentes et à signaler les problèmes qui pourraient survenir !

Couverture de code V8#

L'instrumentation de couverture de code actuelle de Jest est aliment√©e par babel-plugin-istanbul qui ins√®re du code de collecte de couverture de code avant de cr√©er des rapports. Cependant, cette m√©thode est assez lente et gourmande en m√©moire, surtout pour les fichiers et les bases de code volumineux. Heureusement, V8 a une couverture de code int√©gr√©e, qui devient de plus en plus utilisable dans Node gr√Ęce au travail acharn√© de Benjamin Coe et d'autres membres des √©quipes V8 et Node.js. Jest 25 est livr√© avec un support exp√©rimental pour cela via un nouveau drapeau --coverage-provider. Veuillez consulter sa documentation pour les avertissements et la fa√ßon de l'utiliser.

Penser vite et lentement quand les tests échouent#

Les efforts inutiles pour interpréter les rapports en cas d'échec des tests sont un frein :

  • ¬ę¬†penser rapidement¬†¬Ľ pour reconna√ģtre les mod√®les de votre exp√©rience pass√©e
  • ¬ę¬†penser lentement¬†¬Ľ pour analyser les changements et d√©cider s'il s'agit de progr√®s attendus ou de r√©gressions inattendues

Jest 25 achève la seconde moitié d'un effort commencé en Jest 24 pour améliorer tous les comparateurs :

  • une ligne de description correcte, y compris les modificateurs .rejects, .resolves et .not
  • des libell√©s concis et un alignement uniforme pour les valeurs attendues et re√ßues
  • inverse la mise en √©vidence des diff√©rences de sous-cha√ģnes lorsque attendu et re√ßu sont des cha√ģnes de caract√®res
  • nombre de lignes modifi√©es dans les diff√©rences pour savoir si c'est seulement des suppressions ou des insertions

Nous remercions tout particulièrement le mainteneur de Jest Mark Pedrotti pour avoir piloté cet effort et son travail continu pour rendre les erreurs d'expectation aussi satisfaisantes que possible.

Couleurs des différences lorsque les tests de snapshot échouent#

Le changement le plus évident pour remplacer la confusion par la confiance est la couleur des lignes de changement dans les différences lorsque les tests snapshot échouent :

  • - Snapshot passe du vert au magenta
  • + Received passe du rouge au bleu sarcelle sur fond cyan/aqua

Exemples de rapports de tests (avant à gauche et après à droite)

  1. Le nombre de lignes modifiées confirme votre première impression : dans quel sens le snapshot a-t-il changé (c'est-à-dire, lignes supprimées ou insérées)

snapshot-insert-lines

  1. Les couleurs de fond attirent vos yeux pour comparer les lignes modifiées adjacentes

snapshot-change-lines

  1. Les couleurs de fond vous aident également à voir quels tests toThrow nécessitent une décision sur la mise à jour ou non du snapshot

snapshot-change-substrings

Voici quelques raisons pour lesquelles nous avons choisi des couleurs uniques :

  • Pour 95 % des personnes qui ont une vision compl√®te des couleurs, elles peuvent reconna√ģtre rapidement les rapports provenant de tests snapshot par rapport √† tous les autres comparateurs.
  • Cela r√©sout le conflit direct entre la signification du vert/rouge dans les tests Jest et le rouge/vert dans la r√©vision du code.
  • Contrairement √† l'inversion rouge/vert qui sugg√®re que la mise √† jour est la d√©cision par d√©faut, ceci sugg√®re que les diff√©rences n√©cessitent un examen plus attentif pour une √©ventuelle r√©gression dans les √©checs des tests snapshot locaux que dans la r√©vision du code (lorsque les probl√®mes ont d√©j√† √©t√© corrig√©s).

La diff√©rence de teinte entre le magenta √† 300¬į et le sarcelle/cyan/aqua √† 180¬į donne une meilleure accessibilit√© √† la vision des couleurs et la teinte de fond claire pour les lignes modifi√©es donne un contraste coh√©rent sur les th√®mes clairs et fonc√©s.

Si vous maintenez un outil en ligne de commande, vous pourriez trouver une inspiration pour améliorer son accessibilité dans #9132.

Prise en charge des modules ECMAScript#

Node 13 a un support ESM non signalé, et nous avons commencé à travailler un tout petit peu vers un support natif dans Jest. Jest 25 inclut le support pour les fichiers de configuration jest.config.cjs et jest.config.mjs, mais les tests eux-mêmes ne peuvent pas encore être écrits en utilisant l'ESM sans quelque chose comme Babel ou TypeScript qui le transforme en CJS.

Les API que Jest utilisera sont encore marqu√©es et exp√©rimentales, donc ne vous attendez pas √† un support imm√©diat. L'√©quipe des modules Node.js travaille activement sur ces API, et nous garderons un Ňďil sur l'√©volution de la situation et nous les exp√©rimenterons afin de pouvoir fournir des retours. Vous pouvez vous abonner √† cette issue pour obtenir des mises √† jour sur l'√©tat de la mise en Ňďuvre dans Jest.

Autres améliorations et mises à jour#

  • Jest a d√©pass√© les 1000 contributeurs uniques. C'est une √©tape incroyable¬†! Merci √† tous ceux qui nous aident √† rendre les tests aussi agr√©ables que possible.
  • Gr√Ęce au membre de la communaut√© Josh Rosenstein, Jest prend d√©sormais en charge le BigInt dans la plupart des comparateurs, tels que toBeGreaterThan. Jest comprend √©galement les litt√©raux bigint imm√©diatement.
  • La fonctionnalit√© de Jest --detect-leaks a √©t√© d√©faillante pour Node 12 et plus r√©cent - ceci a √©t√© corrig√© dans Jest 25.
  • Comme annonc√© dans l'article du blog de Jest 24, la base de code de Jest a √©t√© r√©√©crite en TypeScript - ce travail a √©t√© achev√© dans Jest 24.3. Ainsi, si vous utilisez l'une des parties individuelles de Jest, vous devriez b√©n√©ficier d'une excellente int√©gration avec l'IDE. Pour l'avenir, nous voulons vraiment faire en sorte que les simulations de Jest jouent mieux avec les syst√®mes de type, et nous aimerions que la communaut√© nous aide √† cet √©gard. N'h√©sitez pas √† nous faire part ici de vos id√©es et √† envoyer des PR¬†! Nous allons √©galement √©tudier le d√©placement des typages pour l'utilisation de Jest en tant qu'ex√©cuteur de tests de DefinitelyTyped vers Jest lui-m√™me.
  • Le paquet jest-diff exporte maintenant des fonctions comme diffLinesUnified et diffStringsUnified qui ont des options de configuration, afin que d'autres applications puissent formater les diff√©rences d'une mani√®re personnalis√©e. Pour plus d'informations et d'exemples de code, consultez son nouveau fichier README.md dans le d√©p√īt de Jest ou sur les d√©p√īts de paquets.
  • Gr√Ęce √† un membre de la communaut√© Wei An Yen, Jest ne mettra plus en √©vidence les comparateurs asym√©triques passants dans les erreurs d'expectation. Il s'agit d'un probl√®me de longue date avec les comparateurs asym√©triques et nous sommes tr√®s heureux qu'il soit enfin r√©solu.
  • Pour la deuxi√®me ann√©e cons√©cutive, Jest a remport√© le plus haut prix de satisfaction de State of JS. Nous sommes incroyablement reconnaissants pour le soutien de la communaut√© et esp√©rons que nous pourrons tirer parti de cet √©lan pour rendre 2020 encore meilleure¬†!

Plans pour l'avenir#

  • La configuration de Jest est vaste et quelque peu maladroite - il y a souvent au moins deux fa√ßons de faire la m√™me chose, souvent m√™me plus. 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 √™tre en mesure de fournir une API programmatique appropri√©e pour l'ex√©cution de Jest, afin de faciliter l'int√©gration dans les IDE et autres outils. Veuillez consulter ceci pour le suivi.
  • Il y a eu un PR ouvert pour l'ajout de Lolex comme impl√©mentation des temporisateurs fictifs de Jest depuis d√©cembre 2017. Bien que nous ne l'ajoutons pas √† une API publique dans Jest 25, son support est techniquement inclus et nous cherchons comment l'exposer pour que les gens puissent le tester et l'exp√©rimenter. L'utiliser signifie que vous pouvez simuler la date et d'autres fonctions de temporisation que Jest ne prend pas en compte actuellement. Notez que cela doit √™tre consid√©r√© comme exp√©rimental, et un support API appropri√© viendra dans une version ult√©rieure. Suivez ce PR pour les derni√®res mises √† jour sur le statut.

Happy Jesting¬†! ūüÉŹ