Jest 20: 💖 Begeisterndes Testen & 🏃🏽 Multi-Project-Runner
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Vor einigen Monaten kündigten wir Jest 19 an - mit wichtigen Neuerungen und dem bis dahin größten Jest-Release. Jest 20 bringt doppelt so viele Änderungen wie die Vorgängerversion, beinhaltet eine komplette Neuimplementierung des Test Runners und führt neue Test-APIs ein. Diese Version ermöglicht eine neue Ebene der Anpassung und Konfiguration für Projekte, während das Upgrade mühelos bleibt. Über schmerzfreies JavaScript-Testen hinaus bieten wir nun ein begeisterndes JavaScript-Test-Erlebnis. Werfen wir einen detaillierten Blick auf die besten Neuerungen:
Multi-Project-Runner & Konfigurations-Überarbeitung
Bisher konnte Jest nur in einem Projekt gleichzeitig arbeiten. Das ist besonders umständlich bei vielen kleineren Projekten mit eigenen Setups und Konfigurationen. Mit Jest 20 haben wir den Test Runner komplett neu entwickelt, um mehrere Projekte gleichzeitig in einer Jest-Instanz auszuführen - ideal etwa für React-Frontends und Node.js-Backends. Hier ein Video, wie Jest Tests für React, Relay, Yarn und Jest parallel ausführt:

Jest klappt die Bedienungsanleitung nach dem ersten Testlauf nun ein, um vertikalen Platz im Terminal zu sparen.
Zudem haben wir das Konfigurationssystem komplett überarbeitet. Sie können jetzt beliebige Konfigurationsoptionen per CLI übergeben, um Dateieinstellungen zu überschreiben. Standardmäßig sucht Jest nun nach jest.config.js - Sie können Konfigurationen also in JavaScript definieren oder wie bisher via package.json. Diese Neuerungen ermöglichen leistungsfähigere Jest-Kombinationen. Beispiel: Um herauszufinden, welche Tests Jest bei geänderten Dateien über mehrere Projekte in einem Monorepo ausführen würde, kombinieren Sie jetzt CLI-Argumente wie folgt:
$ jest --projects projectA projectB --listTests --findRelatedTests projectA/banana.js projectB/kiwi.js
[
"projectA/banana.test.js",
"projectB/kiwi.test.js",
"projectB/pineapple.test.js",
]
Besonders nützlich für Continuous-Integration-(CI)-Systeme: So lassen sich gezielt Tests für Pull Requests ausführen, ohne bei jeder Kleinigkeit tausende Testdateien zu prüfen.
Abschließend mappen wir Code Coverage bei TypeScript nun korrekt und berechnen die Abdeckung ungetesteter Dateien in Worker-Prozessen - was diese Funktion erheblich beschleunigt.
Neue & verbesserte Test-APIs
Wir haben die Test-APIs um zahlreiche Ergänzungen verbessert, die effektiveres Testen ermöglichen. Besonders hervorheben möchten wir: Alle diese Verbesserungen stammen vollständig aus der Community!
-
Bessere asynchrone Tests: Neue Async-/Promise-Unterstützung via resolves/rejects-Modifikatoren bei expect:
expect(Promise(…)).resolves.toEqual(…). Siehe Dokumentation. -
Erwarte
nAssertions: Nebenexpect.assertions(n)stelltexpect.hasAssertions()sicher, dass ein Test mindestens eine Assertion enthält. -
Lint-Plugin: Die
valid-expect-Regel ineslint-plugin-jesterzwingt einen Assertion-Aufruf nachexpect. Verhindert Fehler wie versehentlichesexpect(banana);ohne Assertion. -
Pretty-Format-Plugins: Neue Plugins für Immutable.js-Datenstrukturen und HtmlElements - nun in Assertion-Fehlern und Snapshots lesbar formatiert.
-
Benutzerdefinierte Umgebung: Per
@jest-environment node|jsdom-Annotation im Doc-Block-Kommentar einer Testdatei können Sie individuelle Testumgebungen abweichend vom Standard nutzen.
Hier ist ein Beispiel, wie die neuen APIs zusammen das Testen angenehmer gestalten:
/**
* @jest-environment node
*/
test('compares apples and bananas', async () => {
expect.hasAssertions(); // Ensure this test has at least one assertion.
await expect(
Promise.resolve(Immutable.Map({apples: 1, bananas: 2})),
).resolves.toEqual(Immutable.Map({apples: 1, bananas: 3}));
expect('banana'); // valid-expect in eslint-plugin-jest will show an error.
});
Dieses Beispiel liefert bei einem Testfehler eine Ausgabe ähnlich dieser:

