Zum Hauptinhalt springen

Jest 30: Schneller, schlanker, besser

· 12 Minuten Lesezeit
Svyatoslav Zaytsev
Svyatoslav Zaytsev
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Heute freuen wir uns, die Veröffentlichung von Jest 30 bekannt zu geben. Dieses Release umfasst eine beträchtliche Anzahl von Änderungen, Fehlerbehebungen und Verbesserungen. Obwohl es sich um eines der größten Major-Releases in der Jest-Geschichte handelt, geben wir zu, dass drei Jahre für ein Major-Release zu lang sind. Künftig streben wir häufigere Major-Releases an, um Jest auch im nächsten Jahrzehnt erstklassig zu halten.

Wenn Sie direkt loslegen möchten, ohne die Neuerungen zu lesen, führen Sie npm install jest@^30.0.0 aus und folgen Sie dem Migrationsleitfaden: Upgrading from Jest 29 to 30.

Was ist neu?

Jest 30 ist spürbar schneller, verbraucht weniger Speicher und bringt zahlreiche neue Funktionen mit. Zunächst werfen wir einen Blick auf die Breaking Changes:

Breaking Changes

  • Jest 30 stellt die Unterstützung für Node 14, 16, 19 und 21 ein.

  • jest-environment-jsdom wurde von jsdom 21 auf 26 aktualisiert.

  • Die minimal unterstützte TypeScript-Version ist nun 5.4.

  • Verschiedene expect-Aliase wurden entfernt. Der eslint-plugin-jest bietet einen Autofixer, den Sie ausführen können, um Ihre Codebase automatisch zu aktualisieren.

  • Nicht aufzählbare Objekteigenschaften werden standardmäßig von Objekt-Matchern wie toEqual ausgeschlossen.

  • Jest unterstützt nun standardmäßig .mts- und .cts-Dateien.

  • --testPathPattern wurde in --testPathPatterns umbenannt.

  • Jest behandelt Promises nun korrekt, die zunächst abgelehnt und später abgefangen werden, um falsch-positive Testfehler zu vermeiden.

  • Wir haben verschiedene Verbesserungen an Jests Snapshot-Darstellung vorgenommen, die möglicherweise Snapshot-Updates erfordern. Google hat goo.gl-Links eingestellt, die wir in Snapshots verwendet haben. Das gefällt uns auch nicht, aber Sie müssen alle Ihre Snapshots aktualisieren.

  • Jest selbst wird nun pro Paket in eine einzelne Datei gebündelt. Dies verbessert die Leistung, kann aber Probleme verursachen, wenn Sie Tools entwickelt haben, die auf Jests interne Struktur zugreifen.

Dies sind nur einige Highlights. Die vollständige Liste der Breaking Changes finden Sie im CHANGELOG und im Jest 30 Migrationsleitfaden.

Leistung & Speicherverbesserungen

Jest 30 bietet spürbare Leistungssteigerungen durch zahlreiche Optimierungen, insbesondere bei der Modulauflösung, Speichernutzung und Testisolierung. Durch die Verwendung des neuen unrs-resolver wurde die Modulauflösung in Jest funktionsreicher, standardkonformer und schneller. Dank an @JounQin für die Migration. Je nach Projekt können Sie deutlich schnellere Testläufe und reduzierten Speicherverbrauch beobachten. Beispielsweise verzeichnete eine große TypeScript-Anwendung mit Client und Server in einem Teil ihrer Codebase 37% schnellere Testläufe und 77% geringeren Speicherverbrauch:

Jest 29Jest 30
Server tests~1350s / 7.8 GB max~850s / 1.8 GB max
Client tests~49s / 1.0 GB max~44s / 0.8 GB max

Jest ist schnell, aber aufgrund der Testisolierung können langsame Benutzercodes Leistungsprobleme verschärfen und zu langsamen Testläufen führen. Wenn Tests offene Handles wie ungeschlossene Timer oder Verbindungen zu anderen Diensten hinterlassen, kann dies zu Hängern oder Verlangsamungen von Jest führen. Jest 30 erkennt und meldet solche Probleme besser, was Ihnen hilft, langsame oder problematische Tests leichter zu identifizieren und zu beheben. Bei Happo wurden Tests beispielsweise durch Bereinigung offener Handles und ein Upgrade auf Jest 30 um 50% beschleunigt – von 14 auf 9 Minuten.

Wenn Sie Dateien verwenden, die Exporte mehrerer Module in einer einzigen Datei konsolidieren (sogenannte "Barrel-Dateien"), empfehlen wir Tools wie babel-jest-boost, babel-plugin-transform-barrels oder no-barrel-file. Diese vermeiden das Laden großer Teile des Anwendungscodes für jede Testdatei und können zu Leistungssteigerungen von bis zu 100x führen.

