Viele moderne Datenbankanwendungen verwenden das Doctrine ORM- Projekt.
Es wird als bewährte Methode angesehen, die Arbeit mit der Datenbank zu den Diensten zu bringen. Und Dienstleistungen müssen getestet werden.
Zum Testen von Diensten können Sie eine Testdatenbank verbinden oder den Entity Manager und die Repositorys sperren. Mit der ersten Option ist alles klar, aber es ist nicht immer sinnvoll, eine Datenbank zum Testen des Dienstes bereitzustellen. Wir werden darüber reden.
Nehmen Sie zum Beispiel den folgenden Dienst:
src / Service / User / UserService.php Wir müssen die einzige Methode create()
testen.
Wählen Sie folgende Fälle aus:
- Erfolgreiche Benutzererstellung ohne Referrer
- Erfolgreiche Benutzererstellung mit Referrer
- Fehler "Login bereits vergeben"
- Fehler "Referrer nicht gefunden"
Zum Testen des Dienstes benötigen wir ein Objekt, das die Schnittstelle Doctrine\ORM\EntityManagerInterface
implementiert
Option 1. Wir verwenden eine echte Datenbank
Wir werden eine Basisklasse für Tests schreiben, von der wir später erben werden.
Jetzt ist es für die Tests sinnvoll, Umgebungsvariablen festzulegen. Fügen Sie sie der Datei phpunit.xml
im Abschnitt php
. Ich werde SQLite DB verwenden
phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" forceCoversAnnotation="true" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTodoAnnotatedTests="true" verbose="true" colors="true"> <php> <env name="DB_DRIVER" value="pdo_sqlite" /> <env name="DB_PATH" value="var/db-test.sqlite" /> <env name="DB_USER" value="" /> <env name="DB_PASSWORD" value="" /> <env name="DB_NAME" value="" /> </php> <testsuites> <testsuite name="default"> <directory>tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> </phpunit>
Jetzt schreiben wir einen Servicetest
tests / Unit / Service / UserServiceTest.php Stellen Sie sicher, dass unser Service ordnungsgemäß funktioniert
./vendor/bin/phpunit
Option 2. Verwenden von MockBuilder
Es ist schwierig, jedes Mal eine Datenbank zu erstellen. Insbesondere phpunit gibt uns die Möglichkeit, Moki mit mockBuilder im laufenden Betrieb zu sammeln. Ein Beispiel finden Sie in der Symfony-Dokumentation.
Beispiel für eine Symfony-Dokumentation Die Option funktioniert, aber es gibt Probleme. Sie müssen genau wissen, in welcher Reihenfolge der Code auf die EntityManager-Methoden zugreift.
Wenn ein Entwickler beispielsweise die Prüfung auf das Vorhandensein eines Referrers und eine Prüfung auf geschäftige Anmeldung austauscht, wird der Test abgebrochen. Aber die Anwendung ist nicht.
Ich schlage die Option des intelligenten Rauchens EntityManager vor, der alle seine Daten im Speicher speichert und keine echte Datenbank verwendet.
Option 3. Wir verwenden MockBuilder mit Datenspeicherung im Speicher.
Aus Gründen der Flexibilität fügen wir eine Umgebungsvariable hinzu, damit Sie eine echte Datenbank verwenden können. Lassen Sie uns in phpunit.xml
überwintern
phpunit.xml ändert sich <?xml version="1.0" encoding="UTF-8"?> <php> <env name="EMULATE_BD" value="1" /> </php>
Ändern Sie nun die Basisklasse
modifizierte Tests / TestCase.php Jetzt können wir den Test erneut ausführen und sicherstellen, dass unser Dienst funktioniert, ohne eine Verbindung zur Datenbank herzustellen.
./vendor/bin/phpunit
Quellcode auf Github verfügbar