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. One of the instrumental releases was Jest 15 which tied everything together and provided good defaults that allowed people to run Jest often without any setup. 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. We have made the following breaking changes in Jest 26:
-
[expect, jest-mock, pretty-format]RemoveES5build files with a new minimum of support of ES2015 (Node 8) which were only used for browser builds (#9945)Migration: With this change, we are pushing the responsibility to bundle the affected packages to the users, rather than Jest providing them out of the box, since they know their target environments best. 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]Remove support forbrowserfield (#9943)Migration: Install
browser-resolvemodule and use the following configuration:{"jest": {"resolver": "<rootDir>/resolver.js"}}// resolver.jsconst browserResolve = require('browser-resolve');module.exports = browserResolve.sync; -
TypeScript definitions requires a minimum of 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. Jest's own size was reduced by 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. Therefore we will make the following changes in Jest 27 and Jest 28 using a “Tick-Tock" release process:
- Jest 27 will ship with a new test runner "
jest-circus" and the Node.js environment by default.jest-jasmine2andjest-environment-jsdomwill still be bundled so users can keep using them by changing one-line each in the configuration. - Jest 28 will remove
jest-jasmine2andjest-environment-jsdomfrom the default distribution of 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 will continue to ship with babel-jest enabled by default. 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 currently ships with experimental support for V8 coverage and native support for ES Modules (more on that below!). 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. Once V8 coverage and native ESM support stabilizes in Jest, we will also be able remove babel-jest as a default but we will keep maintaining it.
Nouveaux temporisateurs fictifs
With Jest 26 we are shipping a new implementation of fake timers based on @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.
The new implementation comes with extra features such as mocking Date, queueMicrotask and more, see this README. It works transparently using the existing timer APIs like jest.runAllTimers() – check out the documentation on our website.
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. In Jest 26, this new implementation will remain opt-in and can be activated by calling jest.useFakeTimers('modern') or by passing modern to the timers option in your config if you opted all tests into fake timers previously.
In Jest 27 we will swap the default to the new "modern" implementation but we will keep supporting and maintaining the legacy implementation which can be used by calling 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.
We'd like to thank Carl-Erik Kopseng, Benjamin Gruenbaum and other maintainers of @sinonjs/fake-timers for their help and patience when working with us to make this happen! Exciting.
A new way to consume Jest - @jest/globals
Jest has relied on globals popularized by the Jasmine testing framework and others such as describe, it, test and 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. To support this use case, we added a new package @jest/globals that can be used to import testing functions: 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. Similarly, you cannot use
const jest = require('@jest/globals')as you'll get declaration errors because thejestvariable is still a global for now. - 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
As mentioned in the Jest 25 blog post we have been working on native support for ECMAScript Modules. 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 ! For an overview of the current state you can check out this issue, or browse all issues with that label ES Modules.
Autres changements de rupture dans Jest 26
- Dropped support for Node 8 (#9423)
[jest-environment-jsdom]Upgradejsdomto v16 (#9606)[jest-runtime]Remove long-deprecatedrequire.requireActualandrequire.requireMockmethods (#9854)[jest-haste-map]RemovedprovidesModuleNodeModules(#8535)[jest-circus]Fail tests if a test takes a done callback and have return values (#9129)[jest-circus]Throw a proper error if a test / hooks is defined asynchronously (#8096)
Prenez soin de vous
Nous vivons tous actuellement une période d'incertitude sans précédent. If you are struggling financially, we would like to use Jest’s Open Collective fund to help new and existing contributors. We place bounties on some issues and are open to offering a bounty on any of our current open issues - you can mention that an issue should have a bounty in the issue or contact @cpojer via private message on Twitter.
Soyez prudent.
