Dieses Paket bietet Funktionen, die Ihnen helfen, die Testsuite Ihrer Symfony-Framework-basierten App mit isolierten Tests effizienter auszuführen.
Es stellt einen StaticDriver
bereit, der Ihre ursprünglich konfigurierte Driver
Klasse (wie DBALDriverPDOMysqlDriver
) umschließt und eine Datenbankverbindung statisch im aktuellen PHP-Prozess aufrechterhält.
Mit Hilfe einer PHPUnit-Erweiterungsklasse wird vor jedem Testfall eine Transaktion gestartet und nach Abschluss des Tests für alle konfigurierten DBAL-Verbindungen wieder zurückgesetzt. Dies führt zu einer Leistungssteigerung, da nicht vor jedem Testfall das Schema neu erstellt, ein Backup-SQL-Dump importiert oder Fixtures erneut eingefügt werden müssen. Solange Sie vermeiden, DDL-Abfragen auszugeben, die zu impliziten Transaktions-Commits führen könnten (wie ALTER TABLE
, DROP TABLE
usw.; siehe https://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis), werden Ihre Tests isoliert und alle sehen das Gleicher Datenbankstatus.
Es enthält außerdem einen Psr6StaticArrayCache
, der automatisch als Metadaten- und Abfragecache für alle EntityManager konfiguriert wird. Dies hat die Geschwindigkeit und Speichernutzung meiner Testsuiten erheblich verbessert! Dies ist besonders nützlich, wenn Sie viele Tests haben, die Kernel starten (wie Controller-Tests oder ContainerAware-Tests) und Doctrine-Entitäten verwenden.
über Composer installieren
Composer erfordert --dev dama/doctrine-test-bundle
Wenn Sie Flex nicht verwenden, aktivieren Sie das Bundle, indem Sie die Klasse zu bundles.php hinzufügen
<?php// config/bundles.phpreturn [//...DAMADoctrineTestBundleDAMADoctrineTestBundle::class => ['test' => true],//...];
Ab Version 8 und nur bei Verwendung von DBAL < 4 müssen Sie sicherstellen, dass use_savepoints
in Ihrer Doctrine-DBAL-Konfiguration für alle relevanten Verbindungen aktiviert ist:
Lehre: dbal: Verbindungen: Standard: use_savepoints: true
Fügen Sie die Erweiterung Ihrer PHPUnit XML-Konfiguration hinzu
PHPUnit 8 oder 9:
<phpunit> ... <Erweiterungen> <extension class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </extensions> </phpunit>
PHPUnit 10+:
<phpunit> ... <Erweiterungen> <bootstrap class="DAMADoctrineTestBundlePHPUnitPHPUnitExtension" /> </extensions> </phpunit>
Stellen Sie sicher, dass Sie auch phpunit/phpunit
als dev
zur Verfügung haben ( Versionen 8, 9 und 10 werden mit der integrierten Erweiterung unterstützt ), um Ihre Tests auszuführen. Alternativ ist dieses Bundle auch mit symfony/phpunit-bridge
und seinem simple-phpunit
Skript kompatibel. (Hinweis: Möglicherweise müssen Sie mithilfe der Umgebungsvariablen SYMFONY_PHPUNIT_VERSION
sicherstellen, dass die phpunit-bridge die richtige Version von PHPUnit 8+ benötigt.)
Das ist es! Von nun an werden alle Änderungen, die Sie in jedem einzelnen Testfall an der Datenbank vornehmen (sei es ein WebTestCase
, ein KernelTestCase
oder ein benutzerdefinierter Test), automatisch für Sie zurückgesetzt
Aktivieren Sie die Erweiterung in Ihrer Behat-Konfiguration (z. B. behat.yml
).
Standard: # ... Erweiterungen: DAMADoctrineTestBundleBehatServiceContainerDoctrineExtension: ~
Das ist es! Von nun an werden alle Änderungen, die Sie in jedem Szenario an der Datenbank vornehmen, automatisch für Sie zurückgesetzt.
Bitte beachten Sie, dass dies nur funktioniert, wenn die Tests im selben Prozess wie Behat ausgeführt werden. Dies bedeutet, dass es nicht funktionieren kann, wenn Sie beispielsweise Selenium zum Aufrufen Ihrer Anwendung verwenden.
Das Bundle stellt eine Konfiguration bereit, die standardmäßig wie folgt aussieht:
dama_doctrine_test:enable_static_connection: trueenable_static_meta_data_cache: trueenable_static_query_cache: true
Die Einstellung enable_static_connection: true
bedeutet, dass es für alle konfigurierten Doctrine-Dbal-Verbindungen aktiviert wird.
Sie können es bei Bedarf nur für einige Verbindungen selektiv aktivieren:
dama_doctrine_test:enable_static_connection:connection_a: true
Standardmäßig verfügt jede konfigurierte Doctrine-DBAL-Verbindung über eine eigene Treiberverbindung, die im aktuellen PHP-Prozess verwaltet wird. Falls Sie dieses Verhalten anpassen müssen, können Sie verschiedene „Verbindungsschlüssel“ auswählen, die zur Auswahl von Treiberverbindungen verwendet werden.
Beispiel für zwei Verbindungen, die dieselbe Treiberverbindungsinstanz wiederverwenden:
doctrine:dbal:connections:default:url: '%database.url1%'foo:url: '%database.url2%'dama_doctrine_test:connection_keys:# Das Zuweisen desselben Schlüssels führt dazu, dass dieselbe interne Treiberverbindung wiederverwendet wird beide DBAL-VerbindungenStandard: custom_keyfoo: custom_key
Seit Version 8.1.0 : Für Verbindungen mit Lese-/Schreibreplikaten verwendet das Bundle standardmäßig dieselbe zugrunde liegende Treiberverbindung für die primäre und auch für Replikate. Dies behebt ein Problem, bei dem es zu Inkonsistenzen beim Lesen/Schreiben in verschiedene Verbindungen kam. Dies kann auch wie folgt angepasst werden:
doctrine:dbal:connections:default:url: '%database.url%'replicas:replica_one:url: '%database.url_replica%'dama_doctrine_test:connection_keys:# Das Zuweisen unterschiedlicher Schlüssel führt dazu, dass separate interne Treiberverbindungen für primäre und verwendet werden Replicadefault:primary: custom_key_primaryreplicas:replica_one: custom_key_replica
Eine Beispielverwendung finden Sie in den in diesem Paket enthaltenen Funktionstests: https://github.com/dmaicher/doctrine-test-bundle/tree/master/tests
Der anfängliche Datenbank-Bootstrap erfolgt mithilfe der PHPUnit-Bootstrap-Datei: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/bootstrap.php
mehrere Tests, die sicherstellen, dass alle Änderungen aus früheren Tests rückgängig gemacht werden: https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/PhpunitTest.php
Dieses Bundle wird auch in der offiziellen Symfony Demo-Testsuite verwendet: https://github.com/symfony/demo
Manchmal kann es nützlich sein, den Datenbankinhalt debuggen zu können, wenn ein Test fehlschlägt. Da normalerweise alle Änderungen automatisch rückgängig gemacht werden, können Sie dies manuell tun:
öffentliche Funktion testMyTestCaseThatINeedToDebug() {// ... etwas, das den DB-Status ändertDAMADoctrineTestBundleDoctrineDBALStaticDriver::commit(); die;// jetzt werden die DB-Änderungen tatsächlich beibehalten und Sie können sie debuggen}
Für den Fall, dass Sie während Ihrer Tests (vielleicht ohne es zu wissen) Abfragen ausführen, die implizit eine offene Transaktion festschreiben (siehe beispielsweise https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html) Möglicherweise wird ein Fehler wie dieser angezeigt:
DoctrineDBALDriverPDOException: SQLSTATE[42000]: Syntax error or access violation: 1305 SAVEPOINT DOCTRINE2_SAVEPOINT_2 does not exist
Derzeit gibt es für dieses Bundle keine Möglichkeit, mit diesen Abfragen zu arbeiten, da sie nach Abschluss des Testfalls einfach nicht zurückgesetzt werden können.
Siehe auch #58