Bereinigung von Globals zwischen Testdateien

Jest erreicht Testisolierung zwischen Dateien, indem jeder Test in einem separaten VM-Kontext läuft, was jeder Datei eine frische globale Umgebung bietet. Wenn Ihr Code jedoch Globals nach jeder Testdatei nicht bereinigt, kann dies zu Speicherlecks in Jest führen und Ihre Testläufe verlangsamen. Jest 30 führt ein neues Feature ein, das Sie über nicht korrekt bereinigte Globals nach einem Testlauf informiert.

Zukünftig wird Jest Globals automatisch nach jedem Testlauf bereinigen. Falls Sie mit Jest 30 keine Warnungen zu unbereinigten Globals erhalten, können Sie den Bereinigungsmodus bereits jetzt auf "on" setzen, um dieses Feature vollständig zu aktivieren und von erheblichen Speichereinsparungen und Leistungsverbesserungen zu profitieren:

export default {
testEnvironmentOptions: {
globalsCleanup: 'on',
},
};

Die Standardeinstellung in Jest ist globalsCleanup: 'soft'. Um dieses Feature zu deaktivieren, können Sie es auf off setzen. Wenn Sie bestimmte globale Objekte vor der Bereinigung schützen müssen – beispielsweise gemeinsame Hilfsfunktionen oder Caches – können Sie diese mit jest-util als geschützt markieren:

import {protectProperties} from 'jest-util';

protectProperties(globalThis['my-property']);

Ein Dank geht an @eyalroth für die Implementierung dieses Features!

Neue Funktionen

Verbesserte Unterstützung für ECMAScript-Module & TypeScript

Die Unterstützung für import.meta.* und file:// wurde bei der Verwendung von nativen ESM mit Jest hinzugefügt. Zusätzlich können Sie nun Ihre Jest-Konfigurationsdateien in TypeScript schreiben, und .mts- sowie .cts-Dateien werden nativ unterstützt, ohne zusätzliche Konfiguration zu benötigen. Falls Sie Node's native TypeScript-Typenentfernungsfunktion nutzen, laden wir den TypeScript-Transformer nicht mehr, was zu schnelleren Testläufen führt.

Spies und das using-Schlüsselwort

Sie können nun JavaScripts neue explizite Ressourcenverwaltungssyntax (using) mit Jest-Spies verwenden. Wenn Ihre Umgebung dies unterstützt, wird durch using jest.spyOn(obj, 'method') der Spy automatisch beim Verlassen des Blocks zurückgesetzt, sodass keine manuelle Bereinigung nötig ist.

test('logs a warning', () => {
using spy = jest.spyOn(console, 'warn');
doSomeThingWarnWorthy();
expect(spy).toHaveBeenCalled();
});

Dokumentation

expect.arrayOf

Jest 30 führt einen neuen asymmetrischen Matcher ein: expect.arrayOf. Dieser ermöglicht die Validierung jedes Elements eines Arrays gegen eine Bedingung oder einen Typ. Beispielsweise können Sie ein Zahlenarray prüfen, bei dem alle Elemente Zahlen sind:

expect(someArray).toEqual(expect.arrayOf(expect.any(Number)));

Dokumentation

Neuer test.each-Platzhalter: %$

Bei datengesteuerten Tests mit test.each können Sie jetzt den speziellen Platzhalter %$ in Ihren Testtiteln verwenden, um die laufende Nummer des Testfalls einzufügen. Beispiel:

test.each(cases)('Case %$ works as expected', () => {});

ersetzt %$ durch die laufende Nummer des Testfalls.

Dokumentation

jest.advanceTimersToNextFrame()

@sinonjs/fake-timers wurde auf v13 aktualisiert und fügt jest.advanceTimersToNextFrame() hinzu. Diese neue Funktion ermöglicht es, alle ausstehenden requestAnimationFrame-Callbacks zur nächsten Frame-Grenze vorzurücken. Dadurch lassen sich Animationen oder Code, der auf requestAnimationFrame angewiesen ist, leichter testen, ohne Millisekunden schätzen zu müssen.

Dokumentation

Konfigurierbare Test-Wiederholungen

Jest 30 erweitert jest.retryTimes() mit neuen Optionen, die Ihnen mehr Kontrolle über den Umgang mit Wiederholungen geben. Sie können eine Verzögerung festlegen oder einen fehlgeschlagenen Test sofort wiederholen, anstatt auf das Ende der gesamten Testsuite zu warten:

