Unit Tests für Magento

Unit Tests für Magento

Unit Tests werden häufig in der Magento 1 Modulentwicklung vernachlässigt. Die Einrichtung kann sehr kompliziert sein. Der dadurch entstehende Overhead schreckt viele Entwickler*innen  ab, weil die benötigte Zeit kaum in den zumeist engen Zeitplänen berücksichtigt wird.

Es ist aber unmöglich, solide CI/CD Workflows ohne Tests zu etablieren: Das Risiko neue Bugs mit jedem Commit einzuführen, ist viel zu hoch – insbesondere wenn du  im Team arbeitest.

Es ist tatsächlich möglich, robuste Test-Suites für Magento 1 Module zu schreiben. Tests sind ein absolut notwendiger Teil vom Entwicklungsprozess. Zwar ist dies mit Suchaufwand aus vielen Quellen für die Dokumentation und manchmal ersten Einrichtungsproblemen verbunden, schlussendlich wird aber doch viel Zeit gespart. Zeit, die lieber in spannende Projekte investiert werden kann, als ins Debugging von obskuren Problemen auf dem Server.

2019 laufen noch viele Shops auf Magento 1 – ein Umzug auf  Version 2 ist nicht unproblematisch. Laut einer Aussage des Magento-Teams wird die Version 1.9 aber noch bis einschließlich 2020 weiter unterstützt. Magento 1 wird also nicht bald aus dem Web verschwinden.  Es lohnt sich also noch anzufangen Tests zu schreiben – wer noch nicht angefangen hat, sollte auch nicht länger warten und jetzt damit beginnen. Qualitätssicherung und reibungslose Entwicklung-, Testing- und Release-Prozesse sind nach wie vor erforderlich.

Das sieht auch Gianpiero, Backend-Developer bei Lemundo, so und hat sich intensiv mit Unit Tests für Magento 1.x Module auseinandergesetzt.

Wie er genau dies versucht sicherzustellen, stellt er euch im Folgenden vor. Dabei geht es im Schwerpunkt um Gianpieros Erfahrungen im Testing von Magento Modulen. Für Leser*innen und Anwender*innen sind Praxiserfahrungen mit Magento, Composer, PHPUnit und Modman vom Vorteil.

Auf Medium gibt es auch eine englische Version des Beitrages von Gianpiero.

Einen neuen Magento-Shop für die Unit Tests einrichten

Wenn man eine Standard-Version von Magento mit einem einzigen Befehl installieren möchte, bietet sich das Tool n98-magerun an. Es erzeugt automatisch die Datenbank und Konfigurationsdateien.
Dafür werden erstmal die folgenden Variablen im Terminal gesetzt (hier sind Beispielwerte angegeben):

Copy to Clipboard

 

Als nächstes wird dieser Befehl in einer Zeile ausgeführt:

Copy to Clipboard

Falls der Installationsprozess frühzeitig abbricht, könnte es sein, dass mit rm -r die Magento-Directory entfernt und die Testdatenbank gelöscht werden muss, um weitere Fehlermeldungen zu vermeiden. Sobald die Meldung “Successfully installed magento” angezeigt wird, hast du einen Magento 1.9 Shop für Unit Tests eingerichtet!

EcomDev PHPUnit im Shop installieren

EcomDev_PHPUnit ist ein ausgezeichnetes Modul, dass PHPUnit (die alte, aber noch arbeitsfähige Version 4) in Magento integriert. Die Modulentwicklung ist seit 2014 leider nicht weiter geführt worden. Die Dokumentation bezieht sich auf die Version 0.2.0, wobei Version 0.3.7 das letzte Release ist. Wer sich tiefer in die letzten und teilweise nicht dokumentierten Features einlesen möchte, dem kann ich diese sehr interessanten Posts von Fabian Schmengler empfehlen.

Der Einfachheit halber wird folgender Befehl im Magento-Verzeichnis ausgeführt:

Copy to Clipboard

Nachdem die Abhängigkeiten installiert wurden, wird Composer nach dem “Magento root directory” fragen. Nun wird der absolute Pfad zum Magento-Verzeichnis eingetippt und mit Enter bestätigt.

Es folgen noch ein paar Schritte, um das Testing-Framework vollständig zu konfigurieren. Dies ist aber ein einmaliger Prozess: Nachdem die Einrichtung abgeschlossen ist, kannst du die Tests für alle Module direkt in diesem Test-Shop ausführen.

Eine Testdatenbank anlegen und EcomDev_PHPUnit konfigurieren

Um die Unit Tests auszuführen, wird eine separate Magento Datenbank benötigt. Dazu einfach in MySQL über die Konsole einloggen:

Copy to Clipboard

Dann das Root Passwort eintippen und eine leere Datenbank erzeugen:

Copy to Clipboard

