Skip to content
NeuralSkills
Testen

Datenbank-Test-Stratege

Datenbankoperationen zuverlaessig testen — Migrationen, Transaktionen, Constraints und Datenintegritaet ueber Testlaeufe.

Fortgeschritten Kostenlos Veroeffentlicht: 15. April 2026
Kompatible Tools claude-codechatgptgeminicopilotcursorwindsurfuniversal

Das Problem

Datenbanktests sind am schwierigsten korrekt umzusetzen. Tests kontaminieren einander mit gemeinsamen Daten, Transaktionen lecken, Migrationen laufen in falscher Reihenfolge und Testdatenbanken driften vom Produktionsschema ab. Eine solide Strategie isoliert Tests, verifiziert Constraints und laeuft schnell genug fuer CI.

Der Prompt

Entwirf eine Datenbank-Teststrategie fuer meine Anwendung. Ich brauche Tests, die echtes Datenbankverhalten verifizieren, ohne langsam oder fragil zu sein.

DATENBANK: [PostgreSQL / MySQL / MongoDB / SQLite]
ORM/QUERY-LAYER: [Prisma / TypeORM / Drizzle / Knex / raw SQL]
SCHEMA: [Schema/Migrationen einfuegen]

Generieren:

1. **Testdatenbank-Setup** — Isolierte Testdatenbank, Transaktionsbasierte Isolation, Seed-Daten-Strategie
2. **Migrationstests** — Vorwaerts- und Rueckwaerts-Migrationen verifizieren
3. **Constraint-Tests** — Unique, Foreign Key, NOT NULL, Check Constraints testen
4. **Query-Tests** — Komplexe Abfragen, Joins, Filter, Paginierung testen
5. **Nebenlaeufigkeitstests** — Parallele Updates, Optimistic Locking, Deadlocks

Beispielausgabe

describe('Benutzer-Datenbankoperationen', () => {
  beforeEach(async () => { await db.query('BEGIN'); });
  afterEach(async () => { await db.query('ROLLBACK'); });

  it('soll Unique-E-Mail-Constraint durchsetzen', async () => {
    await createUser({ email: 'belegt@test.com' });
    await expect(createUser({ email: 'belegt@test.com' }))
      .rejects.toThrow(/unique constraint/i);
  });

  it('soll Bestellungen kaskadierend loeschen bei Benutzerloeschung', async () => {
    const user = await createUser({ email: 'loeschen@test.com' });
    await createOrder({ userId: user.id });
    await deleteUser(user.id);
    const orders = await db.query('SELECT * FROM orders WHERE user_id = $1', [user.id]);
    expect(orders.rows).toHaveLength(0);
  });
});

Wann verwenden

Wenn die Anwendung auf komplexen Datenbankabfragen basiert, Datenbank-Constraints verifiziert werden muessen oder ein neues Projekt mit Datenbankschicht eingerichtet wird.

Profi-Tipps

  • Transaktions-Rollback ist die schnellste Isolation — jeden Test in eine Transaktion packen und danach zurueckrollen.
  • Mit realistischen Datenmengen testen — eine Query die mit 10 Zeilen funktioniert kann bei 10.000 versagen.
  • Testcontainers fuer echte Datenbanken verwenden — SQLite ist nicht PostgreSQL. Gegen die gleiche Engine testen wie in Produktion.
  • Seed-Daten versionieren — Seed-Daten-Skripte neben Migrationen pflegen, damit sie sich gemeinsam entwickeln.