Breaking Changes
Wie bei jedem Major-Release nehmen wir einige Breaking Changes vor, um größere zukünftige Änderungen zu ermöglichen und das Testing-Erlebnis auf ein neues Niveau zu heben. Diesmal haben wir unser Bestes gegeben, nur APIs zu brechen, von denen wir erwarten, dass sie die Mehrheit der Jest-Nutzer nicht betreffen:
-
Fork von Jasmine 2.5: Wir haben uns entschieden, Jasmine selbst zu forken und die Kontrolle über den Jest-Testrunner zu übernehmen. Dies ermöglicht zukünftige Verbesserungen am Unit-Testing-Erlebnis. Aktuell konzentrieren wir uns auf inkrementelle Refactorings und die Reduzierung der API-Oberfläche. Falls Tests durch fehlende Jasmine-APIs brechen, sollte es äquivalente Funktionen in
jestoderexpectgeben. Entsprechend haben wir viele selten genutzte Jasmine-Features entfernt. -
Neue Snapshots auf CI: Snapshots müssen immer zusammen mit ihren Tests und Modulen committet werden. Jest speichert neue Snapshots in CI-Umgebungen oder mit
--ci-Flag nicht mehr automatisch. Zum Überschreiben dieses Verhaltens (nicht empfohlen) kann--updateSnapshotverwendet werden. -
Babel-Polyfill: Jest lud früher automatisch
babel-polyfillbei Verwendung von babel-jest, was zu Memory-Leaks führte. In den meisten Node-Versionen istbabel-polyfillunnötig, daher wurde die automatische Einbindung entfernt. Stattdessen bindet Jest nur noch standardmäßigregenerator-runtimeein (für Async/Await-Support in älteren Node-Versionen). Bei Bedarf kannbabel-polyfillmanuell in Setup-Dateien eingebunden werden.
Weitere Verbesserungen
-
Dokumentation: Wir haben die Dokumentation um eine Snapshot-Testing-FAQ, Anleitungen für gängige JavaScript-Bibliotheken und die neuen Features erweitert.
-
Übersetzungen: Wir bitten um Hilfe bei der Übersetzung der Jest-Dokumentation, um das Lernen zu erleichtern.
-
Custom Reporter: Jest unterstützt jetzt benutzerdefinierte Reporter über die
reporters-Konfiguration. Die Ausgabe kann angepasst und Integrationen mit anderen Tools (z.B. XML-Reports) ermöglicht werden. Siehe Dokumentation. -
Codebase-Gesundheit: Die schnelle Iteration war nur möglich durch Investitionen in die Codebase: Frühe Adoption von prettier, erhöhte Flow-Abdeckung, Jasmine-Fork und umfangreiche Refactorings.
-
Bugfixes: Wie immer zahlreiche Fehlerbehebungen. Vollständiges Changelog im Jest-Repository.
Vorträge über Jest
Kürzlich haben Jest-Core-Mitglieder und Mitwirkende auf Konferenzen über ihre Erfahrungen berichtet:
-
Rogelio Guzman: Jest Snapshots and Beyond auf der React Conf.
-
Mein Vortrag Building High-Quality JavaScript Tools auf der F8-Konferenz.
Wie immer wäre diese Veröffentlichung ohne euch, die JavaScript-Community, nicht möglich gewesen. Wir sind unglaublich dankbar, dass wir die Gelegenheit bekommen, gemeinsam an der Verbesserung von JavaScript-Tests zu arbeiten. Wenn du zu Jest beitragen möchtest, zögere bitte nicht, uns auf GitHub oder auf Discord zu kontaktieren.
