Jest 28: Schlanker und mit besserer Kompatibilität 🫶
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Jest 28 ist endlich da und bringt einige lang erwartete Funktionen mit, wie die Unterstützung für Sharding von Testläufen über mehrere Maschinen, Package exports und die Möglichkeit, das Verhalten von Fake Timers anzupassen. Das sind nur einige persönliche Highlights, und wir werden in diesem Blogbeitrag noch mehr hervorheben.
Zusätzlich haben wir, wie im Jest 27 Blogbeitrag vom letzten Jahr angekündigt, einige standardmäßig nicht mehr benötigte Pakete aus der Standardinstallation entfernt. Dadurch hat sich die Installationsgröße um etwa ein Drittel reduziert.
Breaking Changes
Die Liste der Breaking Changes ist lang (und vollständig im Changelog einsehbar), aber zur Migration haben wir auch eine Anleitung erstellt. Hoffentlich macht dies das Upgrade so reibungslos wie möglich!
Die Haupt-Breaking Changes, die deine Migration betreffen könnten, sind der eingestellte Support für Node 10 und 15 (aber nicht Node 12, das in wenigen Tagen EOL erreicht) sowie einige umbenannte Konfigurationsoptionen.
Bitte beachte, dass beide entfernten Module (jest-environment-jsdom und jest-jasmine2) weiterhin aktiv gewartet und auf dieselbe Weise getestet werden - die einzige Änderung ist, dass du sie nun explizit installieren musst.
Die Anleitung sollte die Migration einfach gestalten, aber beachte: Wenn du einzelne Jest-Pakete direkt verwendest (wie jest-worker oder pretty-format) statt nur jest auszuführen, musst du das Changelog auf Breaking Changes prüfen.
Funktionen
Kommen wir nun zu den neuen Funktionen in Jest 28 - das ist viel spannender! Und es gibt einige davon, also mach dich bereit.
Sharding von Testläufen
Jest bietet jetzt eine neue --shard-CLI-Option, beigetragen von Mario Nebl. Sie ermöglicht das Verteilen von Tests auf mehrere Maschinen - eine der ältesten Feature-Anfragen für Jest.
Jests eigene Testsuite auf CI wurde von ca. 10 auf 3 Minuten (Ubuntu) und von 20 auf 7 Minuten (Windows) beschleunigt.
package.json exports
Jest 27.3 brachte minimale exports-Unterstützung, aber nur für den Haupt-Einstiegspunkt (.) und nur, wenn in package.json kein main-Feld vorhanden war. Mit Jest 28 liefern wir nun vollständige Unterstützung!
Zusätzlich: Während Jest 27 nur require oder import-Bedingungen bot, liefert jest-environment-node nun automatisch node und node-addons, während jest-environment-jsdom die browser-Bedingung bereitstellt.
Dies war eines der größten Kompatibilitätsprobleme von Jest - hoffentlich nun endgültig gelöst.
Fake Timers
Jest 26 führte "moderne" Fake Timers mit @sinonjs/fake-timers ein, Jest 27 machte sie zum Standard. In Jest 28 machen wir mehr der Implementierung über Konfiguration und Runtime-APIs zugänglich. Großer Dank an Tom Mrazauskas für dieses Feature!
Dadurch müssen Sie process.nextTick nicht mehr nachahmen, was die Kompatibilität mit gefälschten Promises verbessert, oder Sie können advanceTimers aktivieren, wodurch Timer automatisch vorgerückt werden.
Details finden Sie in der fakeTimers-Konfiguration.
GitHub Actions Reporter
Jest bietet jetzt einen Reporter für GitHub Actions, der Anmerkungen verwendet, um Testfehler direkt im Kontext anzuzeigen.

