{"id":1796,"date":"2025-11-12T14:57:30","date_gmt":"2025-11-12T13:57:30","guid":{"rendered":"https:\/\/wiki.ad-libitum.info\/?page_id=1796"},"modified":"2026-05-22T17:01:26","modified_gmt":"2026-05-22T15:01:26","slug":"unittesting","status":"publish","type":"page","link":"https:\/\/wiki.ad-libitum.info\/?page_id=1796","title":{"rendered":"UnitTesting"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Mit <code>composer require --dev symfony\/test-pack<\/code> PHPUnit installieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In <code>ddev ssh<\/code> MySQL mit <code>mysql -u root<\/code> aufrufen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>CREATE DATABASE IF NOT EXISTS `db_test`;<br>GRANT ALL PRIVILEGES ON `db_test`.* TO 'db'@'localhost';<br>GRANT ALL PRIVILEGES ON `db_test`.* TO 'db'@'%';<br>FLUSH PRIVILEGES;<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ausf\u00fchren, damit die Testdatenbank die selben Rechte hat, wie die Originaldatenbank. Achtung: die <strong>richtigen<\/strong> Anf\u00fchrungszeichen m\u00fcssen verwendet werden, sonst kommt eine Fehlermeldung, dass die Syntax nicht stimmt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Daran denken, dass alle Migrationen auch f\u00fcr die db_test durchgef\u00fchrt werden m\u00fcssen:<br><code>bin\/console doctrine:migrations:migrate --env=test<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Achtung<\/strong>: Bei den Testl\u00e4ufen beachten, dass die Testdatenbank verwendet wird. Das hei\u00dft, es muss gepr\u00fcft werden, ob diese die erwarteten Daten enth\u00e4lt oder nicht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zum Erstellen von Tests ist <code>php bin\/console make:test<\/code> recht hilfreich.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Test ausf\u00fchren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Darauf achten, dass unter DDEV die Testdatenbank (<code>db_test<\/code>) nur dann verwendet wird, wenn in der <code>.env<\/code> zuvor <code>APP_ENV=<\/code> auf <code>test<\/code> umgestellt wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Alle Tests (alles was unter tests\/ liegt)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>php bin\/phpunit<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Alle Tests in einem bestimmten Ordner (z.B. alle Unit-Tests)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">zum Beispiel alle Unittests:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>php bin\/phpunit tests\/Unit\/<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">oder alle Funktionstests:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>php bin\/phpunit tests\/Functional\/<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eine bestimmte Testklasse<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>php bin\/phpunit tests\/Functional\/Controller\/ArticlesControllerTest.php<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Eine bestimmte Test-Methode<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>php bin\/phpunit --filter testIndexWithoutSearchTerm<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tests mit bestimmten Gruppen (wenn du @group annotierst)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>php bin\/phpunit --group database<br>php bin\/phpunit --group mock<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Differenziertere Ausgabe<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mit dem Paramter <code>--testdox<\/code>, oder auch <code>--display-all-issues<\/code> liefert die Ausgabe der Testergebnisse zus\u00e4tzliche Informationen mit, die mitunter sehr n\u00fctzlich sind.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testergebnisse in Datei ausgeben<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Die Testergebnisse k\u00f6nnen auch in Dateien exportiert werden. <code>--testdox-html ergebnis.html<\/code> exportiert in die Datei <code>ergebnis.html<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testen mit Datenbank<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Damit die Datenbank vor jedem Test denselben Zustand hat, <code>composer require --dev dama\/doctrine-test-bundle<\/code> installieren. Nach der Installation unbedingt das recipe ausf\u00fchren, damit das Bundle registriert wird:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- phpunit.dist.xml --&gt;\n&lt;phpunit&gt;\n    &lt;!-- ... --&gt;\n\n    &lt;extensions&gt;\n        &lt;!-- use this with PHPUnit 10 or newer --&gt;\n        &lt;bootstrap class=\"DAMA\\DoctrineTestBundle\\PHPUnit\\PHPUnitExtension\"\/&gt;\n        &lt;!-- use this with legacy PHPUnit versions older than 10 --&gt;\n        &lt;extension class=\"DAMA\\DoctrineTestBundle\\PHPUnit\\PHPUnitExtension\"\/&gt;\n    &lt;\/extensions&gt;\n&lt;\/phpunit&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Code Coverage<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mitunter ist es wichtig zu pr\u00fcfen, welcher Anteil vom Code getestet wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>XDEBUG_MODE=coverage phpunit --coverage-text --coverage-filter src tests<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">erzeugt eine Ausgabe die mitteilt, wie viele Klassen, Methoden und Zeilen getestet werden. Das Ausgabeformat kann mit <code>--coverage-html \/coverage<\/code> oder <code>--coverage-xml \/coverage<\/code> beeinflusst werden. Wobei <code>\/coverage<\/code> das Zielverzeichnis f\u00fcr die Ausgabedatei angibt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Allerdings kann &#8211;coverage <strong>nicht<\/strong> erkennen, ob Tests sinnvoll sind oder nicht. Das hei\u00dft, 100% des Codes kann auch mit nicht sinnvollen Tests getestet werden, so dass das Erbebnis letzten Endes keine Aussagekraft mehr hat. Also aufpassen!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fehlersuche im Test an sich<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bei Funktionstests ist es oft schwierig den \u00dcberblick zu behalten, wo man sich befindet. Mit diesem Code<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>$url = $this-&gt;client-&gt;getRequest()-&gt;getUri();<br>dump($this-&gt;client-&gt;getResponse()-&gt;getContent());<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">kann man sich den Inhalt der zugeh\u00f6rigen Seite anzeigen lassen und somit rausfinden, welche Seite aktuell gealden ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit composer require &#8211;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 &#8218;db&#8217;@&#8217;localhost&#8216;;GRANT ALL PRIVILEGES ON `db_test`.* TO &#8218;db&#8217;@&#8217;%&#8216;;FLUSH PRIVILEGES; ausf\u00fchren, damit die Testdatenbank die selben Rechte hat, wie die Originaldatenbank. Achtung: die richtigen Anf\u00fchrungszeichen m\u00fcssen verwendet werden, sonst kommt [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1796","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1796"}],"version-history":[{"count":23,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1796\/revisions"}],"predecessor-version":[{"id":1863,"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=\/wp\/v2\/pages\/1796\/revisions\/1863"}],"wp:attachment":[{"href":"https:\/\/wiki.ad-libitum.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}