Aller au contenu principal

Jest 22 : Améliorations et Runners Personnalisés

· 9 min de lecture
Simen Bekkhus
Simen Bekkhus
Traduction Bêta Non Officielle

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 annonçons une nouvelle version majeure de Jest qui affine presque tous les aspects du framework pour offrir une base de test plus solide. Avec la communauté Jest, nous avons apporté de nombreuses améliorations transversales qui vous aideront à tirer pleinement parti de Jest. Nous sortons également la fonctionnalité de runners personnalisés de sa phase expérimentale et ajoutons un nouveau package, jest-worker, pour paralléliser le travail entre plusieurs processus. Vous trouverez ci-dessous une liste des principales nouveautés, mais n'oubliez pas de consulter le changelog complet comme toujours.

Adieu Node 4, bienvenue JSDOM 11

Avec cette version, nous abandonnons le support de Node 4, principalement parce que JSDOM, l'une de nos dépendances principales, a mis fin à son support. Jest inclut désormais nativement JSDOM 11 qui offre un meilleur support des SVG, intègre requestAnimationFrame, URL et URLSearchParams, et bien plus encore.

Runners Personnalisés + Parallélisation simplifiée avec jest-worker

Dans Jest 21, nous avons introduit le concept de runners Jest personnalisés. Depuis, Rogelio, l'un des contributeurs principaux de Jest, a développé plusieurs runners utiles : Si vous avez de nombreux tests existants écrits avec un autre framework mais souhaitez profiter immédiatement des fonctionnalités de Jest, découvrez jest-runner-mocha. Si vous avez une base de code importante nécessitant du linting, vous pourriez gagner un temps considérable en exécutant eslint dans Jest via jest-runner-eslint.

Pour un contrôle plus fin de la parallélisation des tâches lourdes (comme la transformation de fichiers ou le parcours du système de fichiers), nous avons conçu une nouvelle bibliothèque parfaitement adaptée. Nous avons développé un module moderne basé sur les Promises avec une API accessible, nommé jest-worker, qui permet de déléguer aux processus enfants ces fonctions intensives. Comme jest-worker, comme tout autre package Jest, fait partie de la plateforme Jest, vous pouvez l'utiliser librement sans même utiliser Jest lui-même. Vous en saurez plus dans la documentation ici.

Pour mieux comprendre les runners personnalisés et Jest en tant que plateforme, regardez la conférence de Rogelio à Reactive Conf 2017 : Jest as a Platform.

Codeframe dans les échecs de tests

Pour identifier plus facilement quelle assertion fait échouer votre test, nous avons ajouté un codeframe montrant le contexte de l'assertion pour vous concentrer sur votre propre code. Voyez l'exemple de test suivant :

test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}

return 'success!';
}

expect(someFunctionWhichShouldThrow).toThrow();
});

Dans Jest 21, nous affichions l'erreur suivante :

échec dans Jest 21

Dans Jest 22, nous avons ajouté un codeframe, fournissant plus de contexte sur les assertions en échec. Nous avons également nettoyé la stack trace pour supprimer plus d'encombrement que jamais.

échec dans Jest 22

Test simplifié des erreurs dans le code asynchrone

Vous pouvez désormais utiliser toThrow et toThrowErrorMatchingSnapshot sur les rejets de promesses, exactement comme pour les erreurs synchrones.

async function throwingFunction() {
throw new Error('This failed');
}

test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});

Environnements de test asynchrones

Lorsque Puppeteer, un outil pour interagir par programmation avec un véritable navigateur Chromium, a été annoncé par l'équipe Google Chrome en août, beaucoup ont souhaité utiliser Jest pour écrire leurs tests dans Chrome. La communauté nous a aidés à rendre cela possible en permettant des environnements de test asynchrones. Nous travaillons encore à optimiser cette expérience, mais vous pouvez dès aujourd'hui consulter ce guide pour utiliser Puppeteer avec Jest.

Détection expérimentale de fuites mémoire

Nous avons ajouté un paramètre expérimental --detectLeaks à Jest qui vous alertera si une instance interne de l'environnement fuit après l'exécution d'un test. Il vous avertira également si votre suite de tests tente de charger un fichier après la fin du test, signe que vous avez oublié d'attendre des opérations asynchrones ou laissé des ressources mal nettoyées. Ce système ne détecte cependant que les fuites dans le code de test, pas dans le code applicatif (bien que la technologie sous-jacente jest-leak-detector puisse vous y aider). Si vous signalez un bug sur l'utilisation mémoire de Jest, merci de fournir un repro où --detectLeaks fait échouer la suite de tests. Nous avons commencé à développer un meilleur mécanisme de sandboxing mais il n'est pas encore prêt pour une activation par défaut. Si vous souhaitez aider, contactez-nous sur Discord !

