Aller au contenu principal

Jest 28 : Perte de poids et compatibilité accrue 🫶

· 9 minutes de lecture
Simen Bekkhus
Simen Bekkhus

Jest 28 is finally here, and it comes with some long requested features such as support for sharding a test run across multiple machines, package exports and the ability to customize the behavior of fake timers. Il ne s'agit là que de quelques points marquants et nous en soulignerons d'autres dans cet article du blog.

Additionally, as announced in the Jest 27 blog post last year, we have removed some packages that no longer are used by default from the default installation. En conséquence, la taille de l'installation a diminué d'environ 1/3.

Changements de rupture

The list of breaking changes is long (and can be seen fully in the changelog), but for migration purposes, we've also written a guide you can follow. Nous espérons que cela rendra la mise à jour aussi simple que possible !

Main breaking changes likely to impact your migration are dropped support for Node 10 and 15 (but not Node 12, which will be EOL in a few days) and some renamed configuration options.

Please note that both of the removed modules (jest-environment-jsdom and jest-jasmine2) are still actively maintained and tested in the same way, so the only breaking change here is that you'll need to explicitly install them.

The guide should hopefully make migration trivial, but note that if you use any of the packages Jest consists of directly (such as jest-worker or pretty-format), instead of just running jest, then you need to go through the changelog to view any breaking changes.

Fonctionnalités

Parlons maintenant des nouvelles fonctionnalités de Jest 28, qui sont bien plus intéressantes ! Et il y en a pas mal, alors accrochez-vous.

Partage de l'exécution des tests

Jest now includes a new --shard CLI option, contributed by Mario Nebl. Elle vous permet d'exécuter des parties de vos tests sur différentes machines, et a été l'une des plus anciennes demandes de fonctionnalités de Jest.

La propre suite de tests de Jest sur CI est passée d'environ 10 minutes à 3 sur Ubuntu, et sur Windows de 20 minutes à 7.

package.json exports

Jest shipped minimal support of exports in 27.3. However, it only supported the "main" entry point (.), and only if no main field was present in package.json. Avec Jest 28, nous sommes heureux de vous offrir enfin un support complet !

Related, in Jest 27, we provided either require or import condition. In Jest 28, jest-environment-node will now automatically provide node and node-addons conditions, while jest-environment-jsdom will provide the browser condition.

Cela a été l'un des plus gros problèmes de compatibilité de Jest, et j'espère que cela sera résolu une fois pour toutes.

Faux temporisateurs

Jest 26 introduced the concept of "modern" fake timers, which uses @sinonjs/fake-timers under the hood, and Jest 27 made it the default. Dans Jest 28, nous exposons désormais davantage l'implémentation sous-jacente par le biais des API de configuration et d'exécution. Huge thanks to Tom Mrazauskas who contributed this feature!

This allows you to not mock out process.nextTick which improves compatibility with fake Promises, or to enable advanceTimers which automatically advance timers.

Please see the fakeTimers configuration for details.

Rapporteur GitHub Actions

Jest est livré avec un rapporteur à utiliser sur GitHub Actions, qui utilisera des annotations pour afficher les erreurs de test en ligne.

GitHub Actions test error screenshot

You can activate this reporter by passing github-actions in the reporters configuration option.

Huge thanks to Bernie Reiter and other contributors for sticking by us and finally landing this feature.

Inline testEnvironmentOptions

You can now pass testEnvironmentOptions inline in a file, similar to how you can set test environment. Ceci est utile si vous voulez par exemple changer l'URL dans un seul fichier.

/**
* @jest-environment jsdom
* @jest-environment-options {"url": "https://jestjs.io/"}
*/

test('use jsdom and set the URL in this test file', () => {
expect(window.location.href).toBe('https://jestjs.io/');
});

Tous les globaux de Node.js

If you are using the new fetch implementation in Node v18, you might have noticed that this function is not available in Jest. Le fait de devoir copier manuellement tous les globaux dans les globaux de test est un problème de longue date. Avec Jest 28, ce n'est plus un problème car nous inspectons maintenant l'environnement global dans lequel Jest lui-même s'exécute, et copions tous les globaux qui manquent dans l'environnement de test.

Modules ECMAScript

Peu de choses ont changé dans le support de Jest pour l'ESM natif depuis la sortie de Jest 27. We continue to be blocked by stabilization in Node, and are hopeful this situation will improve sooner rather than later!