// Retry failed tests up to 3 times, waiting 1 second between attempts:
jest.retryTimes(3, {waitBeforeRetry: 1000});

// Immediately retry without waiting for other tests to finish:
jest.retryTimes(3, {retryImmediately: true});

Dokumentation

jest.unstable_unmockModule()

Jest 30 führt die neue experimentelle API jest.unstable_unmockModule() für eine präzisere Steuerung beim Aufheben von Mocks ein (insbesondere bei Verwendung von nativen ESM).

Dokumentation

jest.onGenerateMock(callback)

Eine neue Methode onGenerateMock wurde hinzugefügt. Sie registriert eine Callback-Funktion, die immer dann aufgerufen wird, wenn Jest einen Mock für ein Modul generiert. Dieser Callback ermöglicht es Ihnen, den Mock zu modifizieren, bevor er an Ihre Testumgebung zurückgegeben wird:

jest.onGenerateMock((modulePath, moduleMock) => {
if (modulePath.includes('Database')) {
moduleMock.connect = jest.fn().mockImplementation(() => {
console.log('Connected to mock DB');
});
}
return moduleMock;
});

Dokumentation

Weitere Verbesserungen

Benutzerdefinierte Objektserialisierung

Jest's Matcher-Utilities unterstützen nun die Definition einer statischen SERIALIZABLE_PROPERTIES auf benutzerdefinierten Objekten. Dadurch können Sie steuern, welche Eigenschaften eines benutzerdefinierten Objekts in Snapshots und Fehlermeldungen einbezogen werden, was die Ausgabe fokussierter und relevanter macht.

Dokumentation

Asynchrone Setup-Unterstützung

Testdateien, die in setupFilesAfterEnv aufgelistet sind, können nun eine asynchrone Funktion exportieren oder Top-Level-await verwenden, ähnlich wie setupFiles.

Und so viel mehr…

Werfen Sie einen Blick in das vollständige CHANGELOG, um alle Änderungen, Verbesserungen und neuen Funktionen zu sehen.

Bekannte Probleme

jsdom hat Änderungen vorgenommen, um spezkonformer zu werden. Dies könnte einige Anwendungsfälle beeinträchtigen, insbesondere das Mocking von window.location in Tests. Jest liefert nun @jest/environment-jsdom-abstract mit, um die Erstellung eigener benutzerdefinierter Testumgebungen auf jsdom-Basis zu vereinfachen. Wenn Sie nur einen Patch für jsdom suchen, können Sie diesen jsdom-Patch in Ihrem Projekt anwenden. In Zukunft könnten wir Alternativen zu jsdom erwägen, die besser für Tests geeignet sind.

Was kommt als Nächstes?

Jest ist seit einem Jahrzehnt das beliebteste JavaScript-Testframework. Es wird von Millionen Entwicklern genutzt und unterstützt Projekte von kleinen Bibliotheken bis zu den größten Codebasen der Welt. Jest wurde kontinuierlich verbessert, aber wie bei allen langlebigen Softwareprojekten im realen Einsatz haben wir technische Schulden angehäuft. Wir unterstützen Funktionen, die nur wenige Personen oder Unternehmen nutzen, und haben Breaking Changes minimiert, um Nutzer nicht zu stören. Einige Features sollten durch Jest ermöglicht werden, aber nicht als Teil des Kernframeworks. Andere fördern falsche Testansätze und gehören vielleicht gar nicht zu Jest. Zudem haben einige Teammitglieder gewechselt, was zu langsamerem Fortschritt und weniger Releases führte. So gehen wir diese Probleme zukünftig an:

  • Performance/Technische Schulden: Schlankeres Jest-Kernframework mit Fokus auf Leistung. Entfernung weniger genutzter Funktionen und Konzentration auf die Kernstärken.

  • Konsistente Release-Zyklen: Wir streben konsistentere Release-Zyklen und klare Deprecation-Richtlinien an.

  • Transparenz: Entwicklung vollständig im Open Source, transparente Planung. Mehr Mitwirkungsmöglichkeiten und Wachstum der Contributor-Community.

  • Seien wir mutig: Als Jest-Team sollten wir mutiger sein. Es gibt einige Faktoren, die Jest davon abhalten, sein volles Potenzial zu erreichen. Es ist Zeit zu handeln.

Die gute Nachricht ist, dass Jest bereits seit seiner Konzeption als modulares System mit klarer Aufgabentrennung ideal aufgestellt war, um diese Prinzipien umzusetzen. Jetzt geht es an die Umsetzung. Mehr dazu in Kürze!

Danksagung

