Zum Hauptinhalt springen

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:

  • [expect, jest-mock, pretty-format] Entfernung von ES5-Build-Dateien mit neuer Mindestunterstützung für ES2015 (Node 8), die nur für Browser-Builds verwendet wurden (#9945)

    Migration: Mit dieser Änderung übertragen wir die Verantwortung für das Bündeln der betroffenen Pakete an die Benutzer, anstatt dass Jest sie out-of-the-box bereitstellt, da diese ihre Zielumgebungen am besten kennen. Falls Sie dies zurückhaben möchten, sind wir offen dafür, diese als separate Pakete zu veröffentlichen. PRs willkommen!

  • [jest-config, jest-resolve] Entfernung der Unterstützung für das browser-Feld (#9943)

    Migration: Installieren Sie das Modul browser-resolve und verwenden Sie folgende Konfiguration:

    {
    "jest": {
    "resolver": "<rootDir>/resolver.js"
    }
    }
    // resolver.js
    const browserResolve = require('browser-resolve');

    module.exports = browserResolve.sync;
  • TypeScript-Definitionen erfordern mindestens TypeScript v3.8 (#9823)

Durch diese Änderungen ist Jest 26 jetzt 4 MiB kleiner als Jest 25.5.4 (53 → 49 MiB). Bitte beachten Sie, dass viele Abhängigkeiten wie Babel wahrscheinlich bereits Teil Ihres Projekts sind. Die eigene Größe von Jest wurde um 1,2 MiB reduziert (4,3 → 3,1 MiB).

Obwohl dies ein guter Anfang ist, reicht es nicht aus, um Jest spürbar schlanker zu machen. Wir planen, die Größe von Jest und seiner Abhängigkeitsstruktur schrittweise um bis zu 70% zu reduzieren. Die meisten Änderungen zur Verkleinerung der Jest-Standardeinrichtung werden kleine Breaking Changes sein, und wir möchten die Community so weit wie möglich mitnehmen. Daher werden wir in Jest 27 und Jest 28 folgende Änderungen nach einem „Tick-Tock“-Release-Prozess umsetzen:

  • Jest 27 wird standardmäßig mit einem neuen Testrunner "jest-circus" und der Node.js-Umgebung ausgeliefert. jest-jasmine2 und jest-environment-jsdom bleiben gebündelt, sodass Benutzer sie weiterhin nutzen können, indem sie je eine Zeile in der Konfiguration ändern.

  • Jest 28 wird jest-jasmine2 und jest-environment-jsdom aus der Standardverteilung von Jest entfernen. Die Pakete werden weiterhin aktiv im Jest-Projekt gewartet und separat veröffentlicht. Benutzer müssen diese Pakete installieren, um sie nutzen zu können.

Beim Upgrade auf diese Major Releases wird Sie Jest durch die notwendigen Änderungen führen. Wenn Sie bereits jetzt vorausschauen und zu den neuen Standardeinstellungen migrieren möchten und Ihr Projekt keine DOM-Umgebung benötigt, können Sie auf Jest 26 upgraden und folgende Konfigurationsoptionen hinzufügen:

{
"jest": {
"testEnvironment": "node",
"testRunner": "jest-circus/runner"
}
}

Jest wird weiterhin standardmäßig mit aktiviertem babel-jest ausgeliefert. Es unterstützt derzeit einige Jest-Funktionen über das Kompilieren moderner JavaScript-Syntax für aktuelle Node.js-Versionen und Browser hinaus: Es ermöglicht auch Jest's Code Coverage und das Mocking von ES-Modulen. Jest bietet aktuell experimentelle Unterstützung für V8 Coverage und native Unterstützung für ES-Module (mehr dazu weiter unten!). Das Mocking statischer ES-Module ist gemäß Spezifikation ohne Code-Transformation nicht möglich, daher werden wir Muster fördern, die ohne die Transformation funktionieren, für die wir heute Babel verwenden. Sobald V8 Coverage und native ESM-Unterstützung in Jest stabil sind, können wir babel-jest ebenfalls als Standard entfernen, werden es aber weiterhin pflegen.

Neue gefälschte Timer

Mit Jest 26 liefern wir eine neue Implementierung gefälschter Timer basierend auf @sinonjs/fake-timers aus. Dies wollten wir seit Jahren umsetzen und freuen uns, dass es endlich so weit fortgeschritten ist, dass es alle bestehenden Jest-Anwendungsfälle für gefälschte Timer abdeckt.

Die neue Implementierung bietet zusätzliche Funktionen wie das Mocking von Date, queueMicrotask und mehr – siehe dieses README. Sie funktioniert transparent über die bestehenden Timer-APIs wie jest.runAllTimers() – Details finden Sie in der Dokumentation auf unserer Website.

Wir sind überzeugt, dass diese Implementierung produktionsreif ist, möchten aber niemanden zum Umschreiben seiner Tests zwingen, falls diese von subtilen Unterschieden zwischen alter und neuer Implementierung abhängen. In Jest 26 bleibt diese neue Implementierung opt-in und kann durch Aufruf von jest.useFakeTimers('modern') aktiviert werden oder durch Angabe von modern bei der timers-Option in Ihrer Konfiguration, falls Sie bereits alle Tests auf gefälschte Timer umgestellt haben.

In Jest 27 werden wir die neue "moderne" Implementierung zum Standard machen, unterstützen aber weiterhin die Legacy-Implementierung über jest.useFakeTimers('legacy'). Wenn Sie unsicher sind, ob Sie alle Tests bis zum Release von Jest 27 migrieren können, können Sie dies jetzt in Ihren Tests hinzufügen, um das alte Verhalten beizubehalten.

Besonderen Dank an Carl-Erik Kopseng, Benjamin Gruenbaum und die weiteren Maintainer von @sinonjs/fake-timers für ihre Hilfe und Geduld bei der gemeinsamen Umsetzung! Spannend.

Ein neuer Weg Jest zu nutzen - @jest/globals

Jest setzte bisher auf durch das Jasmine-Testing-Framework populär gewordene Globals wie describe, it, test und expect. Obwohl dieses Muster weit verbreitet ist, bevorzugen viele Nutzer den Import von Testfunktionen. Um diesen Anwendungsfall zu unterstützen, haben wir ein neues Paket @jest/globals hinzugefügt: import {expect, jest, test} from '@jest/globals';.

Einschränkungen:

  • Aktuell existieren die Globals weiterhin in der Umgebung, aber wir werden einen Modus einführen, um sie zukünftig zu deaktivieren. Ebenso funktioniert const jest = require('@jest/globals') derzeit nicht, da jest vorerst weiterhin ein Global ist.

  • Derzeit gibt es keine Möglichkeit, benutzerdefinierte Matcher zur TypeScript-Definition hinzuzufügen, wenn Globals auf diese Weise verwendet werden.

  • Während dies Tests ohne Globals ermöglicht, unterstützt es derzeit noch nicht das Ausführen von Tests ohne Jest's Test Runner.

Native ESM-Unterstützung

Wie im Jest-25-Blogbeitrag erwähnt, arbeiten wir an nativer Unterstützung für ECMAScript-Module. Diese ist noch nicht stabil, aber bereits testbereit. Wir freuen uns auf euer Feedback und eure Fehlermeldungen! Einen Überblick über den aktuellen Stand findet ihr in diesem Issue oder durch das Durchsuchen aller Issues mit dem Label ES Modules.

Weitere Breaking Changes in Jest 26

  • Unterstützung für Node 8 eingestellt (#9423)

  • [jest-environment-jsdom] Upgrade von jsdom auf v16 (#9606)

  • [jest-runtime] Entfernung der veralteten Methoden require.requireActual und require.requireMock (#9854)

  • [jest-haste-map] Entfernung von providesModuleNodeModules (#8535)

  • [jest-circus] Tests schlagen fehl, wenn ein Test eine done-Callback verwendet und Rückgabewerte hat (#9129)

  • [jest-circus] Wirft ordnungsgemäßen Fehler, wenn ein Test/Hook asynchron definiert wird (#8096)

Passt auf euch auf

Wir alle erleben derzeit eine beispiellose Zeit der Unsicherheit. Falls ihr finanzielle Schwierigkeiten habt, möchten wir den Open-Collective-Fonds von Jest nutzen, um neue und bestehende Mitwirkende zu unterstützen. Wir setzen Prämien auf ausgewählte Issues und sind offen dafür, für jedes unserer aktuellen offenen Issues eine Prämie anzubieten - ihr könnt dies im Issue erwähnen oder @cpojer per privater Nachricht auf Twitter kontaktieren.

Bitte bleibt gesund.