Jest 20 : 💖 Des tests délicieux & 🏃🏽 Exécuteur multi-projets
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 →
Il y a quelques mois, nous annoncions Jest 19 avec des fonctionnalités majeures et la plus importante version de Jest jusqu'alors. Jest 20 comporte deux fois plus de changements que la version précédente, propose une réécriture complète de l'ex écuteur de tests et ajoute de nouvelles API de test. Cette nouvelle version offre un niveau inédit de personnalisation et de configuration pour les projets, tout en simplifiant la mise à jour. Au-delà du "JavaScript Testing sans douleur", nous pensons que Jest propose désormais une expérience de test JavaScript délicieuse. Examinons en détail les meilleures nouvelles fonctionnalités :
Exécuteur multi-projets et refonte de la configuration
Jusqu'à présent, Jest ne pouvait fonctionner que sur un seul projet à la fois. Cela devient vite fastidieux lorsqu'on travaille sur plusieurs petits projets ayant chacun leur configuration propre. Avec Jest 20, nous avons entièrement réécrit l'exécuteur pour gérer simultanément plusieurs projets dans une seule instance de Jest. Par exemple si vous travaillez sur un frontend React et un backend Node.js. Voici une vidéo de Jest exécutant des tests pour React, Relay, Yarn et Jest lui-même en parallèle :

Jest réduit désormais le guide d'utilisation après le premier lancement de tests pour économiser de l'espace vertical dans le terminal.
Nous avons aussi complètement repensé le système de configuration interne de Jest. Vous pouvez désormais passer n'importe quelle option de configuration via la CLI pour écraser celles spécifiées dans votre fichier de config. Parallèlement, nous avons modifié Jest pour qu'il recherche par défaut un fichier jest.config.js, ce qui signifie que vous pouvez désormais définir votre configuration Jest en JavaScript tout en conservant la possibilité de le faire via package.json comme avant. Grâce à ces nouvelles fonctionnalités, vous pouvez combiner Jest de manières plus puissantes que jamais. Par exemple, si vous souhaitez identifier quels tests Jest exécuterait pour un ensemble de fichiers modifiés dans un commit couvrant plusieurs projets d'un monorepo, vous pouvez désormais combiner les arguments CLI ainsi :
$ jest --projects projectA projectB --listTests --findRelatedTests projectA/banana.js projectB/kiwi.js
[
"projectA/banana.test.js",
"projectB/kiwi.test.js",
"projectB/pineapple.test.js",
]
Cela s'avère particulièrement utile pour les systèmes d'intégration continue (CI) où vous pourriez vouloir n'exécuter qu'un sous-ensemble de tests pour les Pull Requests, évitant ainsi à Jest de traiter des milliers de fichiers de tests à chaque petit changement.
Enfin, nous mappons correctement la couverture de code avec TypeScript et exécutons l'analyse de couverture pour les fichiers non testés dans des processus worker, ce qui accélère significativement cette fonctionnalité.
Nouvelles API de test améliorées
Nous avons apporté plusieurs ajouts et améliorations aux API de test qui aideront à écrire des tests plus efficaces. Nous tenons à souligner que toutes ces améliorations ont été intégralement réalisées par des membres de la communauté !
-
Meilleur support asynchrone : Ajout de la gestion async/Promise via les modificateurs resolves/rejects sur expect :
expect(Promise(…)).resolves.toEqual(…). Voir la documentation. -
Vérification de
nassertions : En complément deexpect.assertions(n), la nouvelle méthodeexpect.hasAssertions()permet de s'assurer qu'un test contient au moins une assertion. -
Plugin de lint : Une règle
valid-expecta été ajoutée àeslint-plugin-jestpour garantir qu'une assertion est appelée aprèsexpect. Cela évite des erreurs comme unexpect(banana);isolé sans appel d'assertion. -
Plugins de formatage : Plusieurs nouveaux plugins pretty-format ont été ajoutés à Jest. Nous formatons maintenant élégamment les structures de données Immutable.js et les HtmlElements dans les échecs d'assertion et les snapshots.
-
Environnement personnalisé : Il est désormais possible d'ajouter une annotation
@jest-environment node|jsdomdans le bloc de commentaires d'un fichier de test pour utiliser un environnement différent de celui par défaut pour des tests individuels.
Voici un exemple montrant comment toutes ces nouvelles API rendront les tests plus agréables :
/**
* @jest-environment node
*/
test('compares apples and bananas', async () => {
expect.hasAssertions(); // Ensure this test has at least one assertion.
await expect(
Promise.resolve(Immutable.Map({apples: 1, bananas: 2})),
).resolves.toEqual(Immutable.Map({apples: 1, bananas: 3}));
expect('banana'); // valid-expect in eslint-plugin-jest will show an error.
});
Cet exemple affichera un échec de test similaire à ceci :

