Aller au contenu principal

Jest 24¬†: ūüíÖ Actualisation, polissage, facilit√© d'utilisation de TypeScript

· 10 minutes de lecture

Aujourd'hui, nous sommes heureux de vous annoncer la prochaine version majeure de Jest - la version 24 ! Quatre mois se sont écoulés depuis la dernière version mineure, et huit mois depuis Jest 23. Cette mise à jour est donc importante, et chacun y trouvera son compte ! Parmi les points forts, citons la prise en charge intégrée de TypeScript par la mise à niveau des internes de Jest vers Babel 7, la correction de certains problèmes de longue date concernant l'absence de sortie de la console et les problèmes de performance lors du calcul de diffs importants, ainsi qu'un tout nouveau site Web étincelant. ✨

Pour une liste complète de tous les changements, consultez le changelog.

Nouveau site web‚Äč

@orta a fourni une belle refonte du site web de Jest, qui a été implémenté par les membres de la communauté @montogeek et @brainkim.

L'objectif de la refonte était de mettre davantage en évidence ce qui rend Jest génial, et de dissocier l'idée que Jest est principalement un outil pour tester les applications React - vous pouvez utiliser Jest pour toutes sortes de projets et nous voulons que cela soit évident. Vous pouvez en savoir plus sur les idées à l'origine de cette refonte dans cette issue.

Prise en charge de TypeScript‚Äč

Nous avons mis √† jour Babel 7 en interne pour Jest 24, qui est fourni avec la prise en charge pour les projets TypeScript. Cela signifie que Jest peut supporter la transpilation de TypeScript hors de la bo√ģte, tant que vous configurez Babel pour l'utiliser avec @babel/preset-typescript. La prise en charge par d√©faut de TypeScript, similaire √† celle de Flow, pr√©sente un inconv√©nient¬†: Babel ne supprimera les annotations de type que pour rendre votre code valide en JavaScript. Il ne v√©rifiera pas votre code.

Bien que Jest prenne en charge Babel 7 depuis la version 22 publiée en décembre 2017, il a fallu utiliser un module passerelle afin de s'adapter à la prise en charge de Babel 6 par Jest. Dans Jest 24, nous avons entièrement migré vers Babel 7, avec l'aide précieuse du membre de la communauté @milesj. Cela signifie que la configuration est maintenant plus facile et que nous pouvons profiter des autres fonctionnalités de Babel 7, comme le chargement de la configuration et la transpilation automatique des modules. Assurez-vous de supprimer le babel-core@^7.0.0-bridge.0 car il n'est plus nécessaire maintenant.

Si vous voulez ex√©cuter des contr√īles de type pendant que vous testez, vous devez utiliser ts-jest. Vous devrez configurer le transformateur, car Jest applique par d√©faut Babel aux fichiers .ts (et .tsx). Alternativement, vous pouvez ex√©cuter tsc ou m√™me utiliser un ex√©cuteur Jest pour transpiler simultan√©ment votre TypeScript tout en ex√©cutant vos tests¬†! Consultez jest-runner-tsc pour plus d'informations.

Consultez les documentations pour plus de détails.

Notez que si, pour une raison quelconque, vous ne pouvez pas effectuer la mise à jour vers Babel 7, vous pouvez toujours utiliser Jest 24 avec babel@6 tant que vous conservez babel-jest à la version 23.

test.todo‚Äč

Jest 23 a été modifié pour que les tests sans implémentation soient rejetés au lieu d'être ignorés. Cette modification a été apportée en raison du retour d'information selon lequel les tests ignorés accidentellement étaient difficiles à découvrir et à retrouver. Cependant, ce changement a cassé le flux de travail pour un certain nombre de développeurs qui utilisaient cette fonctionnalité pour ébaucher les tests à écrire.

