PHP Magazin 1.14 Unit Tests mit Shopware

Hack, plug, play and test

Unit Tests mit Shopware

In der vergangenen Ausgabe haben Oliver Denter und Stephan Pohl ein Plugin entwickelt was das Shop Logo durch einen zufällig, vorher konfigurierten, Slogan ersetzt. Darauf aufbauend wollen wir nun einen Unit Test erstellen. Wer das Plugin benötigt kann es unter github herunterladen. Wir werden unseren Test auf die vorhandenen Tests, die Shopware auf Github veröffentlicht hat, aufbauen. In Zukunft soll ein eigenes Unit-Test Framework speziell für die Plugin Entwicklung geben [1].
In diesem Artikel werden wir folgende Dinge bearbeiten, Einrichtung einer geeigneten Testumgebung für Unit Tests, Ausführung der vorhandenen Tests und Entwicklung eines eigenen Unit Tests für das SloganOfTheDay Plugin.

Testumgebung

Als Testumgebung benötigen wir einen Webserver der die Shopware Voraussetzungen erfüllt. Zusätzlich wir das PEAR Modul PHPUnit mit der Erweiterung DBUnit benötigt. Wer schon eine funktionierende Testumgebung inklusive einer lauffähigen Installation des Shopware Masterbranches von Github hat, kann diesen Abschnitt getrost überspringen.
Als Grundlage für unser Testsystem verwenden wir eine minimale Installation von Debian. Alle weiteren benötigten Module und Einstellung sind unter [2] detailliert beschrieben. Zusätzlich zu den Shopware Voraussetzungen benötigen wir PHP-Pear und PHPUnit mit der Erweiterung DBUnit auf unserem Testsystem, zu installieren wie folgt:

Nachdem wir nun alle Bedingungen erfüllt haben, können wir uns an die Installation des aktuellen Masterbranches von Shopware machen. Dazu klonen wir den aktuellen Masterbranch per git clone https://github.com/ShopwareAG/shopware-4.git. Anschließend setzen wir die benötigten Verzeichnisrechte wie folgt:

Je nach Serverkonfiguration kann es sein, dass die Rechte 755 nicht ausreichen und der Server die vollen Rechte 777 benötigt. Mit Hilfe von ANT (ggfs. muss ANT noch installiert werden) und einer von Shopware bereitgestellten Konfigurationsdatei können wir mit folgendem Aufruf unsere Datenbankverbindung einrichten und die notwendigen Datenbanktabellen importieren.

Abschließend holen wir uns noch die aktuellen Demo Daten, dazu gehen wir ins Root Verzeichnis unserer Shopware Installation und führen folgende Befehle aus:

Wenn nun alles richtig installiert und konfiguriert wurde, können wir in das Verzeichnis tests/Shopware gehen und mit einem simplen Aufruf von phpunit alle vorhandenen Tests durchführen. Die Ausgabe sollte dann ungefähr so aussehen:

Ausfuehrung_unit_test

Erstellung eines eigenen Unit Tests

In dem Verzeichnis tests/Shopware/Tests befinden sich alle momentan vorhandenen Unit Tests von Shopware. Hier gibt es mehrere Verzeichnisse die Tests für Components, Controllers, Modules und Plugins enthalten.

Unseren Unit Tests erstellen wir auf Grundlage des Google Plugin Tests. Wir erstellen in dem Verzeichnis tests/Shopware/Tests/Plugins/Frontend eine neue Datei mit dem Namen SloganOfTheDayTest.php und folgendem Grundgerüst:

Mit der Hilfsfunktion Plugin() können wir im späteren Test mit $this->Plugin() anstatt Shopware()->Plugins()->Frontend()->SloganOfTheDay() auf unser Plugin und dessen Funktionen zugreifen. Nun fügen wir zu unserer testPostDispatch() Funktion folgendes hinzu, alle weiteren Quellcode Schnipsel werden danach eingefügt:

Dadurch haben wir nun das benötigte Request Object erstellt für ein Plugin aus dem Frontendbereich. Anschließend füttern wir unser Plugin noch mit Einstellungen, mit denen wir unser Plugin prüfen möchten. Wir erstellen ein Array mit verschiedenen Slogans. Dieses Array wird später zur Überprüfung der getRandomSlogan() Funktion benötigt.

Nun füllen wir die Plugin Konfiguration. Mit dem Parameter setAllowModifications() können wir noch nachträglich die Konfiguration des Plugins beeinflussen. Wie vom Plugin gefordert verbinden wir die einzelnen Arrayelemente von $slogans mit einem Semikolon zu einem String.

Anschließend erstellen wir ein neues Enlight_View_Default Objekt und laden das Standardtemplate frontend/index/index.tpl:

Danach erstellen wir ein neues Mock Objekt von der Enlight_Controller_Action Klasse.

Nun übergeben wir unserem Mock Objekt die aktuelle View Instanz.

Hier führen wir die Funktion onPostDispatchIndex aus dem Plugin aus und fangen eventuelle Exceptions ab.

Nun überprüfen wir mit Zuhilfenahme der PHPUnit Methode assertNull() ob wir eine Exception in der Ausführung haben.

Hier wird getestet ob im View auch wirklich ein Slogan enthalten ist, den wir vorher über das $slogan Array definiert haben.

Zu guter Letzt wird geschaut ob das Template im View geladen worden ist.

Fazit

Auch wenn die Lernkurve zum Schreiben von Unit Tests für Shopware Plugins am Anfang ziemlich hoch ist, hilft es einem ungemein in die vorhandenen Tests von Shopware zu schauen. Auf der Grundlage ist es bedeutend einfacher seinen eigenen Tests zu schreiben. Interessant wird es wenn Shopware das eigene Unit-Test Framework speziell für Plugins veröffentlicht. Damit sinkt die Hürde zum Erstellen von Unit Tests deutlich und das Erstellen von Unit Tests wird auch für Shopware Einsteiger ein Kinderspiel.
Links
[1] http://forum.shopware.de/programmierung-f13/unit-tests-framework-t4853.html
[2] http://www.shopware.de/die-shopsoftware/ueberblick/systemanforderungen/

Zusammenfassung
Artikelname
Unit Tests mit Shopware
Kurzbeschreibung
In diesem Artikel werden wir folgende Dinge bearbeiten, Einrichtung einer geeigneten Testumgebung für Unit Tests, Ausführung der vorhandenen Tests und Entwicklung eines eigenen Unit Tests für das SloganOfTheDay Plugin.
Autor

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.