Cependant, nous avons pu ajouter quelques nouvelles fonctionnalités dans Jest 28.

data: URLs

Tommaso Bossi has contributed support for data URLs, meaning you can now inline define some JavaScript to run without using eval.

import.meta.jest

While you have been able to access jest via import {jest} from '@jest/globals' in Jest, we've received feedback that this is less ergonomical than the (seemingly, but not really) global jest variable available in CJS. So Jest 28 ships with import.meta.jest to allow easier access.

Divers

C'est beaucoup de fonctionnalités, et ce sont mes points forts. Cependant, nous avons encore beaucoup d'autres choses que je vais passer rapidement :

Résolveurs asynchrones

Ian VanSchooten has contributed support for asynchronous resolvers, which enables tools like Vite to have better integrations with Jest.

Fichiers de configuration asynchrones

If you have some async work you want to do when using setupFiles, you can now export an async function, which Jest will call and await before loading any tests.

Notez que cette fonctionnalité n'est disponible que pour CJS. For ESM, we recommend using top-level await instead.

Using globalThis

Internally, Jest has been using global to refer to the global environment. However, since this only exists in Node, and not browsers (window), this led to incompatibility when attempting to use Jest's modules in another environment.

Jest 28 uses globalThis instead, which works in all environments.

JSDOM 19

While, as mentioned, Jest no longer ships jest-environment-jsdom in the default installation, it is still actively maintained. As part of that, Jest 28 has upgraded from jsdom@16 to jsdom@19.

TypeScript

Si vous utilisez Jest avec TypeScript, soit dans vos tests ou lors de l'écriture de plugins tels que des exécuteurs personnalisés, Jest 28 apporte de nombreuses améliorations à nos types. Voici une liste non exhaustive des changements dans Jest 28.

expect

When using expect's own types (either directly, or via import {expect} from '@jest/globals'), it's now finally possible to add custom matchers. See our example for how to do this.

Plugins personnalisés

Si vous écrivez un exécuteur personnalisé, un reporteur de test, un résolveur ou autre chose, nous exportons maintenant plus de types qui devraient vous aider à taper ces types plus correctement. Il s'agit d'une cible en mouvement, donc si vous êtes l'auteur de quelque chose de branchable dans Jest et que les types ne sont pas aussi utiles qu'ils pourraient l'être, s'il vous plaît remplir un problème !

jest-runner-tsd

jest-runner-tsd is a custom runner for running type tests. C'est ce que Jest utilise lui-même pour tester nos types, et nous espérons qu'il pourra également être utilisé par d'autres ! As its name implies, it is based on tsd, although it under the hood uses the fork tsd-lite.


All of these improvements and fixes has been contributed by Tom Mrazauskas. Merci beaucoup ! 👏

Enfin, la version minimale de support de TypeScript est maintenant 4.3.

jest-light-runner

The last thing we want to highlight in this blog post, is a very cool new Jest runner, created by Nicolò Ribaudo, called jest-light-runner. Cela prend presque tout le DX Jest est connu, et accélère sa vitesse en étant une abstraction plus petite sur le dessus de Node. Les tests de Babel sont devenus presque deux fois plus rapides après la migration. Tant qu'il y a des avertissements, l'existence de cet exécuteur devrait rendre encore plus facile pour les personnes qui ont des modules de Node plus petite taille de tester pour choisir Jest. Merci, Nicolò !

A venir

Alors que Jest 28 est arrivé presque un an après Jest 27, Jest 29 arrivera plus tôt, probablement dans quelques mois. The current plan then is to just have one breaking change (except dropping Node versions), and that is to default snapshotFormat to {escapeString: false, printBasicPrototype: false}. Cela rend les snapshots à la fois plus lisibles et plus faciles à coller.

Cela sera bien sûr possible de passer outre si vous ne voulez pas changer, mais vous pouvez aussi utiliser ces options aujourd'hui si vous ne voulez pas attendre !

Remerciements

Jest 28 contient des contributions de plus de 60 personnes, dont plus de deux tiers sont les premiers contributeurs. Merci beaucoup à tous les contributeurs, anciens et nouveaux. Sans vous, le projet ne serait pas aussi bon qu'il est ! I'd particularly like to thank Tom Mrazauskas and Feng Yu for all their contributions, from code, to issue triaging to debugging, that made Jest 28 what it is. Merci! 🙏

Merci d'avoir lu, et heureux Jesting! 🃏