Nun muss EcomDev_PHPUnit angegeben werden, welche Datenbank es nutzen soll. Um die Konfiguration zu automatisieren nutze ich ein Bash Script, das den aktuellen Stand überprüft und das Framework vorbereitet. Dies wird im Magento Verzeichnis abgespeichert  und dann wie folgt ausgeführt:

Copy to Clipboard

Die Testdatenbank mit PHPUnit initialisieren

Der letzte Schritt, um die Umgebung vorzubereiten, ist die Initialisierung der Datenbank für die Unit Tests. Wenn man PHPUnit das erste Mal startet, führt EcomDev_PHPUnit alle Setup-Skripte aus, die in Magento und in den Modulen vorhanden sind. Aus diesem Grund solltest du  auch die Testdatenbank nur für einen einzigen Testshop verwenden. Ansonsten können unterschiedliche Modul- und Magento-Versionen kollidieren.

Nun folgt die Überprüfung des Pfads zum PHPUnit-Binary und die Ausführung im Magento-Verzeichnis. In meinem Beispiel ist das vendor Verzeichnis direkt unter dem Magento-Verzeichnis, daher kann ich es einfach so ausführen:

Copy to Clipboard

Wenn alles richtig konfiguriert wurde, wird PHPUnit ein paar Sekunden benötigen (aber nur das erste Mal!), damit die Tabellen befüllt werden. Danach ist eine Nachricht wie diese zu sehen:

PHPUnit hat die Testdatenbank in 32.45 Sekunden initialisiert

Die Test-Suite ist gescheitert, da noch kein Testcases geschrieben wurde. Die Testdatenbank wurde aber trotzdem initialisiert. Das zweite Mal sollte der gleiche Befehl nur eine halbe Sekunde laufen, wie hier zu sehen:

PHPUnit hat die Testdatenbank in 0,5 Sekunden initialisiert

Wenn du schon gespannt bist und deine ersten Tests schreiben möchtest, dann könnest du dir  dieses Skeleton-Modul herunterladen, das ich als Basis-Modul geschrieben habe. Das Modul ist schon für die Tests konfiguriert und enthält ein Dummy-Test, der nichts anderes macht, als unsere Test-Suite erfolgreich abzuschließen (das Modul kann auch neu initialisiert werden und als Basis für ein neues Modul verwendet werden). Dafür werden folgende Befehle im Magento-Verzeichnis eingetippt:

Copy to Clipboard

Dieses Mal besteht die Test Suite und es erscheint eine grüne Bestätigung:

Testsuite besteht

Nun ist die Umgebung bereit, es kann angefangen werden Tests zu schreiben!

Kaputte Community-Module ausschließen

Wenn die Testdatenbank auf einem existierenden Shop eingerichtet werden soll, indem bereits viele Community Module installiert sind, dann kann es vorkommen, dass einige davon kaputte Tests enthalten. Ist dies der Fall, wird der Initialisierungsprozess frühzeitig abgebrochen und die Datenbank wird nur halb eingerichtet.
Die Lösung: Einfach die Module ausschließen, die Probleme verursachen (um welche Module es sich handelt, kann mit der Ausführung von PHPUnit mit dem Flag –debug  überprüft werden. Dann folgende Knoten in einer config.xml Datei einfügen.

Copy to Clipboard

Wenn die Tests das nächste Mal ausgeführt werden, werden diese Module ignoriert und die Datenbank wird vollständig initialisiert.

Im nächsten Post wird Gianpiero ein paar Strategien beleuchten, mit denen man die Module in Isolierung testen kann. – Aus jedem Verzeichnis und mit einem beliebigen Editor, damit man nicht unbedingt im Test-Shop arbeiten muss.

Ressourcen

  • Ein Shell Script zur automatischen Konfiguration von EcomDev_PHPUnit in einer beliebigen Magento directory.
  • Sehr gute Posts über EcomDev_PHPUnit von Fabian Schmengler, mit vielen interessanten Tipps & Tricks.
  • Magento PHP Developer’s Guide von Allan McGregor enthält nützliche Infos und Beispiele für Tests, Fixtures, Data Providers.
  • Ein einfacher Magento 1.x Modulgenerator mit built-in Tests and Travis-CI Integration den Gianpiero geschrieben hat, um mit der Entwicklung von neuen Modulen schnell beginnen zu können.
Veröffentlicht am: 20. Februar 2019Kategorien: Magento Shop Entwicklung

Gemeinsam
können wir
Großes
bewegen.

Philip Günther

Philip Günther

Geschäftsführer

Aktuelle Blog Beiträge

Über den Autor / die Autorin: Maria

Maria ist die Assistentin der Geschäftsführung bei Lemundo und unterstützt auch bei ProAdly, wo sie nur kann. Wenn sie nicht versucht sich mit der Contenterstellung im Wordpress-Blog oder mit dem Datenschutz auseinanderzusetzen, tobt Maria sich auf dem Volleyballfeld aus.