Jest 26 : Tic Tac
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 →
Lorsque nous avons commencé à reconstruire Jest il y a cinq ans, notre objectif était de fournir un lanceur de tests clés en main sans configuration, accessible aux débutants, extensible pour presque tous les cas d'usage de test et évolutif pour les grands projets. L'une des versions déterminantes fut Jest 15 qui a tout rassemblé en proposant de bons paramètres par défaut permettant d'exécuter Jest souvent sans aucune configuration. Cependant, cette approche présente un inconvénient majeur : Jest installe de nombreuses dépendances dans vos projets que vous n'utilisez peut-être pas.
Nous commençons maintenant à résoudre ce problème en réduisant la taille d'installation de Jest tout en conservant son accessibilité et son extensibilité. Nous avons apporté les changements cassants suivants dans Jest 26 :
-
[expect, jest-mock, pretty-format]Suppression des buildsES5avec un nouveau support minimal d'ES2015 (Node 8) qui n'étaient utilisés que pour les builds navigateur (#9945)Migration : Avec ce changement, nous transférons la responsabilité de bundler les packages concernés aux utilisateurs, plutôt que Jest les fournisse nativement, car ils connaissent mieux leurs environnements cibles. Si vous souhaitez les récupérer, nous sommes ouverts à leur publication sous forme de packages séparés. Les PR sont les bienvenues !
-
[jest-config, jest-resolve]Suppression du support du champbrowser(#9943)Migration : Installez le module
browser-resolveet utilisez la configuration suivante :{
"jest": {
"resolver": "<rootDir>/resolver.js"
}
}// resolver.js
const browserResolve = require('browser-resolve');
module.exports = browserResolve.sync; -
Les définitions TypeScript nécessitent un minimum de TypeScript v3.8 (#9823)
Avec ces changements, Jest 26 est désormais plus léger de 4 MiB par rapport à Jest 25.5.4 (53 → 49 MiB). Notez que de nombreuses dépendances comme Babel font probablement déjà partie de votre projet. La taille propre de Jest a été réduite de 1,2 MiB (4,3 → 3,1 MiB).
Bien que ce soit un bon départ, ce n'est pas suffisant pour rendre Jest significativement plus léger. Nous prévoyons de réduire progressivement la taille de Jest et de son arbre de dépendances jusqu'à 70%. La plupart des changements visant à alléger la configuration par défaut de Jest seront des changements cassants mineurs, et nous souhaitons emmener la communauté avec nous autant que possible. Nous appliquerons donc le modèle de publication « Tic-Tac » pour Jest 27 et Jest 28 :
-
Jest 27 fournira par défaut un nouveau lanceur de tests "
jest-circus" et l'environnement Node.js.jest-jasmine2etjest-environment-jsdomresteront inclus pour permettre leur utilisation via une modification d'une ligne dans la configuration. -
Jest 28 retirera
jest-jasmine2etjest-environment-jsdomde la distribution par défaut de Jest. Ces packages resteront maintenus activement dans le projet Jest et publiés séparément. Les utilisateurs devront les installer pour les utiliser.
Lors de la mise à niveau vers ces versions majeures, Jest vous guidera à travers les changements nécessaires. Si vous souhaitez anticiper et migrer dès maintenant vers les nouveaux paramètres par défaut, et que votre projet ne nécessite pas d'environnement DOM, vous pouvez passer à Jest 26 et ajouter les options de configuration suivantes :
{
"jest": {
"testEnvironment": "node",
"testRunner": "jest-circus/runner"
}
}
Jest continuera d'inclure babel-jest activé par défaut. Actuellement, il alimente plusieurs fonctionnalités de Jest au-delà de la compilation de la syntaxe JavaScript moderne vers des formats compris par les versions actuelles de Node.js et des navigateurs : il gère également la couverture de code et le mock des modules ES dans Jest. Jest propose actuellement un support expérimental pour la couverture V8 et un support natif des modules ES (plus de détails ci-dessous !). Il est impossible de mocker les modules ES statiques selon la spécification sans transformer le code au préalable, nous encouragerons donc des modèles fonctionnant sans cette transformation que nous utilisons avec Babel aujourd'hui. Une fois que la couverture V8 et le support natif des ESM seront stabilisés dans Jest, nous pourrons également retirer babel-jest comme valeur par défaut tout en continuant à le maintenir.
Nouveaux faux minuteries
Avec Jest 26, nous introduisons une nouvelle implémentation de faux minuteries basée sur @sinonjs/fake-timers. Nous souhaitions réaliser cela depuis des années et sommes heureux que cette solution ait enfin suffisamment progressé pour supporter tous les cas d'usage existants des faux minuteries de Jest.
Cette nouvelle implémentation offre des fonctionnalités supplémentaires comme le mock de Date, queueMicrotask et plus encore – consultez le README associé. Elle fonctionne de manière transparente avec les API existantes comme jest.runAllTimers(). Pour plus de détails, reportez-vous à la documentation sur notre site.
Nous sommes convaincus que cette implémentation est prête pour la production. Cependant, nous ne souhaitons pas forcer les utilisateurs à réécrire leurs tests s'ils dépendent de subtiles différences entre les anciennes et nouvelles implémentations. Dans Jest 26, cette nouvelle implémentation restera optionnelle et pourra être activée via jest.useFakeTimers('modern') ou en passant modern à l'option timers de votre configuration si vous aviez précédemment activé les faux minuteries pour tous les tests.
Dans Jest 27, nous basculerons par défaut vers l'implémentation "moderne" tout en continuant à supporter et maintenir l'implémentation historique via jest.useFakeTimers('legacy'). Si vous n'êtes pas sûr de pouvoir mettre à jour tous vos tests avant la sortie de Jest 27, vous pouvez dès maintenant ajouter cette configuration pour conserver l'ancien comportement.
Nous tenons à remercier Carl-Erik Kopseng, Benjamin Gruenbaum et les autres mainteneurs de @sinonjs/fake-timers pour leur aide et patience dans la réalisation de ce projet ! Une avancée passionnante.
Une nouvelle façon de consommer Jest - @jest/globals
Jest a longtemps reposé sur des globaux popularisés par le framework de tests Jasmine et d'autres, tels que describe, it, test et expect. Bien que ce modèle soit largement utilisé, beaucoup ont exprimé leur préférence pour l'importation des fonctions de test. Pour supporter ce cas d'usage, nous avons ajouté un nouveau package @jest/globals permettant d'importer les fonctions de test : import {expect, jest, test} from '@jest/globals';.
Limitations actuelles :
-
Les globaux existent toujours dans l'environnement, mais nous introduirons ultérieurement un mode pour les désactiver. De même,
const jest = require('@jest/globals')génère actuellement des erreurs car la variablejestreste globale. -
Il est actuellement impossible d'ajouter des matchers personnalisés aux définitions TypeScript lors de l'utilisation des globaux de cette manière.
-
Bien que cette approche permette d'exécuter des tests sans globaux, elle ne permet pas encore d'exécuter des tests sans le runner de test de Jest.
Support natif des ESM
Comme mentionné dans le billet Jest 25, nous avons travaillé sur la prise en charge native des modules ECMAScript. Ce n'est pas encore stable mais prêt à être testé. Nous serions ravis de recevoir vos retours et rapports de bugs ! Pour un aperçu de l'état actuel, vous pouvez consulter cette issue ou parcourir toutes les issues avec le label ES Modules.
Autres changements cassants dans Jest 26
-
Abandon de la prise en charge de Node 8 (#9423)
-
[jest-environment-jsdom]Mise à niveau versjsdomv16 (#9606) -
[jest-runtime]Suppression des méthodesrequire.requireActualetrequire.requireMockdepuis longtemps dépréciées (#9854) -
[jest-haste-map]Suppression deprovidesModuleNodeModules(#8535) -
[jest-circus]Échec des tests si un test prend un callback done et a des valeurs de retour (#9129) -
[jest-circus]Lance une erreur appropriée si un test / hook est défini de manière asynchrone (#8096)
Prenez soin de vous
Nous traversons tous actuellement une période sans précédent d'incertitude. Si vous rencontrez des difficultés financières, nous souhaitons utiliser le fonds Open Collective de Jest pour aider les nouveaux contributeurs et les contributeurs existants. Nous proposons des primes sur certaines issues et sommes ouverts à l'idée d'offrir une prime sur l'une de nos issues ouvertes actuelles - vous pouvez mentionner qu'une issue devrait avoir une prime dans l'issue elle-même ou contacter @cpojer par message privé sur Twitter.
Prenez soin de vous.
