Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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

.env.test
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-interaction

GENAU 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/reset-test-db.sh
#!/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-interaction
chmod +x bin/reset-test-db.sh
./bin/reset-test-db.sh && php bin/phpunit

Eine 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.