Dans Jest 24, nous abordons ce problème en ajoutant un test.todo explicite (inspiré de l'excellent AVA), qui sera mentionné séparément dans le résumé du test. Cela vous permet d'ébaucher rapidement les tests que vous voulez écrire et, à l'avenir, une règle ESLint pourrait même être capable de vous avertir que vous avez oublié d'écrire certains tests.

test.todo('une entrée invalide doit être levée');

test.todo('les options manquantes doivent être normalisées');

test.todo

Messages d'assertion am√©lior√©s‚Äč

Lorsque les tests échouent, vous devez décider avec confiance et de manière correcte quels changements sont des améliorations attendues et quels changements sont des régressions inattendues. Il est particulièrement important de ne pas manquer quelques régressions cachées parmi de nombreuses améliorations. Jest 24 rend les rapports d'échec des assertions plus clairs et concis pour plusieurs comparateurs. Comme l'effort se poursuivra dans Jest 25, vous pourriez remarquer quelques incohérences temporaires. Si vos tests n'échouent jamais, vous ne les verrez pas - pour le reste d'entre nous, il sera plus facile de déboguer pourquoi quelque chose ne fonctionne pas comme prévu. Merci pour le travail acharné de @ittordepam et des autres contributeurs de la communauté.

Vous pouvez voir ces changements à travers toutes ces PR : 7621, 7557, 7448, 7325, 7241, 7152, 7125, 7107, 6961.

Exemples :

√Čchec de l'assertion

échec de l'assertion

Incompatibilité de type

types différents

Fonction simulée non appelée

fonctions simulées

R√©paration de vieilles douleurs‚Äč

Nous avons corrigé quelques problèmes vraiment anciens dans cette version.

Le premier que nous aimerions souligner est la disparition des instructions console.log. Jest intercepte et collecte tous les logs afin de vous donner une trace de la pile, mais aussi de les fournir aux rapporteurs afin que vous puissiez les traiter comme vous le souhaitez. Cependant, cela a conduit √† un probl√®me o√Ļ ils ont tout simplement √©t√© manquants dans certains cas limites. Heureusement pour Jest 24, @spion a pris les devants et a corrig√© ce probl√®me. Merci beaucoup¬†!

Le second est un probl√®me o√Ļ Jest manque de m√©moire si la diff√©rence dans la s√©rialisation de la valeur attendue et re√ßue a un grand nombre de changements d'insertion (soit inattendu en raison d'une erreur dans le test ou d'un d√©faut dans le s√©rialiseur ou attendu en raison de d√©faillances temporaires pendant le d√©veloppement pilot√© par les tests). @ittordepam a remplac√© l'algorithme de diff√©renciation pr√©c√©dent par le paquet diff-sequences, qui devrait r√©soudre ce probl√®me car il utilise la quantit√© minimale th√©orique de m√©moire. Cela ouvre la voie √† des diffs de mots dans le futur, similaires √† ce que git fournit. Veuillez consulter ce PR et n'h√©sitez pas √† nous contacter si vous souhaitez contribuer √† la r√©alisation de ce projet¬†!

Autres faits marquants‚Äč

  • Nous avons √©galement apport√© quelques am√©liorations pour globalSetup et globalTeardown - la transformation du code leur sera appliqu√©e de mani√®re similaire √† setupFiles et ils sont d√©sormais pris en charge en tant que partie int√©grante des projects.
  • Vous pouvez configurer l'emplacement des snapshots de Jest, ce qui est principalement utile si vous construisez des outils qui utilisent Jest dans un processus de compilation plus volumineux.
  • Une bizarrerie de la CLI de Jest a √©t√© que si certains drapeaux et options ont √©t√© ¬ę¬†camel cas√©s¬†¬Ľ (comme runInBand), d'autres ne l'ont pas √©t√© (comme no-cache). Dans Jest 24, les deux sont reconnus, ce qui signifie que vous pouvez √©crire vos arguments CLI comme vous le souhaitez.
  • Nous avons renomm√© setupTestFrameworkScriptFile en setupFilesAfterEnv, et nous l'avons converti en tableau. Nous esp√©rons que cela rendra les options plus claires. Nous avons pr√©vu de remanier encore la configuration dans la prochaine version majeure, voir le paragraphe dans la section ci-dessous.
  • Pour r√©duire la quantit√© de magie que Jest effectue pour ¬ę¬†juste fonctionner‚ĄĘ¬†¬Ľ, dans cette version nous avons d√©cid√© de laisser tomber l'injection automatique de regenerator-runtime, qui est parfois utilis√© dans le code async compil√©. L'inclusion de regenerator-runtime n'est pas toujours n√©cessaire et nous pensons que c'est √† l'utilisateur de l'inclure si c'est n√©cessaire. Si vous utilisez @babel/preset-env avec targets, d√©finissez une version moderne de Node (par exemple Node 6+) vous n'aurez pas besoin de l'inclure. Veuillez consulter nos docs de l'utilisation de Babel pour plus d'informations.
  • Node.js 10 a fourni un module exp√©rimental appel√© worker_threads, qui est similaire aux threads Worker dans le navigateur. jest-worker, une partie de la plateforme Jest, sera en mesure d'utiliser worker_threads s'il est disponible au lieu de child_process, ce qui le rend encore plus rapide¬†! Les analyses comparatives montrent une am√©lioration de 50 %. En raison de sa nature exp√©rimentale, il n'est pas activ√© lorsque vous utilisez Jest en tant qu'ex√©cuteur de test, mais vous pouvez l'utiliser dans vos propres projets aujourd'hui¬†! Nous pr√©voyons de l'activer par d√©faut lorsqu'il sera sorti du statut exp√©rimental dans Node.js.

Changements de rupture‚Äč

Bien que toutes les ruptures de changement soient listées dans le changelog, certaines d'entre elles méritent d'être soulignées :

  • Nous avons fait une mise √† jour vers Micromatch 3. Bien que cela n'affecte pas tous les utilisateurs, cette version est plus stricte dans l'analyse des globs que la version 2, qui est utilis√©e dans Jest 23. Veuillez lire ce probl√®me et les issues li√©es pour des exemples de globs invalides au cas o√Ļ vous auriez des probl√®mes.
  • Nous avons supprim√© les restes de code qui √©taient n√©cessaires pour Node 4. Il √©tait auparavant techniquement possible d'ex√©cuter Jest 23 sur Node 4 - ce n'est plus possible sans polyfill et transpilation.
  • Quelques changements dans la s√©rialisation des fonctions simul√©es dans les snapshots - assurez-vous de v√©rifier vos snapshots mis √† jour apr√®s la mise √† jour de la version. PR associ√©.
  • Jest n'injecte plus automatiquement regenerator-runtime - si vous obtenez des erreurs √† ce sujet, assurez-vous de configurer Babel pour qu'il transpile correctement les fonctions async en utilisant par exemple @babel/preset-env. PR associ√©.

L'avenir‚Äč

Nous sommes incroyablement honor√©s par les r√©sultats de State Of JS 2018, o√Ļ Jest a remport√© le prix de la ¬ę¬†plus grande satisfaction¬†¬Ľ. Une autre chose √©norme s'est produite en 2018, en octobre, lorsque Jest a d√©pass√© 2 millions de t√©l√©chargements hebdomadaires pour la premi√®re fois. Merci.

Nous sommes tr√®s reconnaissants de la confiance que nous t√©moigne la communaut√©, et nous esp√©rons la renforcer √† l'avenir. Nous nous assurerons que Jest 24 et les versions futures continueront √† s'appuyer sur cette incroyable fondation, et continueront √† faire partie int√©grante des bo√ģtes √† outils des d√©veloppeurs JavaScript.

C'est la premi√®re version o√Ļ nous avons explor√© l'id√©e d'utiliser le financement de notre Open Collective pour cr√©er des primes de bug. Cela a bien fonctionn√© pour impliquer les d√©veloppeurs non principaux dans la mise en Ňďuvre de la nouvelle page d'accueil, et nous sommes optimistes pour un bogue de longue date o√Ļ les globaux de Jest ne correspondent pas aux globaux de Node. Nous aimerions faire plus, si vous avez un bogue favori qui est un bon candidat pour notre programme de prime, s'il vous pla√ģt faites-le nous savoir. En attendant, vous pouvez trouver tous les tickets avec un bounty via l'√©tiquette de l'issue.

Nous avons déjà commencé à faire des plans pour la prochaine version de Jest 25, avec la plus grande fonctionnalité prévue étant une révision de notre configuration, qui est assez difficile à comprendre, principalement en raison de chevauchement d'option et de mélange de globs et d'expressions régulières. Les commentaires sur la façon dont vous souhaitez que la configuration de Jest se présente sont les bienvenus, et peuvent être soumis dans cette issue.

Vous avez peut-√™tre aussi entendu dire que nous pr√©voyons de migrer la base de code de Flow vers TypeScript. Nous esp√©rons que cette migration permettra √† encore plus de contributeurs de sauter le pas et de contribuer √† rendre 2019 encore meilleure pour les tests JavaScript. ūüöÄ Le but est de d√©barquer cela dans une version mineure dans un avenir pas trop lointain. Les commentaires sur ce choix peuvent √™tre ajout√©s au RFC.

Enfin, si vous vous êtes déjà demandé comment Jest est construit, @cpojer a enregistré une vidéo avec une vue d'ensemble architecturale de la façon dont Jest est mis en place sous le capot. N'hésitez pas à nous contacter si vous avez d'autres questions à ce sujet. La vidéo est disponible sur notre site web.

Happy Jesting¬†! ūüÉŹ