PHPUnit: Guter Code durch effizientes Testing
Hasan Dogan
Shopware-Plugins, die kontinuierlich weiterentwickelt werden. Sie sind aber häufig fehleranfällig, vor allem dann, wenn diese im Shopware Community Store an viele Kunden verkauft werden. Hier dürfen dementsprechend auch keine Fehler mehr auftreten. Um Probleme und Fehlerquellen während der Entwicklung des Plugins zu entdecken, muss schnell und auch automatisch getestet werden. Darum setzen immer mehr Entwicklerteams in der Web-Entwicklung auf die Funktionalität von PHPUnit und den sogenannten Unit Tests.
Bestimmt fragen Sie sich: „Weshalb brauchen wir Unit Tests, wenn unsere Applikation einwandfrei läuft?“. Als erfahrene Programmierer wissen wir, dass selbst wenn ein Programm ohne Probleme zu laufen scheint, sich etliche Fehler bereits eingeschlichen haben können, sodass eine bestimmte Eventualität nicht berücksichtigt wurde. Dies beugt das Testen mit PHPUnit vor, denn durch umfangreiches Unit Testing können Fehler im Code aufgedeckt werden und Ihnen sehr viel Zeit und Kosten in der Behebung eines Problems ersparen.
Ziel von PHPUnit: Fehler finden und beheben
Fehler können mit Unit Tests bereits in den Funktionen aufgespürt und behoben werden. Bei einfachen Funktionen ist manuelles Prüfen machbar und je nach verfügbaren Ressourcen auch vertretbar, aber wenn die Software größer und komplizierter wird, so sind manuelle Tests nur noch in wenigen Funktionen möglich. Mit Unit Tests können dagegen leicht 500, 1.000 oder 10.000 Tests innerhalb von Minuten abgearbeitet werden.
Das Schreiben von Unit Tests ist durchaus keine Zeitverschwendung, denn diese Zeit holen Sie später wieder rein.
Hasan Dogan, Teamleiter Shopware-Programmierung in Stuttgart und Heilbronn
Sebastian Bergmann hat mit PHPUnit ein Framework entwickelt, das Unit Tests für PHP-Applikationen durchführt. Gleichartige Module gibt es bereits für Java und andere Programmiersprachen. Innerhalb von PHPUnit existieren eine oder mehrere Testsuiten, die die einzelnen Test Cases beinhalten. Beim Aufruf von PHPUnit kann zunächst ausgewählt werden, welche Tests gestartet werden sollen.
Ein einfaches Beispiel zum Anfangen
Zu testende Funktion
Diese sehr übersichtliche Funktion wird über zwei Parameter gesteuert. Der Rückgabewert hängt von den Parametern $a und $b ab. Ein simpler Test für diese Funktion könnte folgendermaßen aussehen:
Einfache Testmethode
Der Test besteht in diesem Fall aus einer einzelnen Überprüfung. Solange die Funktion add () mit diesen Werten das richtige Resultat returned, ist der Test bestanden. In diesem Fall wird als erster Parameter das erwartete Resultat gesetzt. Als zweiter Parameter wird die Funktion „add()“ ausgeführt und mit dem erwarteten Resultat verglichen. Da 4 + 8 = 12 ist, ist dieser Test bestanden.
Anwendung von PHPUnit in Shopware
Im Normalfall werden allerdings nicht einzelne Funktionen, sondern ganze Klassen mit jeweils mehreren Funktionen getestet. Je nach Aufbau der zu testenden Klasse muss diese initialisiert oder instanziiert werden, damit die Funktionen getestet werden können.
Zudem sollte jeder Test unter gleichbleibenden und reproduzierbaren Rahmenbedingungen ablaufen. In PHPUnit gibt es dafür die so genannten Fixtures. Die Fixtures werden durch die beiden Funktionen setUp() und tearDown() kontrolliert, die vor beziehungsweise nach jedem einzelnen Test durchlaufen werden. In diesen Funktionen wird das eigentliche Fixture je nach Bedarf initialisiert und wieder gelöscht.
Damit Sie PHPUnit in Shopware nutzen können, muss zuerst eine Grundstruktur in Ihrem Plugin vorhanden sein. In dem jeweiligen Plugin Root muss ein Unterordner erstellt werden namens „Tests“. Dort befindet sich zum einen die Datei phpunit.xml.dist und in einem weiteren Unterordner Namens „Functional“ die Bootstrap.php. In der Bootstrap.php können Sie alle Tests initialisieren. Neben der Bootstrap.php sollten auch alle Klassen, die Sie testen wollen, als „[Klassenname]Test.php“ angelegt werden.
Die Bootstrap-Klasse sieht dann folgendermaßen aus:
Durch das Extenden der Klasse „TestCase“ stehen automatisch sämtliche Hilfsfunktionen von PHPUnit zur Verfügung (zum Beispiel: „assertEquals()“).
Nun können Sie mit der Funktion setUp() beginnen.
Beitrag kommentieren
Wir freuen uns auf Ihr Feedback!