Sie aktivieren diesen Reporter, indem Sie github-actions in der reporters-Konfigurationsoption angeben.
Großer Dank an Bernie Reiter und andere Mitwirkende, die uns unterstützt und dieses Feature schließlich umgesetzt haben.
Inline-testEnvironmentOptions
Sie können jetzt testEnvironmentOptions direkt in einer Datei übergeben, ähnlich wie bei der Testumgebung. Dies ist nützlich, wenn Sie z.B. die URL in einer einzelnen Datei ändern möchten.
/**
* @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/');
});
Alle Node.js-Globals
Wenn Sie die neue fetch-Implementierung in Node v18 verwenden, ist Ihnen vielleicht aufgefallen, dass diese Funktion in Jest nicht verfügbar ist. Es war ein langjähriges Problem, dass wir Globals manuell in die Testglobals kopieren mussten. Mit Jest 28 ist dies behoben: Wir analysieren nun die globale Umgebung, in der Jest selbst läuft, und kopieren fehlende Globals in die Testumgebung.
ECMAScript Modules (ESM)
Seit Jest 27 hat sich an der nativen ESM-Unterstützung wenig geändert. Wir warten weiterhin auf die Stabilisierung in Node und hoffen, dass sich die Situation bald verbessert!
Allerdings konnten wir Jest 28 einige neue Features hinzufügen.
data:-URLs
Tommaso Bossi hat Unterstützung für data-URLs beigetragen. Sie können jetzt JavaScript-Code inline definieren und ausführen, ohne eval zu verwenden.
import.meta.jest
Zwar konnten Sie jest bereits über import {jest} from '@jest/globals' verwenden, aber viele fanden dies weniger praktisch als die (scheinbar globale) jest-Variable in CJS. Daher führt Jest 28 import.meta.jest für einfacheren Zugriff ein.
Verschiedenes
Das sind bereits viele Features – meine persönlichen Highlights. Aber es gibt noch einige weitere, die ich kurz vorstellen möchte:
Asynchrone Resolver
Ian VanSchooten hat Unterstützung für asynchrone Resolver beigetragen. Dies ermöglicht Tools wie Vite bessere Integrationen mit Jest.
Asynchrone Setup-Dateien
Wenn Sie in setupFiles asynchrone Aufgaben ausführen möchten, können Sie jetzt eine async function exportieren, die Jest vor dem Laden von Tests aufruft und abwartet.
Hinweis: Dieses Feature ist nur für CJS verfügbar. Für ESM empfehlen wir stattdessen Top-Level-await.
Verwendung von globalThis
Intern verwendete Jest bisher global, um auf die globale Umgebung zu verweisen. Da dies jedoch nur in Node existiert und nicht in Browsern (window), führte dies zu Inkompatibilitäten beim Versuch, Jest-Module in anderen Umgebungen zu verwenden.
Jest 28 verwendet stattdessen globalThis, das in allen Umgebungen funktioniert.
JSDOM 19
Wie erwähnt, liefert Jest jest-environment-jsdom zwar nicht mehr standardmäßig mit, aber es wird weiterhin aktiv gepflegt. Als Teil davon wurde in Jest 28 von jsdom@16 auf jsdom@19 aktualisiert.
TypeScript
Wenn du Jest mit TypeScript verwendest, sei es in deinen Tests oder beim Schreiben von Plugins wie benutzerdefinierten Runnern, bringt Jest 28 umfangreiche Verbesserungen an unseren Typen mit. Hier ist eine nicht vollständige Liste der Änderungen in Jest 28.
expect
Bei Verwendung der eigenen Typen von expect (entweder direkt oder via import {expect} from '@jest/globals') ist es nun endlich möglich, benutzerdefinierte Matcher hinzuzufügen. Siehe unser Beispiel, wie dies geht.
Benutzerdefinierte Plugins
Wenn du benutzerdefinierte Runner, Test-Reporter, Resolver oder ähnliches schreibst, exportieren wir nun mehr Typen, die dir helfen sollen, diese korrekter zu typisieren. Dies ist ein laufender Prozess – wenn du also Autor eines erweiterbaren Jest-Plugins bist und die Typen nicht so hilfreich sind wie möglich, melde bitte ein Issue!
jest-runner-tsd
jest-runner-tsd ist ein benutzerdefinierter Runner zum Ausführen von Typ-Tests. Dies verwendet Jest selbst, um unsere Typen zu testen, und wir hoffen, dass es auch von anderen genutzt werden kann! Wie der Name schon sagt, basiert es auf tsd, verwendet jedoch intern den Fork tsd-lite.
Alle diese Verbesserungen und Fixes wurden von Tom Mrazauskas beigetragen. Vielen Dank, Tom! 👏
Zuletzt ist die minimal unterstützte TypeScript-Version nun 4.3.
jest-light-runner
Das letzte Highlight dieses Blogposts ist ein cooler neuer Jest-Runner namens jest-light-runner, erstellt von Nicolò Ribaudo. Er behält fast die gesamte DX, für die Jest bekannt ist, beschleunigt sie aber erheblich durch eine schlankere Abstraktionsebene auf Node. Babels Tests wurden nach der Migration fast doppelt so schnell. Trotz einiger Einschränkungen sollte dieser Runner die Wahl von Jest für kleinere Node-Module noch attraktiver machen. Danke, Nicolò!
Zukunft
Während Jest 28 fast ein Jahr nach Jest 27 erschien, wird Jest 29 voraussichtlich bereits in wenigen Monaten folgen. Derzeit ist nur eine Breaking Change geplant (abgesehen vom Entfernen von Node-Versionen): Die Standardeinstellung von snapshotFormat wird auf {escapeString: false, printBasicPrototype: false} gesetzt. Dies macht Snapshots besser lesbar und kopierfreundlicher.
Diese Einstellung lässt sich natürlich überschreiben, wenn du sie nicht ändern möchtest. Du kannst diese Optionen aber auch schon heute verwenden, wenn du nicht warten willst!
Danksagungen
Jest 28 enthält Beiträge von mehr als 60 Personen, wovon über zwei Drittel zum ersten Mal mitgewirkt haben. Vielen herzlichen Dank an alle Mitwirkenden, alte und neue. Ohne euch wäre das Projekt bei weitem nicht so gut, wie es heute ist! Besonderer Dank gilt Tom Mrazauskas und Feng Yu für all ihre Beiträge – vom Code über das Issue-Triaging bis zum Debugging – die Jest 28 zu dem gemacht haben, was es ist. Danke! 🙏
Danke fürs Lesen und viel Spaß beim Testen! 🃏