Changements cassants
Comme pour chaque version majeure, nous apportons plusieurs changements cassants pour permettre des évolutions futures et hisser l'expérience de test à un niveau supérieur. Cette fois, nous avons fait de notre mieux pour ne casser que des API peu utilisées par la majorité des utilisateurs de Jest :
-
Fourche de Jasmine 2.5 : Nous avons finalement décidé de forker Jasmine lui-même et de prendre la main sur le runner de tests de Jest. Cela nous permettra d'améliorer tous les aspects des tests unitaires à l'avenir, mais pour l'instant nous nous concentrons sur des réécritures progressives et la réduction de la surface d'API. Si un test échoue suite à une API Jasmine désormais manquante, une fonctionnalité équivalente devrait exister dans les objets
jestouexpect. Ainsi, nous avons supprimé de nombreuses fonctionnalités de Jasmine rarement utilisées. -
Nouveaux snapshots en CI : Les snapshots doivent toujours être commités avec leur test et le module testé. Jest ne sauvegarde plus automatiquement les nouveaux snapshots dans les environnements d'intégration continue (CI) ou lorsque le flag
--ciest spécifié. Pour outrepasser ce comportement (généralement déconseillé), utilisez le flag--updateSnapshot. -
Babel-Polyfill : Jest chargeait automatiquement
babel-polyfillavec babel-jest, causant des fuites mémoire. Dans la plupart des versions de Node.js,babel-polyfillest superflu : nous l'avons donc retiré. Jest n'inclut désormais queregenerator-runtimepar défaut (utilisé pour supporter async/await dans les anciennes versions de Node.js). Si vous avez besoin debabel-polyfill, importez-le manuellement dans vos fichiers de configuration.
Autres améliorations
-
Documentation : Une documentation solide est essentielle pour partager les bonnes pratiques et enseigner l'art d'écrire des tests efficaces. Ces dernières semaines, nous avons enrichi la documentation de Jest avec une FAQ sur les snapshots, un guide d'intégration avec les bibliothèques JavaScript courantes, et documenté les nouvelles fonctionnalités mentionnées ci-dessus.
-
Traductions : Nous sollicitons votre aide pour traduire la documentation de Jest afin de la rendre plus accessible.
-
Rapporteurs personnalisés : Jest prend désormais en charge les rapporteurs personnalisés via l'option de configuration
reporters. Vous pouvez personnaliser la sortie de Jest et l'intégrer à d'autres outils en générant des rapports dans des formats comme XML. Voir la documentation. -
Santé du codebase : Ces rapides itérations n'ont été possibles que grâce au temps consacré à la santé du codebase. Nous avons été parmi les premiers adopteurs de Prettier, amélioré significativement la couverture Flow, forké Jasmine pour optimiser notre bibliothèque de test, et réécrit/refactorisé des portions majeures de Jest pour assurer son succès futur.
-
Correctifs : Comme toujours, nous avons résolu de nombreux bugs dans Jest. Le changelog complet est disponible dans le dépôt Jest.
Conférences sur Jest
Récemment, l'équipe core de Jest et d'autres contributeurs ont commencé à présenter Jest et leur expérience de développement lors de conférences :
-
Rogelio Guzman a présenté Jest Snapshots and Beyond à React Conf.
-
J'ai parlé de Building High-Quality JavaScript Tools lors de la conférence F8 de Facebook.
Comme toujours, cette version n'aurait pas vu le jour sans vous, la communauté JavaScript. Nous sommes profondément reconnaissants de pouvoir collaborer à l'amélioration des tests JavaScript. Si vous souhaitez contribuer à Jest, n'hésitez pas à nous contacter sur GitHub ou sur Discord.
