Jest 24 : 💅 Rafraîchissant, Élégant et Compatible TypeScript
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 →
Aujourd'hui, nous sommes heureux d'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, avec des nouveautés pour tout le monde ! Les points forts incluent la prise en charge intégrée de TypeScript grâce à la migration interne vers Babel 7, la résolution de problèmes persistants comme les sorties console manquantes et les problèmes de performances lors du calcul de grandes différences, ainsi qu'un tout nouveau site web étincelant. ✨
Pour la liste complète des modifications, consultez le changelog.
Nouveau site web
@orta a conçu une superbe refonte du site web de Jest, implémentée par les membres de la communauté @montogeek et @brainkim.
L'objectif de cette refonte était de mieux mettre en valeur les atouts de Jest et de dissocier l'idée que Jest est principalement un outil pour tester des applications React - vous pouvez l'utiliser avec toutes sortes de projets, et nous tenions à le rendre évident. Vous pouvez en savoir plus sur les idées derrière cette refonte dans cette issue.
Prise en charge de TypeScript
Nous avons migré en interne vers Babel 7 pour Jest 24, ce qui apporte la prise en charge des projets TypeScript. Cela signifie que Jest peut transpiler TypeScript immédiatement, à condition que vous configuriez Babel avec @babel/preset-typescript. Une nuance importante concernant la prise en charge par défaut de TypeScript, similaire à Flow, est que Babel se contentera de supprimer les annotations de type pour rendre votre code JavaScript valide. Il ne vérifiera pas les types de votre code.
Bien que Jest prenne en charge Babel 7 depuis la version 22 (décembre 2017), cela nécessitait un module pont pour rester compatible avec Babel 6. Dans Jest 24, nous avons entièrement migré vers Babel 7 grâce à l'aide précieuse de @milesj. La configuration est désormais plus simple et nous pouvons profiter d'autres fonctionnalités de Babel 7 comme le chargement des configurations et la transpilation automatique des modules. Pensez à supprimer babel-core@^7.0.0-bridge.0 qui n'est plus nécessaire.
Si vous souhaitez vérifier les types pendant vos tests, utilisez 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 runner Jest pour transpiler votre TypeScript tout en lançant vos tests ! Consultez jest-runner-tsc pour plus d'informations.
Voir la documentation pour plus de détails.
Si vous ne pouvez pas migrer vers Babel 7 pour une raison quelconque, vous pouvez toujours utiliser Jest 24 avec babel@6 à condition de conserver babel-jest en version 23.
test.todo
Jest 23 avait introduit un changement où les tests sans implémentation déclenchaient une erreur au lieu d'être ignorés. Cette modification répondait aux retours signalant que les tests accidentellement ignorés étaient difficiles à détecter. Cependant, elle a perturbé le flux de travail de nombreux développeurs qui utilisaient cette fonctionnalité pour esquisser leurs tests.
Dans Jest 24, nous résolvons ce problème avec test.todo (inspiré par l'excellent AVA), qui s'affichera séparément dans le résumé des tests. Cela vous permet d'esquisser rapidement les tests à implémenter, et à l'avenir, une règle ESLint pourrait même vous alerter si vous oubliez d'écrire certains tests.
test.todo('invalid input should throw');
test.todo('missing options should be normalized');

Messages d'assertion améliorés
Lorsque les tests échouent, vous devez prendre des décisions fiables et correctes pour distinguer les changements qui représentent une progression attendue de ceux qui sont des régressions inattendues. Il est particulièrement important de ne pas manquer quelques régressions cachées parmi beaucoup de progrès. Jest 24 rend les rapports d'échec d'assertion plus clairs et concis pour plusieurs matchers. Comme cet effort se poursuivra dans Jest 25, vous pourriez remarquer certaines 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 d'autres contributeurs de la communauté.
Vous pouvez voir ces changements dans toutes ces PR : 7621, 7557, 7448, 7325, 7241, 7152, 7125, 7107, 6961.
Exemples :
Assertion échouée

Incompatibilité de types

Fonction mock non appelée

Correction de problèmes anciens
Nous avons corrigé quelques problèmes très anciens dans cette version.
Le premier que nous souhaitons mettre en avant est la disparition des déclarations console.log. Jest intercepte et collecte tous les logs afin de vous fournir une stack trace associée, ainsi que de les fournir aux reporters pour que vous puissiez les traiter comme bon vous semble. Cependant, cela a conduit à un problème où ils disparaissaient simplement dans certains cas limites. Heureusement pour Jest 24, @spion a intervenu et résolu ce problème. Merci beaucoup !
Le second est un problème où Jest manque de mémoire si la différence de sérialisation entre la valeur attendue et reçue comporte un très grand nombre de changements d'insertion (soit inattendus à cause d'une erreur dans le test ou d'un défaut dans le sérialiseur, soit attendus à cause d'échecs temporaires pendant le développement piloté par les tests). @ittordepam a remplacé l'ancien algorithme de diff par le package diff-sequences, ce qui devrait résoudre ce problème car il utilise théoriquement le minimum de mémoire. Cela ouvre la possibilité à des diffs par mots à l'avenir, similairement à ce que git propose. Veuillez consulter cette PR et n'hésitez pas à vous manifester si vous souhaitez aider à concrétiser cela !
Autres points forts
-
Nous avons également apporté des améliorations à
globalSetupetglobalTeardown- la transformation de code leur sera appliquée comme poursetupFileset elles sont désormais prises en charge dans le cadre desprojects. -
Vous pouvez configurer l'emplacement des snapshots de Jest, ce qui est principalement utile si vous construisez des outils utilisant Jest dans un processus de build plus large.
-
Une particularité de l'interface en ligne de commande (CLI) de Jest était que certaines options utilisaient la notation camelCase (comme
runInBand) tandis que d'autres non (commeno-cache). Dans Jest 24, les deux formats sont reconnus, vous permettant d'écrire vos arguments CLI comme vous le souhaitez. -
Nous avons renommé
setupTestFrameworkScriptFileensetupFilesAfterEnvet l'avons transformé en tableau. Nous espérons que cela clarifiera son utilité. Nous prévoyons une refonte plus approfondie de la configuration dans la prochaine version majeure (voir le paragraphe ci-dessous). -
Pour réduire la "magie" que Jest déploie pour "fonctionner sans effort™", nous avons décidé de supprimer l'injection automatique de
regenerator-runtime, parfois utilisé dans du code asynchrone compilé. L'inclusion deregenerator-runtimen'est pas toujours nécessaire et nous estimons que c'est à l'utilisateur de l'inclure si besoin. Si vous utilisez@babel/preset-envavectargetsconfiguré pour une version moderne de Node (ex: Node 6+), vous n'aurez pas besoin de l'inclure. Consultez notre documentation sur Babel pour plus de détails. -
Node.js 10 a introduit un module expérimental
worker_threads, similaire aux Web Workers des navigateurs.jest-worker, composant de la plateforme Jest, pourra utiliserworker_threadsà la place dechild_processs'il est disponible, ce qui améliore significativement les performances ! Les benchmarks montrent un gain de 50%. En raison de son statut expérimental, il n'est pas activé par défaut dans Jest, mais vous pouvez déjà l'utiliser dans vos projets ! Nous l'activerons par défaut lorsqu'il sortira du statut expérimental dans Node.js.
Changements cassants
Tous les changements cassants sont listés dans le changelog, mais certains méritent d'être soulignés :
-
Migration vers Micromatch 3. Bien que cela n'affecte pas tous les utilisateurs, cette version analyse les globs de manière plus stricte que la v2 utilisée dans Jest 23. Consultez cette discussion pour des exemples de globs invalides en cas de problème.
-
Suppression des vestiges de compatibilité avec Node 4. Il était techniquement possible d'exécuter Jest 23 sur Node 4 - ce n'est plus possible sans transpilation et polyfills.
-
Modifications de la sérialisation des fonctions mock dans les snapshots - vérifiez attentivement vos snapshots après la mise à jour. PR associée : #6381.
-
Jest n'injecte plus automatiquement
regenerator-runtime- si vous rencontrez des erreurs à ce sujet, configurez Babel pour transpiler correctement les fonctionsasyncavec@babel/preset-env. PR associée : #7595.
L'avenir
Nous sommes extrêmement honorés par les résultats du State Of JS 2018, où Jest a remporté le prix de la "Plus Grande Satisfaction". Autre événement majeur en 2018 : en octobre, Jest a dépassé pour la première fois les 2 millions de téléchargements hebdomadaires. Merci à tous.
Nous sommes très reconnaissants de la confiance que la communauté nous témoigne et comptons la mériter à l'avenir. Nous veillerons à ce que Jest 24 et les futures versions continuent de bâtir sur ces bases exceptionnelles, restant un outil indispensable dans la boîte à outils des développeurs JavaScript.
Cette version marque la première fois où nous avons exploré l'idée d'utiliser notre financement Open Collective pour créer des primes aux bogues. Cette approche s'est avérée efficace pour impliquer des développeurs externes dans la réalisation de la nouvelle page d'accueil, et nous sommes optimistes quant à la résolution d'un bug récurrent concernant les variables globales de Jest qui diffèrent de celles de Node. Nous aimerions multiplier ces initiatives - si vous avez un bug récurrent qui serait un bon candidat pour notre programme de primes, faites-le-nous savoir. En attendant, vous pouvez trouver tous les tickets avec prime via l'étiquette dédiée.
Nous avons déjà commencé à préparer la prochaine version Jest 25, dont la fonctionnalité phare sera une refonte de notre système de configuration, actuellement complexe à appréhender en raison d'options qui se chevauchent et du mélange entre globs et expressions régulières. Vos retours sur l'évolution souhaitée de la configuration de Jest sont les bienvenus dans cette discussion.
Vous avez peut-être aussi entendu 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 participer et de faire de 2019 une année encore meilleure pour les tests JavaScript. 🚀 Cette évolution devrait être intégrée dans une version mineure prochainement. Vos retours sur ce choix sont attendus dans la RFC.
Enfin, si vous vous êtes déjà demandé comment Jest est construit, @cpojer a enregistré une vidéo présentant l'architecture interne du framework. N'hésitez pas à nous contacter si vous avez des questions supplémentaires à ce sujet. La vidéo est disponible sur notre site web.
Bon test ! 🃏
