Was ist neu in Cypress 16
Erfahren Sie mehr über Cypress 16: natives HTTP/2, schnellere Tests, entfernte APIs und Migrationstipps. Darum sollten Sie auf Cypress 16.1.0 oder höher aktualisieren.
Cypress 16 betreibt Chrome, Chromium und Edge über den nativen Netzwerk-Stack des Browsers mit HTTP/2. Außerdem tippt es standardmäßig schneller, prüft die Sichtbarkeit schneller und entfernt Cypress.env() sowie cy.exec(). Aktualisieren Sie auf 16.1.0 oder neuer, nicht auf 16.0.0.
Major-Upgrades brechen in der Regel in der CI, nicht lokal. Eine entfernte API wirft eine Exception in einer Support-Datei, oder ein Lauf gibt keine Ausgabe mehr aus, bis der Job in einen Timeout läuft.
Dieser Artikel behandelt Cypress 16.0.0 (1. September 2026) und 16.1.0 (15. September 2026): was schneller wird, was sich beim Schreiben von Tests ändert, was bricht und wie Sie es beheben, und welche Version Sie pinnen sollten. Die Grundlagen finden Sie unter End-to-End-Tests mit Cypress.
Das Wichtigste in Kürze
- In Cypress 16 verwenden Chrome, Chromium und Edge HTTP/2 oder HTTP/3, sobald der Server dies unterstützt. Firefox, WebKit und Electron bleiben bei HTTP/1.1.
Cypress.env()wurde entfernt. Verwenden Siecy.env()für Secrets, die im Node-Prozess verbleiben, bis ein Test sie anfordert, undCypress.expose()für Werte, die im Browser unbedenklich sind.cy.intercept()hat dieselbe API, doch im nativen Netzwerk fehltreq.httpVersion, Komprimierungs-Header entfallen, und revalidierte Responses liefern 200 statt 304.- Cypress 16 erfordert Node.js 22.x, 24.x oder >=26.x. Node 20 und 25 werden nicht mehr unterstützt.
- Verwenden Sie 16.1.0 oder neuer. 16.1.0 behebt eine Regression aus 16.0.0, durch die Läufe in Chrome-basierten Browsern ohne Ausgabe hängen bleiben konnten, sowie eine weitere, bei der
blockHostsnicht durchgesetzt wurde.
HTTP/2 ist Standard in Chrome, Chromium und Edge
Chrome, Chromium und Edge fangen den Testtraffic von Cypress 16 jetzt im browsereigenen Netzwerk-Stack ab, statt ihn über den Cypress-Proxy zu leiten. Die zu testende Anwendung verbindet sich direkt mit Ihrem Server und nutzt das beste Protokoll, das beide Seiten unterstützen, einschließlich HTTP/2 und HTTP/3. Firefox, WebKit und Electron bleiben beim bisherigen HTTP/1.1-Pfad.
Der Wechsel zu nativem HTTP/2 ist relevant, weil HTTP/1.1 nur wenige parallele Verbindungen pro Origin zulässt, sodass eine Seite mit Hunderten von Assets diese in eine Warteschlange stellen muss. HTTP/2 multiplext all diese Requests als Streams über eine einzige Verbindung. In Cypress’ eigenem Benchmark sank die Ladezeit einer Seite mit 1.000 Bildern von 3.896 ms über HTTP/1.1 auf 1.362 ms über HTTP/2. Die Ankündigung beschreibt den Testaufbau nicht, verstehen Sie die Zahl also als Tendenz und nicht als Prognose für Ihre Suite.
Natives HTTP/2 macht in Cypress 16 außerdem Streaming-UIs testbar. Über HTTP/1.1 erlaubt ein Browser nur sechs Server-Sent-Events-Verbindungen pro Domain, wodurch Features wie Live-Benachrichtigungen außer Reichweite lagen. Über HTTP/2 handeln Server und Browser aus, wie viele Streams gleichzeitig laufen dürfen; Cypress beziffert den üblichen Standardwert auf 100.
Cypress 16 terminiert TLS für die zu testende Anwendung auch nicht mehr, sodass der Browser das echte Zertifikat Ihres Origins prüft. Für selbstsignierte Entwicklungszertifikate oder eine interne CA führt 16.1.0 trustedCertificates ein.
Geschwindigkeitsänderungen bei Tests in Cypress 16
Cypress 16 ändert drei Standardwerte, die sich auf die Geschwindigkeit auswirken. Für jeden gibt es einen Weg zurück.
- Die Tastendruckverzögerung beträgt 0 ms statt bisher 10 ms. Für Eingaben, die vom Tipptempo abhängen, etwa Suchfelder mit Debouncing, können Sie die alte Verzögerung wiederherstellen:
Cypress.Keyboard.defaults({ keystrokeDelay: 10 })
cy.get('[data-cy=search]').type('laptop', { delay: 10 })
Unter 16.0.0 ließ sich eine TypeScript-Konfigurationsdatei mit keystrokeDelay nicht kompilieren. 16.1.0 behebt das.
- Sichtbarkeitsprüfungen verwenden den modernen Algorithmus. Er basiert auf der nativen Browser-Methode
Element.checkVisibility(), undvisibilityStrategysteht standardmäßig auf'modern'. manageBrowserMemoryist standardmäßig aktiviert. Während der Testausführung prüft Cypress in Intervallen die Speichernutzung. Überschreitet ein Messwert einen festgelegten Grenzwert, führt es vor dem nächsten Test eine Garbage Collection durch. Diese Bereinigung kostet Zeit, sodass eine schlanke Suite mit deaktivierter Einstellung schneller sein kann. Messen Sie Ihre Suite in beiden Varianten, bevor Sie die Einstellung deaktivieren.
Was ändert sich beim Schreiben von Tests in Cypress 16?
In Cypress 16 werden Cookie- und Storage-Abfragen wie andere Queries wiederholt, und der Zugriff auf Umgebungsvariablen ist auf zwei separate APIs aufgeteilt.
cy.getCookie(), cy.getCookies(), cy.getAllCookies(), cy.getAllLocalStorage() und cy.getAllSessionStorage() sind jetzt wiederholende Query-Befehle, die über defaultCommandTimeout gesteuert werden. Sie verwenden nicht mehr responseTimeout, cy.setCookie() dagegen weiterhin. Hängen Sie ein .should() an, wird so lange wiederholt, bis die Prüfung erfolgreich ist. Platzieren Sie die Prüfung in .then(), läuft sie genau einmal, ohne Wiederholung.
cy.getCookie('auth_token').should('have.property', 'value')
Falls Ihre Suite einen dieser Befehle überschreibt, wechseln Sie zu Cypress.Commands.overwriteQuery(). Cypress.Commands.overwrite() funktioniert für sie nicht mehr.
Cypress.env() war seit 15.10.0 als veraltet markiert und ist nun entfernt. cy.env() ist asynchron: Es holt sensible Werte aus dem Node-Prozess und übergibt Ihrem Test nur die Schlüssel, die Sie angeben. Cypress.expose() ist die synchrone Option für Werte, die im Browser sichtbar sein dürfen.
// Before (Cypress 15)
const token = Cypress.env('STRIPE_KEY')
// After (Cypress 16)
cy.env(['STRIPE_KEY']).then(({ STRIPE_KEY }) => {
cy.request({ url: '/api/charge', headers: { Authorization: STRIPE_KEY } })
})
const apiBase = Cypress.expose('PUBLIC_API_URL')
cy.env() schreibt die Schlüsselnamen ins Command Log, niemals jedoch die Werte. Dieser Schutz endet, sobald Ihnen das Objekt übergeben wird: .its(), .invoke(), Assertions oder ein fehlschlagender Befehl können allesamt einen Wert ausgeben – halten Sie Secrets daher innerhalb von .then(). Overrides auf Test- und Suite-Ebene verwenden jetzt expose: {...} statt env: {...}, und allowCypressEnv wurde entfernt.
Breaking Changes in Cypress 16 und ihre Behebung
Die meisten Breaking Changes in Cypress 16 sind mechanische Entfernungen, und der Migrationsleitfaden nennt für jede einen direkten Ersatz. Gründliches Nachdenken erfordert nur cy.intercept().
Die API von cy.intercept() selbst ist unverändert. Im nativen Netzwerk wird jedoch req.httpVersion nicht gemeldet, Komprimierungs-Header wie content-encoding fehlen, weil der Body bereits dekodiert ankommt, revalidierte Responses liefern 200 statt 304, und res.statusMessage ist über HTTP/2 und HTTP/3 leer. Zudem begrenzt responseTimeout die Response-Handler nicht mehr. Trifft keine Response ein, bricht Cypress nach festen 30 Sekunden ab; wenn Sie einen anderen Grenzwert benötigen, setzen Sie ihn an cy.wait(). Formulieren Sie Assertions so um, dass sie das Verhalten prüfen, nicht Transportdetails. Die Muster aus Mocking und Stubbing in Cypress gelten weiterhin.
// Before: expect(req.httpVersion).to.eq('1.1')
cy.intercept('GET', '/api/cart').as('cart')
cy.visit('/checkout')
cy.wait('@cart', { timeout: 15000 }).its('response.statusCode').should('eq', 200)
Die vollständige Liste der Breaking Changes in 16.0.0, jeweils mit den Folgen, wenn Sie den betroffenen Code unverändert lassen:
| Änderung | Ohne Anpassung | Lösung |
|---|---|---|
cy.exec() / execTimeout entfernt | cy.exec() wirft einen Fehler; execTimeout erzeugt eine Warnung und wird ignoriert | Logik in einen cy.task() verlagern und taskTimeout verwenden |
cy.end() entfernt | Befehl schlägt fehl | Aufrufe löschen |
viewportWidth/viewportHeight/blockHosts über Cypress.config() | Zur Laufzeit nicht mehr erlaubt (bisher galt es für den nächsten Test) | In der describe/it-Konfiguration setzen oder cy.viewport() aufrufen |
experimentalMemoryManagement | Warnung, wird ignoriert | Löschen; zum Deaktivieren manageBrowserMemory: false verwenden |
experimentalFastVisibility | Ersetzt | Löschen; dies steuert jetzt visibilityStrategy |
experimentalSourceRewriting entfernt | Option ist wirkungslos | Löschen; bei SRI-Fehlern removeSRIAttributes verwenden |
| CoffeeScript | .coffee-Dateien werden nicht mehr aufgelöst | JS/TS oder @cypress/webpack-preprocessor verwenden |
| Node.js | Node 20 und 25 nicht unterstützt | Node 22.x, 24.x oder >=26.x |
| Component Testing | Ältere Toolchains nicht unterstützt | Angular 21.0.0+, Vite 8.0.0+, Next.js 15.0.4+ oder 16+ |
| Electron | Veraltet, läuft weiterhin | CI auf Chrome oder einen anderen installierten Browser umstellen |
Für den Viewport verschieben Sie die Einstellung in die Block-Konfiguration:
describe('mobile nav', { viewportWidth: 375, viewportHeight: 667 }, () => {
it('opens the menu', () => { /* ... */ })
})
Die Notausgänge in Cypress 16 sind nur vorübergehend
Cypress 16 bringt zwei Opt-outs mit, und der Changelog kennzeichnet beide als veraltet. forceHttp1: true leitet alle Browser zurück über den bisherigen Proxy-Pfad. Cypress hat diese Option bereits in dem Release als veraltet markiert, mit dem sie eingeführt wurde, und plant, sie zu entfernen, sobald der native Pfad sowohl in Chrome als auch in Firefox langfristig unterstützt wird. visibilityStrategy: 'legacy' stellt den alten Sichtbarkeitsalgorithmus wieder her. Die Option selbst ist veraltet, und laut Changelog sollte der Legacy-Wert nur als Übergangslösung während der Migration dienen.
Nutzen Sie forceHttp1 und visibilityStrategy: 'legacy' zur Fehlerdiagnose, nicht als Dauereinstellung. Verschwindet ein Fehler mit gesetztem Flag, gleichen Sie ihn mit den dokumentierten Unterschieden des nativen Netzwerks ab, schreiben Sie die Assertion um und entfernen Sie anschließend das Flag.
Fazit zur Version: Auf Cypress 16.1.0 oder neuer aktualisieren, nicht auf 16.0.0
Führen Sie das Upgrade durch und pinnen Sie 16.1.0 oder ein neueres 16.x-Release – niemals 16.0.0. 16.1.0 behebt eine Regression aus 16.0.0, bei der Läufe in Chrome, Chromium und Edge mittendrin verstummen und nie abschließen konnten. Außerdem behebt es, dass blockHosts in diesen Browsern nicht durchgesetzt wurde: Requests an einen blockierten Host gingen ins Netzwerk hinaus, obwohl sie mit einem 503 hätten fehlschlagen müssen. Eine Suite, die auf blockierte Hosts angewiesen ist, konnte unter 16.0.0 grün sein, ohne tatsächlich das zu testen, was sie vorgibt. 16.1.0 behebt zudem den TypeScript-Fehler bei keystrokeDelay und ein Speicherleck im Zusammenhang mit Service Workern.
Führen Sie Ihren ersten grünen Build auf 16 in Chrome aus, nicht nur in Electron. Electron bleibt auf dem Legacy-Pfad, sodass ein reiner Electron-Lauf das native Netzwerk nie berührt. Prüfen Sie Ihre Suite anschließend anhand der Best Practices für Cypress. Ihre Firefox- und WebKit-Läufe verwenden weiterhin HTTP/1.1, während echte Firefox- und Safari-Nutzer in Produktion HTTP/2 erhalten. Session Replay realer Nutzer ist daher ein nützliches Mittel, um die Flows und Browser aufzuspüren, die Ihre E2E-Suite nie abdeckt.
Fazit
Das meiste, was Cypress 16 beschleunigt, erfordert keinerlei Aufwand Ihrerseits. Das meiste, was es bricht, lässt sich per Suche in Ihrem Repository finden. Suchen Sie nach Cypress.env, cy.exec, cy.end, Cypress.config()-Aufrufen zur Laufzeit und den entfernten experimentellen Schlüsseln. Ersetzen Sie jeden Treffer anhand der obigen Tabelle, stellen Sie die CI auf Node 22 oder neuer mit Chrome um und installieren Sie direkt 16.1.0 oder neuer.
FAQs
Wie führe ich in Cypress 16 einen Shell-Befehl aus, nachdem cy.exec() entfernt wurde?
Registrieren Sie in setupNodeEvents einen Task, der das Node-Modul child_process aufruft, zum Beispiel execFileSync, und rufen Sie ihn im Test mit cy.task('resetDatabase') auf. Jeder Task muss einen Wert oder null zurückgeben. Standardmäßig bricht ein Task nach 60 Sekunden ab; taskTimeout ändert diesen Grenzwert. cy.task() kann keine Prozesse ausführen, die sich nie beenden, etwa das Starten eines Servers. cy.exec() wurde in Cypress 15.21.0 als veraltet markiert und in 16.0.0 entfernt.
Was ist der Unterschied zwischen trustedCertificates und clientCertificates in Cypress?
trustedCertificates, eingeführt in Cypress 16.1.0, sorgt dafür, dass der Browser einem Zertifikat vertraut, das Ihr Server präsentiert, etwa einem selbstsignierten Entwicklungszertifikat oder einem Zertifikat einer internen CA. clientCertificates dient dem Mutual TLS, bei dem Cypress dem Server ein Zertifikat präsentiert. Jeder trustedCertificates-Eintrag akzeptiert genau eine der Optionen filePath, pem oder spki und gilt für den nativen Netzwerkpfad in Chrome, Chromium und Edge. Deklarierte Origins können anschließend den HTTP-Cache des Browsers nutzen.
Kann ich Component Tests mit Angular 20 unter Cypress 16 ausführen?
Nicht mit dem integrierten Harness. Das Component Testing in Cypress 16 unterstützt Angular 18, 19 und 20 nicht mehr; die minimal unterstützte Version ist Angular 21.0.0. Als Übergangslösung können Sie das veraltete Paket @cypress/angular 4.x von npm installieren und mount daraus statt aus cypress/angular importieren. Cypress unterstützt dieses Harness jedoch nicht mehr, planen Sie also den Umstieg auf Angular 21. Dasselbe Release entfernt außerdem die integrierte CoffeeScript-Unterstützung, sodass .coffee-Specs, Support-Dateien und Fixtures nicht mehr aufgelöst werden.
Gain Debugging Superpowers
Unleash the power of session replay to reproduce bugs, track slowdowns and uncover frustrations in your app. Get complete visibility into your frontend with OpenReplay — the most advanced open-source session replay tool for developers.
Star on GitHub12k