Diese Veröffentlichung wäre ohne die harte Arbeit unserer Community nicht möglich gewesen. Vielen Dank.

@SimenB, @mrazauskas, @Connormiha, @liuxingbaoyu, @k-rajat19, @G-Rath, @charpeni, @dubzzz, @stekycz, @yinm, @lencioni, @phawxby, @lukeapage, @robhogan, @fisker, @k-rajat19, @connectdotz, @alesmenzel, @rickhanlonii, @mbelsky, @brunocabral88, @brandon-leapyear, @nicolo-ribaudo, @dj-stormtrooper, @eryue0220

Besonderen Dank an alle, die in dieser Version ihren ersten Beitrag zu Jest geleistet haben. Vielen Dank, dass ihr Jest für alle besser macht!

@eyalroth, @KhaledElmorsy, @mohammednumaan, @bensternthal, @BondarenkoAlex, @phryneas, @jayvdb, @brandonchinn178, @latin-1, @rmartine-ias, @fa93hws, @Dunqing, @gustav0d, @noritaka1166, @andreibereczki, @Dreamsorcerer, @satanTime, @icholy, @ecraig12345, @cgm-16, @sebastiancarlos, @dancer1325, @loganrosen, @zakingslayerv22, @dev-intj, @tez3998, @anbnyc, @pengqiseven, @thypon, @co63oc, @danielrentz, @jonasongg, @andrew-the-drawer, @phryneas, @hyperupcall, @tonyd33, @madcapnmckay, @dongwa, @gagan-bhullar-tech, @ikonst, @ZuBB, @jzaefferer, @brandonnorsworthy, @henny1105, @DmitryMakhnev, @askoufis, @RahulARanger, @Jon-Biz, @fynsta, @KonnorRogers, @BondarenkoAlex, @mouadhbb, @kemuridama, @Avi-E-Koenig, @davidroeca, @akwodkiewicz, @mukul-turing, @dnicolson, @colinacassidy, @ofekm97, @haze, @Vadimchesh, @peterdenham, @ShuZhong, @manoraj, @nicolo-ribaudo, @georgekaran, @MathieuFedrigo, @hkdobrev, @Germandrummer92, @CheadleCheadle, @notaphplover, @danbeam, @arescrimson, @yepitschunked, @JimminiKin, @DerTimonius, @vkml, @ginabethrussell, @jeremiah-snee-openx, @WillianAgostini, @casey-lentz, @faizanu94, @someone635, @rafaelrabelos, @RayBrokeSomething, @DaniAcu, @mattkubej, @tr1ckydev, @shresthasurav, @the-ress, @Mutesa-Cedric, @nolddor, @alexreardon, @Peeja, @verycosy, @mknight-atl, @maro1993, @Eric-Tyrrell22

Jest tritt der OpenJS Foundation bei

· Eine Minute Lesezeit
Ricky Hanlon
Ricky Hanlon
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Bannerbild für Meta Open Source und OpenJS Foundation

Heute freuen wir uns, bekannt zu geben, dass Jest der OpenJS Foundation beitritt!

Diese Änderung überträgt die Projektverantwortung von Meta an das Jest Core-Team über die OpenJS Foundation als Impact Project. Wir sind Meta dankbar für die Erstellung von Jest und die jahrelange Unterstützung und freuen uns auf die Zukunft von Jest als Community-eigenes Projekt!

Weitere Informationen findet ihr im Meta Engineering Blog und im OpenJS Foundation Blog.

Jest 28: Schlanker und mit besserer Kompatibilität 🫶

· 8 Minuten Lesezeit
Simen Bekkhus
Simen Bekkhus
Inoffizielle Beta-Übersetzung

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.

Jest 27: Neue Standardeinstellungen für Jest, 2021 Edition ⏩

· 7 Minuten Lesezeit
Tim Seckinger
Tim Seckinger
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Im Jest-26-Blogbeitrag vor etwa einem Jahr kündigten wir an, dass Jest 27 nach zwei Hauptversionen mit wenigen Breaking Changes einige Schalter umlegen wird, um bessere Standardeinstellungen für neue oder migrationsfähige Projekte zu setzen. Dies gibt uns die Möglichkeit, einige Pakete aus der Standardverteilung von Jest 28 zu entfernen und sie stattdessen als separat installierbare und anpassbare Module zu veröffentlichen. Alle, die die neuen Standards nutzen, profitieren von einer kleineren Installationsgröße, während Benutzer, die diese Pakete benötigen, sie weiterhin separat installieren können.

