Zum Hauptinhalt springen

Jest 22: Verbesserungen & Benutzerdefinierte Runner

· 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 →

Heute stellen wir eine neue Hauptversion von Jest vor, die fast alle Teile des Frameworks verfeinert, um eine solideres Testfundament zu bieten. Gemeinsam mit der Jest-Community haben wir zahlreiche Verbesserungen vorgenommen, die Ihnen noch mehr Möglichkeiten mit Jest eröffnen. Außerdem stufen wir die Funktion für benutzerdefinierte Runner aus dem Experimentalstatus hoch und fügen ein neues Paket jest-worker für die Parallelisierung von Aufgaben über mehrere Prozesse hinzu. Wir haben eine Liste der Highlights zusammengestellt, aber werfen Sie auch unbedingt einen Blick in den (wie immer) umfangreichen Changelog.

Abschied von Node 4 & Willkommen JSDOM 11

Mit diesem Release beenden wir die Unterstützung für Node 4, vor allem weil eine unserer Hauptabhängigkeiten, JSDOM, deren Unterstützung eingestellt hat. Jest liefert jetzt standardmäßig JSDOM 11 aus, das unter anderem bessere SVG-Unterstützung, integrierte requestAnimationFrame, URL und URLSearchParams bietet, und vieles mehr.

Benutzerdefinierte Runner + Einfache Parallelisierung mit jest-worker

In Jest 21 haben wir das Konzept benutzerdefinierter Jest-Runner eingeführt. Seitdem hat Rogelio, einer der Jest-Core-Mitwirkenden, mehrere nützliche Runner entwickelt: Wenn Sie viele bestehende Tests haben, die mit einem anderen Framework geschrieben wurden, aber sofort von Jest-Funktionen profitieren möchten, sehen Sie sich jest-runner-mocha an. Wenn Sie eine große Codebase haben, die Linting benötigt, können Sie eine erhebliche Beschleunigung erzielen, indem Sie eslint innerhalb von Jest mit jest-runner-eslint ausführen.

Für eine feinkörnigere Kontrolle über die Parallelisierung aufwändiger Aufgaben (z.B. Dateitransformation oder Dateisystem-Crawling) haben wir eine neue, perfekt geeignete Bibliothek entwickelt. Wir erstellten ein modernes, Promise-basiertes Modul mit einer zugänglichen API namens jest-worker, das es Ihnen ermöglicht, rechenintensive Funktionen an Kindprozesse zu delegieren. Da jest-worker wie jedes andere Jest-Paket Teil der Jest-Plattform ist, können Sie es beliebig verwenden, selbst ohne Jest selbst zu nutzen. Weitere Informationen finden Sie in der Dokumentation.

Um benutzerdefinierte Runner und Jest als Plattform besser zu verstehen, sehen Sie sich unbedingt Rogelios Vortrag von der Reactive Conf 2017 an: Jest as a Platform.

Codeframe bei Testfehlern

Um leichter identifizieren zu können, welche Assertion Ihren Test scheitern lässt, haben wir einen Codeframe hinzugefügt, der den Kontext der Assertion zeigt, damit Sie sich auf Ihren eigenen Code konzentrieren können. Betrachten Sie dieses Testbeispiel:

test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}

return 'success!';
}

expect(someFunctionWhichShouldThrow).toThrow();
});

In Jest 21 würde folgender Fehler angezeigt:

Fehler in Jest 21

In Jest 22 haben wir einen Codeframe hinzugefügt, der mehr Kontext für fehlgeschlagene Assertions bietet. Zusätzlich haben wir die Stack-Trace-Ausgabe weiter bereinigt, um noch mehr Störfaktoren zu entfernen.

Fehler in Jest 22

Einfacheres Testen von Fehlern in asynchronem Code

Sie können nun toThrow und toThrowErrorMatchingSnapshot bei Promise-Rejections genauso verwenden wie bei synchronen Fehlern.

async function throwingFunction() {
throw new Error('This failed');
}

test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});

Asynchrone Testumgebungen

Als das Google Chrome-Team im August Puppeteer vorstellte – eine Möglichkeit, programmatisch mit einem echten Chromium-Browser zu interagieren – wollten viele Jest verwenden, um Tests direkt in Chrome auszuführen. Die Community hat uns dabei geholfen, dies durch asynchrone Testumgebungen möglich zu machen. Wir arbeiten weiter daran, diese Erfahrung zu optimieren, aber eine Anleitung zur Verwendung von Puppeteer mit Jest finden Sie hier, ab sofort.

Experimentelle Speicherleck-Erkennung

Wir haben eine experimentelle Einstellung --detectLeaks zu Jest hinzugefügt, die Sie warnt, wenn Ihre interne Umgebungsinstanz nach der Testausführung noch im Speicher verbleibt. Sie warnt auch, wenn Ihr Testsuite versucht, eine Datei nach Testende zu laden, was bedeutet, dass Sie nicht auf alle asynchronen Operationen gewartet oder etwas nicht ordnungsgemäß bereinigt haben. Dies erkennt jedoch keine Leaks in Benutzercode, sondern nur in Testcode; die zugrundeliegende Technologie (siehe jest-leak-detector) kann Ihnen jedoch auch hier helfen. Wenn Sie einen Fehler über Jests Speichernutzung melden, stellen Sie bitte ein Reproduktionsbeispiel bereit, bei dem --detectLeaks die Testsuite scheitern lässt. Wir haben mit dem Aufbau eines besseren Sandboxing-Mechanismus für Jest begonnen, der jedoch noch nicht standardmäßig aktiviert ist. Wenn Sie helfen möchten, kontaktieren Sie uns bitte auf Discord!

