Aller au contenu principal

Jest 26 : Tic Tac

Lorsque nous avons commencé à reconstruire Jest il y a cinq ans, notre objectif était de fournir un exécuteur de tests sans configuration, accessible aux débutants, extensible pour presque tous les cas d'utilisation de tests et évolutif pour les grands projets. L'une des versions essentielles a été Jest 15, qui a tout regroupé et fourni de bonnes valeurs par défaut permettant aux gens d'exécuter Jest souvent sans aucune configuration. Cependant, cette approche a un gros inconvénient car Jest installe beaucoup de dépendances dans vos projets dont vous n'avez peut-être pas besoin.

Nous commençons à remédier à cette lacune et nous nous efforçons de réduire la taille de l'installation de Jest tout en le gardant accessible et extensible. Nous avons apporté les changements fondamentaux suivants dans Jest 26 :

  • [expect, jest-mock, pretty-format] Suppression des fichiers de build ES5 avec un nouveau minimum de support de ES2015 (Node 8) qui n'étaient utilisés que pour les builds des navigateurs (#9945)

    Migration : Avec ce changement, nous poussons la responsabilité vers les utilisateurs pour regrouper les paquets affectés, plutôt que Jest les fournisse directement, puisqu'ils connaissent mieux leurs environnements cibles. Si vous voulez le récupérer, nous sommes prêts à les expédier séparément. Les PRs sont les bienvenus !

  • [jest-config, jest-resolve] Suppression de la prise en charge du champ browser (#9943)

    Migration : Installez le module browser-resolve et utilisez la configuration suivante :

    {
    "jest": {
    "resolver": "<rootDir>/resolver.js"
    }
    }
    // resolver.js
    const browserResolve = require('browser-resolve');
    module.exports = browserResolve.sync;
  • Les définitions TypeScript requièrent au minimum TypeScript v3.8 (#9823)

Avec les changements ci-dessus, Jest 26 est maintenant 4 MiB plus petit que Jest 25.5.4 (53 → 49 MiB). N'oubliez pas que de nombreuses dépendances, comme Babel, font probablement déjà partie de votre projet. La taille de Jest a été réduite de 1,2 MiB (4,3 -> 3,1 MiB).

Bien qu'il s'agisse d'un bon début, cela ne suffit pas à alléger significativement Jest. 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 à réduire la configuration par défaut de Jest seront de petits changements de rupture et nous voulons amener la communauté avec nous autant que possible. Par conséquent, nous apporterons les changements suivants dans Jest 27 et Jest 28 en utilisant un processus de publication "Tick-Tock" :

  • Jest 27 sera livré avec un nouveau runner de test "jest-circus" et l'environnement Node.js par défaut. jest-jasmine2 et jest-environment-jsdom seront toujours fournis afin que les utilisateurs puissent continuer à les utiliser en changeant une ligne chacun dans la configuration.
  • Jest 28 supprimera jest-jasmine2 et jest-environment-jsdom de la distribution par défaut de Jest. Les paquets seront toujours activement maintenus dans le cadre du projet Jest et seront publiés séparément. Les utilisateurs devront installer ces paquets pour les utiliser.

Lors de la mise à jour vers ces versions majeures, Jest vous guidera à travers les changements nécessaires. Si vous souhaitez prendre de l'avance et migrer vers les nouveaux paramètres par défaut dès maintenant, et que votre projet ne nécessite pas un environnement DOM, vous pouvez passer à Jest 26 et ajouter les options de configuration suivantes :

{
"jest": {
"testEnvironment": "node",
"testRunner": "jest-circus/runner"
}
}

Jest continuera à être livré avec babel-jest activé par défaut. Il alimente actuellement quelques fonctionnalités de Jest au-delà de la compilation de la syntaxe JavaScript moderne vers quelque chose de compris par les versions actuelles de Node.js et des navigateurs : Il permet également la couverture du code de Jest et l'adaptation des modules ES. Jest est actuellement livré avec un support expérimental pour la couverture V8 et un support natif pour les modules ES (plus sur ce sujet ci-dessous !). Il n'est pas possible de simuler des modules ES statiques conformément aux spécifications sans transformer le code au préalable. Nous encouragerons donc les patterns qui fonctionnent sans la transformation pour laquelle nous utilisons Babel aujourd'hui. Une fois que la couverture V8 et le support ESM natif se seront stabilisés dans Jest, nous pourrons également supprimer babel-jest par défaut mais nous continuerons à le maintenir.

Nouveaux temporisateurs fictifs#

Avec Jest 26, nous livrons une nouvelle implémentation des temporisateurs fictifs basée sur @sinonjs/fake-timers. Nous voulions faire cela depuis des années et nous sommes heureux que cela ait finalement progressé suffisamment pour supporter tous les cas d'utilisation des temporisateurs fictifs de Jest.

La nouvelle implémentation est accompagnée de fonctionnalités supplémentaires telles que la simulation de Date, queueMicrotask et plus encore, consultez ce README. Il fonctionne de manière transparente en utilisant les API de temporisateur existants comme jest.runAllTimers() - consultez la documentation sur notre site web.

Nous sommes convaincus que cette implémentation est prête pour le grand public, mais nous ne voulons pas obliger les gens à réécrire leurs tests s'ils dépendent de différences subtiles entre l'ancienne et la nouvelle implémentation. Dans Jest 26, cette nouvelle implémentation restera opt-in et peut être activée en appelant jest.useFakeTimers('modern') ou en passant modern à l'option timers dans votre configuration si vous aviez opté pour tous les tests en temporisateurs fictifs précédemment.

Dans Jest 27, nous échangerons la valeur par défaut contre la nouvelle implémentation "modern" mais nous continuerons à soutenir et à maintenir l'implémentation héritée qui peut être utilisée en appelant jest.useFakeTimers('legacy'). Si vous n'êtes pas sûr de pouvoir mettre à jour tous vos tests d'ici la sortie de Jest 27, vous pouvez ajouter cette option à vos tests maintenant 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 leur patience lorsqu'ils ont travaillé avec nous pour que cela se réalise ! Intéressant.

Une nouvelle façon de consommer Jest - @jest/globals#

Jest s'est appuyé sur les globaux populaires du framework de test Jasmine et d'autres tels que describe, it, test et expect. Bien que ce modèle soit largement utilisé, de nombreuses personnes ont exprimé leur préférence pour l'importation de fonctions liées aux tests. Pour prendre en charge ce cas d'utilisation, nous avons ajouté un nouveau package @jest/globals qui peut être utilisé pour importer des fonctions de test : import {expect, jest, test} from '@jest/globals';.

Mises en garde :

  • Actuellement, les globales existent encore dans l'environnement, mais nous allons introduire un mode pour désactiver les globales à l'avenir. De même, vous ne pouvez pas utiliser const jest = require('@jest/globals') car vous obtiendrez des erreurs de déclaration car la variable jest est toujours une globale pour le moment.
  • Il n'existe actuellement aucun moyen d'ajouter des comparateurs personnalisés aux définitions TypeScript lors de l'utilisation de globaux comme celui-ci.
  • Bien que cela permette d'exécuter des tests sans globales, cela ne permet pas d'exécuter des tests sans le gestionnaire de tests de Jest pour le moment.

Support natif de l'ESM#

Comme mentionné dans l'article du blog Jest 25 nous avons travaillé sur le support natif des modules ECMAScript. Il n'est pas encore stable, mais il est prêt à être testé. Nous serions ravis de recevoir vos commentaires et vos rapports de bogue ! Pour un aperçu de l'état actuel, vous pouvez consulter cette issue, ou parcourir toutes les questions portant cette étiquette ES Modules.

Autres changements de rupture dans Jest 26#

  • Arrêt de la prise en charge de Node 8 (#9423)
  • [jest-environment-jsdom] Mise à niveau de jsdom vers la v16 (#9606)
  • [jest-runtime] Suppression des méthodes require.requireActual et require.requireMock dépréciées depuis longtemps (#9854)
  • [jest-haste-map] Suppression de providesModuleNodeModules (#8535)
  • [jest-circus] Fait échouer les tests si un test prend une callback done et a des valeurs de retour (#9129)
  • [jest-circus] Déclenche une erreur correcte si un test / hooks est défini de manière asynchrone (#8096)

Prenez soin de vous#

Nous vivons tous actuellement une période d'incertitude sans précédent. Si vous avez des difficultés financières, nous aimerions utiliser le fond collectif ouvert de Jest pour aider les nouveaux et anciens contributeurs. Nous plaçons des primes sur certaines issues et sommes ouverts à offrir une prime sur n'importe lequel de nos issues ouvertes actuelles - vous pouvez mentionner qu'une issue devrait avoir une prime dans l'issue ou contacter @cpojer par message privé sur Twitter.

Soyez prudent.