Améliorations du mode Watch

Dans le mode Watch, vous pouvez désormais cibler uniquement les tests précédemment échoués. Dans ce mode, Jest ne ré-exécute pas les tests déjà réussis, vous aidant à corriger tous les échecs. De plus, nous avons ajouté un système de plugins au mode Watch. En ajoutant des modules à watchPlugins dans votre configuration, vous pouvez étendre ses fonctionnalités.

Prise en charge de Babel 7

Jest utilise Babel en arrière-plan pour la couverture de code et les fonctionnalités avancées de simulation. Avec Jest 22, il prend également en charge Babel 7. Vous trouverez plus d'informations dans la documentation ici.

Améliorations des fonctions mock

Plusieurs changements ont été apportés aux fonctions mock dans Jest 22 pour les rendre plus faciles à utiliser. Nous avons d'abord ajouté une propriété mockName permettant de nommer vos mocks, utile dans les échecs d'assertions. Nous avons aussi rendu les fonctions mock sérialisables dans pretty-format, ce qui permet de les utiliser dans les snapshots. Dans Jest 21, expect(jest.fn()).toMatchSnapshot() donnait [Function] ; dans Jest 22, vous obtiendrez plutôt ceci :

test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');

mock('hello', {foo: 'bar'});

expect(mock).toMatchSnapshot();
});

// Serializes to:

exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;

Les temps forts de Jest 21

Jest 21 était sorti en septembre, et nous n'avions malheureusement jamais publié d'article de blog. Voici donc un rapide résumé des principaux changements de la version 21 :

  1. Utilisation de expect et jest-mock dans le navigateur : Michael Jackson a fait don de son excellent package expect au projet Jest. Durant cette transition, l'équipe core de Jest, avec l'aide précieuse de Kenneth Skovhus, a adapté jest-matchers (renommé expect) et jest-mock pour les navigateurs. Bien que Jest lui-même ne soit pas encore utilisable dans les navigateurs (cf. issue), vous pouvez désormais employer ses assertions et mocks comme alternatives à Chai et Sinon dans des tests Mocha. Pour migrer depuis l'ancien expect vers le nouveau expect de Jest, utilisez jest-codemods pour automatiser la migration.

  2. Licence MIT : Nous avons changé la licence de Jest pour MIT. Youpi !

  3. Échec des suites de tests sur les erreurs asynchrones : Jest avait un bug qui le faisait planter lorsque des erreurs survenaient dans certaines parties de code asynchrone. Ce problème a été corrigé par des contributeurs de la communauté.

  4. Démarrage plus rapide : Avec Jest 21, nous avons optimisé le démarrage de Jest pour qu'il soit plus de 50% plus rapide. La surcharge importante de Jest lors de l'exécution d'un test petit et rapide a toujours été un problème pour nous, et ce ne devrait plus être une raison de vous empêcher d'utiliser Jest.

Communauté Jest

La communauté autour de Jest travaille dur pour rendre l'expérience de test encore meilleure. Ces projets sont distincts du projet Jest principal, mais nous souhaitons mettre en lumière quelques-uns de nos favoris personnels ici.

  • jest-image-snapshot – comparateur personnalisé pour confronter des images à des snapshots, par des développeurs d'American Express

  • ts-jest – tout ce dont vous avez besoin pour exécuter Jest avec succès dans un projet TypeScript par @kulshekhar

  • jest-codemods – migrez facilement vos tests depuis d'autres frameworks vers Jest

  • jest-plugins – un nouveau projet communautaire visant à simplifier la configuration de l'environnement de test pour des outils spécifiques comme React, ou fournissant des utilitaires pratiques

Nous souhaitons également annoncer le lancement récent d'un nouvel espace pour des extensions Jest de haute qualité – jest-community. Il s'agit d'une nouvelle organisation GitHub regroupant déjà nos projets préférés comme vscode-jest et jest-extended, pour n'en citer que quelques-uns, sélectionnés par les mainteneurs et collaborateurs de Jest. Nous y avons même migré notre eslint-plugin-jest, et constatons déjà d'excellentes contributions publiées indépendamment à un rythme plus rapide.

Communauté Jest

Regrouper des projets communautaires au sein d'une même organisation nous permet aussi d'expérimenter des fonctionnalités comme les publications automatisées, que nous aimerions explorer pour Jest également. Cela nous permet aussi de partager certains éléments communs entre eux, comme la structure du README (merci à la communauté webpack pour l'idée), facilitant ainsi l'apprentissage et l'utilisation pour tous.

Si vous avez quelque chose d'extraordinaire à partager, n'hésitez pas à nous contacter ! Nous serions ravis de présenter votre projet ici.