Verfeinerungen am Watch-Modus

Im Watch-Modus gibt es nun eine Möglichkeit, sich nur auf zuvor fehlgeschlagene Tests zu konzentrieren. In diesem Modus führt Jest zuvor bestandene Tests nicht erneut aus, was Ihnen helfen soll, verbleibende Testfehler zu beheben. Zusätzlich haben wir ein Plugin-System für den Watch-Modus hinzugefügt. Durch das Hinzufügen von Modulen zu watchPlugins in Ihrer Konfiguration können Sie die Funktionen des Watch-Modus erweitern.

Babel 7-Unterstützung

Jest nutzt intern Babel für Code Coverage und erweiterte Mocking-Funktionen. Mit Jest 22 unterstützt es auch das kommende Babel 7. Weitere Informationen finden Sie in der Dokumentation.

Verbesserungen an Mock-Funktionen

Es gab einige Änderungen an Mock-Funktionen in Jest 22, die ihre Verwendung noch einfacher machen. Erstens haben wir eine mockName-Eigenschaft hinzugefügt, mit der Sie Ihre Mocks benennen können – besonders nützlich bei fehlgeschlagenen Assertions. Wir haben auch die Jest-Mock-Funktion in pretty-format serialisierbar gemacht, was bedeutet, dass Sie Mocks per Snapshot testen können. In Jest 21 würde expect(jest.fn()).toMatchSnapshot() zu [Function] serialisiert werden, in Jest 22 erhalten Sie stattdessen etwa:

test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');

mock('hello', {foo: 'bar'});

expect(mock).toMatchSnapshot();
});

// Serializes to:

exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;

Highlights aus Jest 21

Jest 21 wurde bereits im September veröffentlicht, und leider haben wir nie einen Blog-Post dazu geschrieben. Hier ist eine kurze Zusammenfassung der wichtigsten Änderungen in Version 21:

  1. Verwendung von expect und jest-mock im Browser: Michael Jackson hat sein hervorragendes expect-Paket an das Jest-Projekt gespendet. Im Zuge dieses Übergangs ermöglichte das Jest-Core-Team mit wesentlicher Hilfe von Kenneth Skovhus, dass sowohl jest-matchers (umbenannt in expect) als auch jest-mock im Browser funktionieren. Das bedeutet: Während Sie Jest selbst noch nicht im Browser verwenden können (noch nicht), können Sie seine hervorragenden Assertions und Mocks beispielsweise als Ersatz für Chai und Sinon in Mocha-Tests nutzen. Wenn Sie von einer früheren expect-Version zur neuen Jest-basierten expect migrieren, können Sie jest-codemods zur Automatisierung verwenden.

  2. MIT-Lizenz: Wir haben die Lizenz von Jest auf MIT geändert. Juhu!

  3. Fehlschlagen von Test-Suiten bei asynchronen Fehlern: Jest hatte früher einen Fehler, der zum Absturz führte, wenn Fehler in bestimmten Teilen asynchronen Codes auftraten. Dies wurde von Community-Mitwirkenden behoben.

  4. Schnellerer Start: Mit Jest 21 haben wir den Startvorgang optimiert, sodass er nun mehr als 50 % schneller ist. Die hohe Grundlast von Jest bei kleinen, schnellen Tests war für uns stets ein Problem – nun sollte dies kein Grund mehr sein, von der Verwendung von Jest abzusehen.

Jest-Community

Die Community rund um Jest arbeitet intensiv daran, das Test-Erlebnis noch besser zu machen. Diese Projekte sind unabhängig vom Haupt-Jest-Projekt, aber wir möchten hier einige unserer persönlichen Favoriten hervorheben.

  • jest-image-snapshot – benutzerdefinierter Matcher zum Bildvergleich mit Snapshots, entwickelt von American Express

  • ts-jest – alles, was Sie für den erfolgreichen Einsatz von Jest in TypeScript-Projekten benötigen, von @kulshekhar

  • jest-codemods – migrieren Sie mühelos Tests von anderen Frameworks zu Jest

  • jest-plugins – ein neues Community-Projekt zur Vereinfachung der Testumgebung für spezifische Tools (wie React) und Bereitstellung nützlicher Hilfsmittel

Wir möchten außerdem bekannt geben, dass wir kürzlich eine neue Plattform für hochwertige Jest-Erweiterungen gestartet haben: jest-community. Diese neue GitHub-Organisation vereint bereits unsere Lieblingsprojekte wie vscode-jest und jest-extended, kuratiert von Jest-Maintainern und Mitwirkenden. Wir haben sogar unser eslint-plugin-jest dorthin migriert und verzeichnen bereits großartige Beiträge, die eigenständig und schneller veröffentlicht werden.

Jest-Community

Gemeinschaftsprojekte unter einem Dach ermöglichen uns auch, neue Ansätze wie automatisierte Releases zu erproben, die wir gern für Jest übernehmen möchten. Außerdem erleichtert es die gemeinsame Nutzung von Elementen wie README-Strukturen (inspiriert von der Webpack-Community), was das Lernen und Anwenden für uns alle vereinfacht.

Wenn Sie etwas Beeindruckendes beizutragen haben, kontaktieren Sie uns gern! Wir freuen uns darauf, Ihr Projekt hier vorzustellen.