Test-Datenbank und Fixtures für Tests
Test-Datenbank und Fixtures für Tests
~15 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Der Test aus Kapitel 43 (findOneBy(['email' => 'anna@example.com'])) setzt voraus, dass DIESER Nutzer existiert – zum Abschluss von Block 7 richten wir eine SAUBERE, ISOLIERTE Test-Datenbank mit reproduzierbaren Testdaten ein.
Warum eine EIGENE Datenbank nur für Tests?
Achtung: Tests, die gegen Ihre EIGENTLICHE Entwicklungsdatenbank laufen, sind GEFÄHRLICH: Sie verändern/löschen echte Daten, UND Testergebnisse hängen vom ZUFÄLLIGEN aktuellen Zustand dieser Datenbank ab, statt REPRODUZIERBAR zu sein. Eine SEPARATE Test-Datenbank, die vor JEDEM Testlauf in einen BEKANNTEN Zustand zurückgesetzt wird, ist unverzichtbar.
Die Test-Umgebung konfigurieren
DATABASE_URL="postgresql://symfony:symfony@127.0.0.1:5432/aufgaben_manager_test?serverVersion=16&charset=utf8"GENAU das Muster aus Kapitel 4: .env.test überschreibt DATABASE_URL NUR für die test-Umgebung – WebTestCase aus Kapitel 43 bootet die Anwendung automatisch mit APP_ENV=test, verwendet also AUTOMATISCH diese separate Datenbank.
Die Test-Datenbank anlegen und migrieren
php bin/console doctrine:database:create --env=test
php bin/console doctrine:migrations:migrate --env=test --no-interaction--env=test überschreibt die Standard-Umgebung EXPLIZIT – GENAU dieselben Migrationen aus Kapitel 20, angewendet auf die SEPARATE Test-Datenbank.
Die Fixtures aus Kapitel 25 für Tests wiederverwenden
php bin/console doctrine:fixtures:load --env=test --no-interactionGENAU dieselben Fixture-Klassen aus Block 4 – KEINE separaten Test-Fixtures nötig, solange die Kern-Fixtures (wie der Nutzer "Anna Schmidt" mit fester anna@example.com-Adresse aus Kapitel 25) für Tests referenzierbar bleiben.
Die Datenbank vor JEDEM Testlauf zurücksetzen
Damit Tests UNABHÄNGIG voneinander und REPRODUZIERBAR bleiben, sollte die Test-Datenbank vor JEDEM vollständigen Testlauf neu aufgesetzt werden – ein einfaches Skript dafür:
#!/bin/bash
set -e
php bin/console doctrine:database:drop --env=test --force --if-exists
php bin/console doctrine:database:create --env=test
php bin/console doctrine:migrations:migrate --env=test --no-interaction
php bin/console doctrine:fixtures:load --env=test --no-interactionchmod +x bin/reset-test-db.sh
./bin/reset-test-db.sh && php bin/phpunitEine schnellere Alternative: Transaktions-Rollback pro Test
Das komplette Neu-Aufsetzen der Datenbank ist bei GROSSEN Testsuiten langsam – ein fortgeschrittenerer Ansatz (z. B. mit dem Paket dama/doctrine-test-bundle) startet vor JEDEM einzelnen Test eine Datenbank-TRANSAKTION und macht sie am Testende per ROLLBACK rückgängig – DEUTLICH schneller als jedes Mal die komplette Datenbank neu aufzubauen, aber ein eigenes, fortgeschritteneres Setup, das über den Rahmen dieser Einführung hinausgeht.
Anna verlässlich in Tests referenzieren
// In Tests, statt der E-Mail-Adresse als 'magic string':
use App\DataFixtures\UserFixtures;
// Besser: Konstanten aus den Fixture-Klassen (Kapitel 25) direkt referenzieren,
// statt die E-Mail-Adresse an mehreren Stellen zu wiederholen.
// (Erfordert eine leichte Erweiterung von UserFixtures um eine öffentliche E-Mail-Konstante.)Tipp: Damit ist Block 7 (Console Commands & Testing) VOLLSTÄNDIG abgeschlossen – von eigenen Commands (Kapitel 39-41) über Unit-Tests (Kapitel 42) bis zu funktionalen Tests mit sauberer Test-Datenbank (Kapitel 43-44). Block 8, der ABSCHLIESSENDE Block dieser Schulung, widmet sich Caching, Performance und Deployment – die letzten Schritte, um aufgaben-manager produktionsreif zu machen.