Mit composer require --dev symfony/test-pack PHPUnit installieren.
In ddev ssh MySQL mit mysql -u root aufrufen.
CREATE DATABASE IF NOT EXISTS `db_test`;
GRANT ALL PRIVILEGES ON `db_test`.* TO 'db'@'localhost';
GRANT ALL PRIVILEGES ON `db_test`.* TO 'db'@'%';
FLUSH PRIVILEGES;
ausführen, damit die Testdatenbank die selben Rechte hat, wie die Originaldatenbank. Achtung: die richtigen Anführungszeichen müssen verwendet werden, sonst kommt eine Fehlermeldung, dass die Syntax nicht stimmt.
Daran denken, dass alle Migrationen auch für die db_test durchgeführt werden müssen:bin/console doctrine:migrations:migrate --env=test
Achtung: Bei den Testläufen beachten, dass die Testdatenbank verwendet wird. Das heißt, es muss geprüft werden, ob diese die erwarteten Daten enthält oder nicht.
Zum Erstellen von Tests ist php bin/console make:test recht hilfreich.
Test ausführen
Darauf achten, dass unter DDEV die Testdatenbank (db_test) nur dann verwendet wird, wenn in der .env zuvor APP_ENV= auf test umgestellt wird.
Alle Tests (alles was unter tests/ liegt)
php bin/phpunit
Alle Tests in einem bestimmten Ordner (z.B. alle Unit-Tests)
zum Beispiel alle Unittests:
php bin/phpunit tests/Unit/
oder alle Funktionstests:
php bin/phpunit tests/Functional/
Eine bestimmte Testklasse
php bin/phpunit tests/Functional/Controller/ArticlesControllerTest.php
Eine bestimmte Test-Methode
php bin/phpunit --filter testIndexWithoutSearchTerm
Tests mit bestimmten Gruppen (wenn du @group annotierst)
php bin/phpunit --group database
php bin/phpunit --group mock
Differenziertere Ausgabe
Mit dem Paramter --testdox, oder auch --display-all-issues liefert die Ausgabe der Testergebnisse zusätzliche Informationen mit, die mitunter sehr nützlich sind.
Testergebnisse in Datei ausgeben
Die Testergebnisse können auch in Dateien exportiert werden. --testdox-html ergebnis.html exportiert in die Datei ergebnis.html.
Testen mit Datenbank
Damit die Datenbank vor jedem Test denselben Zustand hat, composer require --dev dama/doctrine-test-bundle installieren. Nach der Installation unbedingt das recipe ausführen, damit das Bundle registriert wird:
<!-- phpunit.dist.xml -->
<phpunit>
<!-- ... -->
<extensions>
<!-- use this with PHPUnit 10 or newer -->
<bootstrap class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension"/>
<!-- use this with legacy PHPUnit versions older than 10 -->
<extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension"/>
</extensions>
</phpunit>
Code Coverage
Mitunter ist es wichtig zu prüfen, welcher Anteil vom Code getestet wird.
XDEBUG_MODE=coverage phpunit --coverage-text --coverage-filter src tests
erzeugt eine Ausgabe die mitteilt, wie viele Klassen, Methoden und Zeilen getestet werden. Das Ausgabeformat kann mit --coverage-html /coverage oder --coverage-xml /coverage beeinflusst werden. Wobei /coverage das Zielverzeichnis für die Ausgabedatei angibt.
Allerdings kann –coverage nicht erkennen, ob Tests sinnvoll sind oder nicht. Das heißt, 100% des Codes kann auch mit nicht sinnvollen Tests getestet werden, so dass das Erbebnis letzten Endes keine Aussagekraft mehr hat. Also aufpassen!
Fehlersuche im Test an sich
Bei Funktionstests ist es oft schwierig den Überblick zu behalten, wo man sich befindet. Mit diesem Code
$url = $this->client->getRequest()->getUri();
dump($this->client->getResponse()->getContent());
kann man sich den Inhalt der zugehörigen Seite anzeigen lassen und somit rausfinden, welche Seite aktuell gealden ist.