Faker: Realistische Testdaten für lokale Entwicklung mit KI
Faker erzeugt realistische Testdaten für lokale Entwicklung mit KI. Setup, Seeding, deutsche Locale, Cypress und FakerPHP im Praxisleitfaden 2026.
Mehr erfahren
Testdaten in Cypress sind alle Daten, die ein Test braucht, um einen definierten Zustand herzustellen: Nutzer, Produkte, API Antworten oder Datenbankeinträge. Cypress bietet dafür vier Wege, nämlich Fixtures mit cy.fixture, gestubbte Antworten mit cy.intercept, Node Code mit cy.task und API Aufrufe mit cy.request.
Gute Testdaten machen einen Test wiederholbar. Der Test findet bei jedem Lauf denselben Ausgangszustand vor, egal ob er allein läuft, in der Suite oder parallel auf mehreren CI Maschinen. Schlechte Testdaten sind die häufigste Ursache für flaky Tests.
Dazu kommt eine zweite Regel: Testdaten sind immer Fake Daten. Echte Kundendaten haben in Tests nichts zu suchen. Das gilt für deine CI, für Screenshots in der Cloud und für KI Agenten, die gegen deine lokale Umgebung Code schreiben.
Cypress mit Cypress Cloud nutzen wir täglich, zusammen mit Symfony, PHPUnit, MySQL, PostgreSQL und SQLite mit libSQL. Roland Golla ist offizieller Cypress Ambassador und arbeitet seit über zwanzig Jahren an Testing und Refactoring. Testdaten sind dabei das Thema, an dem die meisten Suiten scheitern. Wir wissen, wie Fixtures, Seeding und Datenbank Reset zusammenspielen, damit Tests stabil bleiben.
Passend dazu: Faker für realistische Testdaten in der lokalen Entwicklung, der Cypress Workshop mit Roland, die Cypress Remote Schulung für Teams, Schema based AI Coding für saubere Datenmodelle und das Vibe Coding Consulting für Teams mit KI Agenten.
Ein Tag inhouse mit Roland Golla, offizieller Cypress Ambassador und seit über 20 Jahren in Testing und Refactoring zu Hause. Auf unserem YouTube Kanal zeigt er in über 70 Live Coding Tutorials, wie Cypress in echten Projekten läuft. Dazu kommt unser Open Source Plugin NCA TESTIFY: Basistests für jede Website, mit einer Zeile im CI/CD Setup. Im Workshop lernt euer Team Setup, stabile Selektoren, Custom Commands und Tests in der Pipeline.
Fixtures sind Dateien mit festen Daten, meist JSON. Sie liegen standardmäßig in cypress/fixtures. Du lädst sie mit cy.fixture und nutzt sie für Formulare, Erwartungswerte oder gestubbte API Antworten.
// cypress/fixtures/products.json
[
{ "id": 1, "name": "Kaffeemühle", "price": 49.9 },
{ "id": 2, "name": "Wasserkocher", "price": 29.9 }
]
Richtig stark werden Fixtures mit cy.intercept. Du fängst einen API Aufruf ab und antwortest mit der Fixture. Das Frontend sieht immer dieselben Daten, unabhängig vom Backend.
describe('Produktliste', () => {
it('zeigt alle Produkte aus der API', () => {
cy.intercept('GET', '/api/products', { fixture: 'products.json' }).as('products')
cy.visit('/produkte')
cy.wait('@products')
cy.get('[data-cy=product]').should('have.length', 2)
cy.contains('Kaffeemühle').should('be.visible')
})
})
Wenn du einen Wert für einen Test ändern willst, lädst du die Fixture und passt das Objekt an, statt eine zweite Datei anzulegen. Cypress lädt eine Fixture laut Doku pro Test nur einmal und geht davon aus, dass sie sich nicht ändert. Für Dateien mit mehreren Megabyte ist cy.fixture nicht gedacht.
Grenze von Fixtures: Gestubbte Antworten testen dein Frontend, nicht die echte API. Für den kompletten Weg durch Backend und Datenbank brauchst du echte Daten in der Datenbank. Dafür sind die nächsten beiden Wege da.
Tests laufen im Browser. Deine Datenbank erreichst du von dort nicht. cy.task schlägt die Brücke: Du definierst in der Cypress Konfiguration Funktionen, die in Node laufen, und rufst sie aus dem Test auf. Dort kannst du Datenbanken leeren, Seeds einspielen oder Dateien lesen.
// cypress.config.ts
import { defineConfig } from 'cypress'
import { resetDatabase, seedUser } from './cypress/support/db'
export default defineConfig({
e2e: {
setupNodeEvents(on, config) {
on('task', {
async 'db:reset'() {
await resetDatabase()
return null
},
async 'db:seedUser'(user) {
return seedUser(user)
},
})
},
},
})
describe('Profil bearbeiten', () => {
beforeEach(() => {
cy.task('db:reset')
cy.task('db:seedUser', { email: 'anna@example.test', role: 'editor' })
.as('user')
})
it('speichert einen neuen Anzeigenamen', () => {
cy.visit('/profil')
cy.get('[data-cy=display-name]').clear().type('Anna Müller')
cy.get('[data-cy=save]').click()
cy.contains('Gespeichert').should('be.visible')
})
})
Drei Regeln aus der Cypress Doku zu cy.task, die oft übersehen werden:
Setz den Reset in beforeEach, nie in afterEach. Code in after Hooks läuft nicht garantiert, etwa wenn du den Test Runner mitten im Lauf neu lädst. In Symfony Projekten kannst du statt eines eigenen Tasks auch cy.exec mit php bin/console doctrine:fixtures:load --no-interaction aufrufen, wenn das DoctrineFixturesBundle installiert ist.
Der schnellste Weg zu Daten in der App führt über deine eigene API. Mit cy.request schickst du einen HTTP Aufruf direkt aus dem Test, ohne Browser Oberfläche. Ein Login, ein Warenkorb oder ein Artikel ist so mit einem Aufruf angelegt, statt über mehrere Formulare geklickt.
beforeEach(() => {
cy.request('POST', '/api/test/articles', {
title: `Testartikel ${Cypress.spec.name} ${Date.now()}`,
status: 'draft',
})
.its('body.id')
.as('articleId')
})
it('veröffentlicht einen Entwurf', function () {
cy.visit(`/admin/artikel/${this.articleId}`)
cy.get('[data-cy=publish]').click()
cy.contains('Veröffentlicht').should('be.visible')
})
Worauf du achten musst:
| Methode | Wann | Achtung |
|---|---|---|
| cy.fixture | Feste Eingaben und Erwartungswerte, kleine JSON Dateien | Wird pro Test einmal geladen, nicht für große Dateien gedacht |
| cy.intercept mit Fixture | Frontend Tests mit stabilen API Antworten, Fehlerfälle simulieren | Testet die echte API nicht mit, Fixture muss zum API Schema passen |
| cy.task | Datenbank Reset und Seeding in Node, vor jedem Test | Nie undefined zurückgeben, taskTimeout beachten, Reset nie parallel auf geteilter DB |
| cy.request | Schnelles Anlegen über die eigene API, Login ohne UI | Test Endpunkte in Production abschalten, eindeutige Werte pro Spec |
| Faker mit festem Seed | Realistische Fake Daten, reproduzierbar | Gleicher Seed auf allen Maschinen erzeugt gleiche Werte, eindeutige Felder ergänzen |
Feste Werte wie test@test.de finden kaum Fehler. Echte Namen mit Umlauten, lange Straßennamen oder ungewöhnliche Postleitzahlen schon. Dafür gibt es Faker. Wie du Faker installierst, die deutsche Locale nutzt und Seed Skripte baust, steht ausführlich in unserem Artikel Faker: Realistische Testdaten für lokale Entwicklung mit KI.
Für Cypress zählt vor allem ein Punkt: der feste Seed. Ohne Seed erzeugt Faker bei jedem Lauf andere Daten. Ein Test, der heute grün ist, kann morgen an einem Sonderzeichen scheitern, und du kannst den Fehler nicht nachstellen.
import { faker } from '@faker-js/faker'
beforeEach(() => {
faker.seed(42)
})
it('legt einen Kunden mit realistischen Daten an', () => {
const customer = {
name: faker.person.fullName(),
city: faker.location.city(),
email: `${Cypress.spec.name}-${Date.now()}@example.test`,
}
cy.request('POST', '/api/test/customers', customer)
})
Achte auf die Mail Adresse im Beispiel. Mit festem Seed erzeugt jede CI Maschine dieselben Werte. Felder, die eindeutig sein müssen, bekommen deshalb einen Anteil aus Spec Name und Zeitstempel. So bleibt der Rest reproduzierbar und Kollisionen bei paralleler Ausführung entfallen.
Sobald deine Suite auf mehreren CI Maschinen parallel läuft, teilen sich oft alle Maschinen eine Testdatenbank. Dann reicht ein globaler Reset nicht mehr. Spec A setzt die Datenbank zurück, während Spec B auf einer anderen Maschine gerade ihren User braucht. Das Ergebnis sind Fehler, die lokal nie auftreten.
Drei Strategien, je nach Setup:
Cypress hilft auf der Browser Seite: Mit aktiver testIsolation, dem Standard seit Cypress 12, werden Seite, Cookies, Local Storage und Session Storage vor jedem Test geleert. Die Datenbank fasst Cypress nicht an. Die ist deine Aufgabe. Wie du Specs auf mehrere Maschinen verteilst, zeigt die Cypress Doku zur Parallelisierung.
Ein Abzug der Produktionsdatenbank wirkt bequem. Die Daten sind realistisch und schon da. Trotzdem gehören echte Kundendaten nicht in Tests. Sie landen in CI Logs, in Screenshots, in Videos und mit --record auch in Cypress Cloud. Cypress Cloud ist ein US Anbieter. Damit wird jeder Testlauf zu einer Frage für deinen Datenschutz.
Mit KI Agenten in Cypress wird das Thema größer. Ein Coding Agent liest Datenbankinhalte, Logs und Testergebnisse, um Code zu schreiben oder Fehler zu finden. Bei NCA laufen Coding Modelle deshalb gegen lokale Entwicklungsumgebungen mit Fake Daten. Der Agent schreibt Tests, ein Mensch reviewt und gibt frei, und die Quality Gates in CI entscheiden. Mehr dazu in den Guardrails für Agentic AI Coding und bei den Risiken von Vibe Coding.
So setzt du das um:
The new command cy.task allows us to do anything.
Wenn eine Suite flaky ist, schauen wir zuerst auf die Testdaten und erst danach auf Selektoren und Wartezeiten. Fast immer findet sich ein Test, der Daten eines anderen nutzt, oder ein Reset an der falschen Stelle. Wir räumen das in kleinen Schritten auf, damit die Suite währenddessen grün bleibt.
Welche Daten ein Test braucht, klären wir mit dem Team per Example Mapping. Die Beispiele landen direkt als Seeds und Fixtures im Repository und werden Teil der lebenden Spezifikation. Für Akzeptanztests, die ein KI Agent vorschlägt, gilt dasselbe Prinzip, wie wir bei den agentischen Akzeptanztests zeigen.
Saubere Testdaten sind auch eine Frage der Pipeline. Unsere Quality Gates für KI Code zeigen, wie statische Analyse, Unit Tests und Cypress E2E zusammenspielen. Wenn KI Agenten die Testergebnisse auswerten sollen, hilft der Cypress Cloud MCP.
Passend dazu im NCA Cypress Glossar: Cypress Custom Commands für wiederverwendbare Seed und Login Abläufe sowie KI Features testen mit Cypress, wo Fixtures LLM Antworten ersetzen.
Optimieren Sie Ihre Webseite mit Astro JS und nutzen Sie die Vorteile einer schnellen, sicheren und barrierefreien Webseite. Erfüllen Sie die gesetzlichen Anforderungen und verbessern Sie die Benutzererfahrung Ihrer Webseite. Mit Astro JS können Sie die Ladezeit reduzieren, die Sicherheit maximieren und die SEO-Optimierung verbessern. Kontaktieren Sie uns, um mehr zu erfahren und um Ihre Webseite auf ein neues Level zu heben.
Die wichtigsten Antworten zu Fixtures, cy.task, API Seeding und Fake Daten in Cypress Tests.
Kombiniere mehrere Wege. Fixtures nutzt du für feste Eingaben und gestubbte API Antworten. Mit cy.task setzt du die Datenbank vor jedem Test zurück und spielst Seeds ein. Mit cy.request legst du Daten schnell über deine eigene API an. Faker mit festem Seed liefert realistische Werte. Alle Daten sind Fake Daten und jede Spec erzeugt ihre eigenen.
cy.fixture lädt eine Datei mit festen Daten in deinen Test. cy.intercept fängt Netzwerkaufrufe ab und kann mit der Option fixture direkt eine Fixture als Antwort liefern. Zusammen testest du dein Frontend mit stabilen API Antworten, ohne dass das Backend bestimmte Daten haben muss. Die echte API testest du damit allerdings nicht mit.
Du definierst in setupNodeEvents einen Task, etwa db:reset, der in Node die Datenbank leert und Seeds einspielt. Im Test rufst du ihn mit cy.task in einem beforeEach Hook auf. Wichtig: Der Task gibt null zurück, nie undefined, und er muss innerhalb von taskTimeout fertig sein. Setz den Reset vor den Test, nie danach.
Per API, außer du testest genau diesen Weg durch die Oberfläche. Mit cy.request legst du Nutzer, Artikel oder Warenkörbe mit einem Aufruf an. Das spart Zeit und macht Tests unabhängig von Formularen, die gar nicht im Fokus stehen. Das Formular selbst testest du einmal gezielt. Endpunkte nur für Testdaten schaltest du in Production ab.
Setz vor jedem Test einen festen Seed mit faker.seed und einer Zahl. Dann erzeugt Faker bei jedem Lauf dieselben Werte und du kannst Fehler nachstellen. Bei paralleler Ausführung bekommen alle Maschinen dieselben Werte. Felder, die eindeutig sein müssen, wie Mail Adressen, ergänzt du deshalb um Spec Name und Zeitstempel.
Cypress erwartet von jedem Task einen Rückgabewert, der zeigt, dass der Task fertig ist. Gibt deine Funktion undefined zurück oder löst ein Promise mit undefined auf, schlägt der Befehl fehl. Die Lösung ist einfach: Gib am Ende null zurück, wenn es nichts zu melden gibt. Bei async Funktionen gilt das genauso für den Wert des Promise.
Am einfachsten bekommt jede CI Maschine ihre eigene Datenbank im Container. Dann darfst du vor jedem Test komplett zurücksetzen. Bei einer geteilten Datenbank legt jede Spec ihre eigenen Daten mit eindeutigen Werten an und liest nur diese. Ein globaler Reset ist dann tabu, denn er löscht Daten, die eine andere Maschine gerade braucht.
Nein. Mit aktiver testIsolation, dem Standard seit Cypress 12, leert Cypress vor jedem Test nur den Browser Zustand: Seite, Cookies, Local Storage und Session Storage. Deine Datenbank fasst Cypress nicht an. Den Reset baust du selbst, zum Beispiel mit cy.task oder cy.exec und einem Seed Befehl deines Frameworks in einem beforeEach Hook.
Davon raten wir klar ab. Echte Daten landen in CI Logs, Screenshots, Videos und mit --record auch in Cypress Cloud, einem US Anbieter. Das macht jeden Testlauf zu einem Datenschutz Thema. Fake Daten aus Seed Skripten und Faker sind genauso realistisch, liegen im Repository und lassen sich jederzeit neu erzeugen. Für KI Agenten gilt dieselbe Regel.
Coding Agenten lesen Datenbankinhalte, Logs und Testergebnisse, um Code zu schreiben oder Fehler einzugrenzen. Was sie sehen, geht an das Modell. Mit Fake Daten in der lokalen Umgebung kann dabei keine echte Kundenangabe abfließen. Gleichzeitig bekommt der Agent realistische Daten, an denen er Sonderfälle wie Umlaute oder lange Namen erkennt.
Standardmäßig im Ordner cypress/fixtures. Du kannst Unterordner anlegen und sie mit dem Pfad laden, etwa users/admin.json. Lässt du die Dateiendung weg, sucht Cypress in einer festen Reihenfolge nach passenden Dateien, zuerst nach JSON. Große Dateien mit mehreren Megabyte gehören nicht in Fixtures. Dafür nutzt du selectFile oder cy.task.
cy.exec führt einen Shell Befehl aus. Das passt, wenn dein Framework schon einen Befehl für Seeds mitbringt, etwa doctrine:fixtures:load in Symfony mit dem DoctrineFixturesBundle. cy.task nutzt du, wenn du die Logik in Node schreiben willst, Daten zurückbekommen möchtest oder direkt mit einem Datenbank Client arbeitest. Beide gehören in einen beforeEach Hook.