Die kurze Antwort lautet:Lesen Sie den Eintrag The Fine Manual zum Datenbanktest im PHPUnit-Handbuch .
Und jetzt die lange Antwort ...
Das erste, woran Sie beim Komponententest denken sollten, ist, dass er isoliert durchgeführt werden muss von allen anderen Komponenten. Häufig wird dieses Ziel durch IoC-Techniken (Inversion of Control) wie Abhängigkeitsinjektion vereinfacht . Wenn Ihre Klassen explizit nach ihren Abhängigkeiten in den Konstruktormethoden fragen, ist es eine einfache Operation zu spotten diese Abhängigkeiten, damit Sie den verbleibenden Code isoliert testen können.
Das Testen von Code, der mit Modellen interagiert, ist jedoch etwas anders. Normalerweise ist es nicht praktikabel oder ratsam, Ihre Modelle in die Klasse einzufügen, in der Sie darauf zugreifen müssen. Ihre Modelle sind im Allgemeinen "dumme" Datenstrukturen, die begrenzte oder keine Funktionen offenlegen. Daher ist es im Allgemeinen akzeptabel (in Bezug auf die Testbarkeit), Ihre Modelle spontan in Ihren ansonsten eingefügten Klassen zu instanziieren. Leider macht dies das Testen von Datenbankcode schwierig, weil, wie die PHPUnit-Dokumentation anmerkt:
Wie isolieren und testen Sie also Code, der mit der Datenbank interagiert, wenn die Modelle nicht direkt injiziert werden? Der einfachste Weg, dies zu tun, ist die Verwendung von Test Fixtures .
Denn Sie verwenden definitiv schon PDO
oder eine ORM-Bibliothek, die auf PDO
aufbaut (richtig?), das Einrichten der Fixtures ist so einfach wie das Seeding einer einfachen SQLite-Datenbank oder XML-Datei mit Daten für Ihre Testfälle und die Verwendung dieser speziellen Datenbankverbindung, wenn Sie den Code testen, der mit der Datenbank interagiert. Sie könnten diese Verbindung in Ihrer PHPUnit-Bootstrap-Datei angeben, aber es ist wahrscheinlich semantisch angemessener, eine PHPUnit-Datenbank-Testfall
.
Die allgemein akzeptierten Best-Practice-Schritte zum Testen von DB-Code (diese werden auch in der PHPUnit-Dokumentation zum DB-Testen wiedergegeben):
- Vorrichtung einrichten
- Zu testendes Übungssystem
- Ergebnis überprüfen
- Abreißen
Zusammenfassend müssen Sie also nur eine „Dummy“-Datenbankvorrichtung erstellen und Ihren Code mit diesen bekannten Daten interagieren lassen, anstatt mit einer tatsächlichen Datenbank, die Sie in der Produktion verwenden würden. Mit dieser Methode können Sie den zu testenden Code erfolgreich isolieren, da er mit bekannten Daten arbeitet, und das bedeutet, dass Sie spezifische/überprüfbare Aussagen über die Ergebnisse Ihrer Datenbankoperationen machen können.
AKTUALISIEREN
Nur weil es ein außerordentlich nützlicher Leitfaden für das ist, was nicht ist Was Sie in Ihrem Code tun können, wenn Sie die Testbarkeit fördern möchten, füge ich einen Link zu Misko Heverys Wie schreibt man 3v1L, nicht testbaren Code . Es hat nichts mit Datenbanktests zu tun, ist aber dennoch hilfreich. Viel Spaß beim Testen!
AKTUALISIERUNG 2
Ich wollte auf den Kommentar zum Verschieben von Modelltests antworten, da die vorhandene Codebasis PDO
nicht implementiert für Datenbankzugriff:
Ihre Modelle müssen PDO nicht verwenden, um die DbUnit-Erweiterung von PHPUnit zu implementieren.
Es wird Ihr Leben etwas einfacher machen, wenn Sie PDO verwenden, aber Sie müssen es nicht tun. Angenommen, Sie haben Ihre Anwendung mit dem in PHP integrierten pg_*
erstellt PostgreSQL-Funktionen. PHPUnit erlaubt Ihnen immer noch Fixtures zu spezifizieren und kann sie für jeden Test neu erstellen – Sie müssten einfach Ihre Verbindung bei der Durchführung von Tests auf dieselbe Ressource richten, die die DbUnit-Erweiterung für ihr Fixture verwendet.