Mit der ersten großen Änderung der Standardeinstellungen seit den New Defaults for Jest der bahnbrechenden Version 15 ist Jest 27 nun da, um Jest auch in Zukunft schnell, schlank und relevant zu halten. Wir erklären diese Änderungen der Standardeinstellungen und andere bemerkenswerte Breaking Changes in diesem Beitrag. Aber zuerst schauen wir uns einige spannende neue Funktionen an!

Upgrade der Jest-Website

· 2 Minuten Lesezeit
Sébastien Lorber
Docusaurus maintainer
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Wir freuen uns, die neue Jest-Website vorstellen zu können!

Die Jest-Site wurde von Docusaurus 1 auf Docusaurus 2 aktualisiert und gehört zu den ersten Projekten, die die neu veröffentlichte i18n-Unterstützung von Docusaurus 2 nutzen.

Was genau ist neu?

Jest 26: Tick Tock

· 7 Minuten Lesezeit
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Als wir vor fünf Jahren mit dem Neuaufbau von Jest begannen, war unser Ziel ein Testrunner mit integrierten Batterien und Null-Konfiguration, der für Einsteiger zugänglich, für fast alle Testanwendungsfälle erweiterbar und für große Projekte skalierbar ist. Eine entscheidende Veröffentlichung war Jest 15, das alles vereinte und gute Standardeinstellungen bot, die es ermöglichten, Jest oft ohne jegliche Einrichtung auszuführen. Dieser Ansatz hat jedoch einen großen Nachteil: Jest installiert viele Abhängigkeiten in Ihren Projekten, die Sie möglicherweise nicht benötigen.

Wir beginnen nun, diese Schwäche zu beheben und arbeiten daran, die Installationsgröße von Jest zu reduzieren, während es zugänglich und erweiterbar bleibt. In Jest 26 haben wir folgende Breaking Changes umgesetzt:

Jest 25: 🚀 Grundlagen für die Zukunft legen

· 7 Minuten Lesezeit
Simen Bekkhus
Simen Bekkhus
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Jest 25 legt den Grundstein für viele bedeutende zukünftige Änderungen. Daher haben wir Breaking Changes auf ein Minimum beschränkt, doch interne Architekturänderungen könnten beim Upgrade Aufmerksamkeit erfordern. Die Hauptänderungen sind ein Upgrade von JSDOM von v11 auf v15, 10-15% schnellere Testläufe, eine neue Diff-Ansicht für veraltete Snapshots und der Wegfall der Node-6-Unterstützung.

Seit Jest 24.9 gab es über 200 Commits von mehr als 80 verschiedenen Mitwirkenden. Werfen Sie wie immer einen Blick in das Changelog für die vollständige Änderungsliste.

Jest 24: 💅 Erfrischend, poliert, TypeScript-freundlich

· 10 Minuten Lesezeit
Simen Bekkhus
Simen Bekkhus
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Heute freuen wir uns, die nächste Hauptversion von Jest bekannt zu geben – Version 24! Es sind 4 Monate seit der letzten Nebenversion und 8 Monate seit Jest 23 vergangen, daher ist dieses Upgrade ein großes, mit etwas für jeden! Zu den Highlights gehören integrierte TypeScript-Unterstützung durch die Aktualisierung der Jest-Interna auf Babel 7, die Behebung langjähriger Probleme mit fehlender Konsolenausgabe und Performance-Problemen bei großen Diffs sowie eine brandneue, funkelnde Website. ✨

Eine vollständige Liste aller Änderungen finden Sie im Changelog.

Unterstützung für Jest Open Source

· 3 Minuten Lesezeit
Ricky Hanlon
Ricky Hanlon
Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Jest wird von einer Gemeinschaft aus Open-Source-Mitwirkenden und Facebook-Mitarbeitern gepflegt.

Unsere Open-Source-Mitwirkenden arbeiten für die Gemeinschaft: Sie entwickeln neue Funktionen, beheben Fehler und pflegen das Issue-Backlog. Facebook-Mitarbeiter arbeiten ähnlich, konzentrieren sich aber auf Probleme im Facebook-Maßstab und testen alle vorgeschlagenen Releases im riesigen Facebook-Testsuite vor der Veröffentlichung.

Wir alle leisten unseren Beitrag, um Tests zu einer Freude zu machen.

Auf dem Jest Summit haben wir das Jest Open Collective vorgestellt. Damit wollen wir die Bemühungen der Open-Source-Jest-Community unterstützen. Um absolut klar zu sein: Facebook-Mitarbeiter können nicht vom Jest Open Collective profitieren. Der einzige Zweck des Collectives ist die Unterstützung der Open-Source-Seite der Jest-Community.

In diesem Beitrag skizzieren wir, was das Jest Open Collective ist, seine Struktur und unsere Ziele.