Umfassende Magento Unit Test Abdeckung mit dem TechDivision Test-Framework

Magento-Shopprojekte werden immer umfangreicher und komplexer wodurch das Thema Qualitätssicherung inzwischen enorme Bedeutung für den Projekterfolg hat. Hierzu sind diverse Testmechanismen mittlerweile unverzichtbar geworden. Insbesondere sog. Unittests sollten zum Standard bei Magento-Implementierungen zählen. Um eine möglichst umfangreiche Testabdeckung in Magento gewährleisten zu können verwenden wir das von uns entwickelte TechDivision_MagentoUnitTesting Framework, das wir unter Github auch zum Download zur Verfügung stellen.

Was sind Unittests?

Unittests, auch Modultests genannt, testen die Funktionsweise des kleinsten ausführbaren Bestandteils der Software. Dabei werden alle Abhängigkeiten zu externen Systemen (z.B. Datenbank, Dateisystem oder Webservices) sowie anderen/internen Modulen, abgeschottet bzw. simuliert, sodass der Rückgabewert dieser Komponenten für den Test-Durchlauf definiert ist. Stichwort: Mocking

Im PHP-Umfeld heißt es, dass die Funktionsfähigkeit jeder einzelnen Methode sichergestellt bzw. kontrolliert werden kann. Dabei können alle Seiteneffekte, die außerhalb der zu testenden Klasse stattfinden, ausgeblendet werden. Voraussetzung hierfür ist ein durchgehend objektorientierter Code mit der Möglichkeit die Abhängigkeiten der Objekte zueinander während der Laufzeit zu reglementieren. Stichwort: Dependency Injection


Da innerhalb der Unittests die Abhängigkeiten gemocked bzw. simuliert werden, ist es möglich mit Hilfe der Unittests Bestandteile der Applikation zu entwickeln, obwohl die Komponenten, zu welchen die Abhängigkeit besteht, noch nicht fertiggestellt wurden.

Einordnung innerhalb anderer Testarten

Mit den Unittests kann nicht die Funktionsfähigkeit der Applikation sichergestellt werden, jedoch die der einzelnen Komponenten. Aus diesem Grund reihen sich die Unittests ganz vorne innerhalb der Softwaretests ein und bilden die Grundlage für alle weiteren Tests.
Erst wenn sichergestellt wurde, dass die einzelnen Komponenten funktionieren, kann sinnvoll getestet werden, ob das Zusammenspiel der einzelnen Bestandteile zum gewünschten Ergebnis führt.

Unittests > Integrationstests > autom. Akzeptanz Tests > Oberflächen/Silenium Tests

Durch eine gute Testabdeckung bei den Unittests wird die Anzahl der erforderlichen Integrationstests drastisch reduziert, da hier lediglich das Zusammenspiel der einzelnen Komponenten getestet werden muss.

Schwierigkeiten des Testings im Magento-Umfeld

Im Magento-Umfeld ergeben sich durch das Alter des Codes und die evolutionär gewachsenen Strukturen zahlreiche Hürden beim Schreiben von Unittests. Mit den gegebenen Mitteln der TestSuite PHPUnit von Sebastian Bergmann kann man nur eine sehr geringe Testabgeckung erzielen. Durch eine geschickte Implementierung des Codes kann die Abdeckung minimal gesteigert werden.
Die drei größten Problemfälle werden im folgenden genauer beschrieben.

Mage-Gottklasse (Statische Aufrufe)

Innerhalb von Magento werden neue Instanzen ausschließlich über die, von der Basis-Klasse Mage bereitgestellten Funktionen initiiert. Diese Tatsache an sich wäre kein Problem, wenn die besagten Methoden nicht statisch aufgerufen werden würden. Somit lässt sich die Mage-Klasse, die ausschließlich aus statischen Methoden besteht, nicht mocken.

$model = Mage::getModel(„example/model_key“);

Über geschickte Implementierung des Codes können hierfür Getter und Setter Methoden geschaffen werden, sodass die Instanz des gewünschten Objekts übergeben werden kann. Jedoch stößt dieses Vorgehen an seine Grenzen, sobald von Klassen aus dem Magento Core abgeleitet werden muss.

Verwendung des Call-Interceptors

Da nahezu alle Klassen in Magento ihren Ursprung in der Varien_Object Klasse haben, ist somit überall der Call-Interceptor implementiert. Mit Hilfe des Call-Interceptors ist es für die Instanz möglich, zur Laufzeit neue Methoden zu generieren. Da diese Methoden während der Initialisierung des Objekts nicht vorhanden sind, werden sie vom MockBuilder der PHPUnit-TestSuite nicht berücksichtigt. Die Implementierung der gewünschten Funktionalität im Test ist oft mit viel Aufwand verbunden und treiben die zeitliche Kosten für das Schreiben der Tests in die Höhe.

Verwendung von „final“ Funktionen

An diversen Stellen im Code des Magento Cores sind finale Methoden implementiert. Solche Methoden können in den abgeleiteten Klassen nicht überschrieben und somit auch nicht gemocked werden. Dies hat zufolge, dass Abhängigkeiten nur bedingt ausgegrenzt werden können und man somit gezwungen ist, in seinem Tests, Funktionen aus anderen Klassen mit zu testen.

Lösung der Probleme

Um den o.g. Problemen beim Testen von Magento vorzubeugen, wurde von uns ein Testing-Framework geschaffen, welches die TestSuite PHPUnit um Magento-spezifische Anforderungen erweitert.

StaticMock + MageProxy - Mit Hilfe der Klasse

TechDivision_MagentoUnitTesting_Helper_Static_Mock können zur Laufzeit neue Klassen mit statischen Methoden generiert werden. Somit ist das möglich, das Laden der Mage-Klasse aus dem Magento-Core zu verhindern und dabei gleichzeitig eigene statische Methoden für die Application bereitzustellen.
Die Klasse TechDivision_MagentoUnitTestting_MageProxy stellt ein mockbares Äquivalent zur statischen Mage-Klasse bereit. Durch die Zusammenarbeit dieser beiden Klassen wird also ein Mage-Fake dynamisch zur Laufzeit generiert und die definierten statischen Methoden leiten alle Anfragen an die Mock-Instance des MageProxy weiter.

Die o.g. Schritte werden automatisch vor jedem Test durchgeführt, wenn man seine Test-Klasse vom Testcase TechDivision_MagentoUnitTesting_TestCase_Abstract ableitet.

Ferner werden von der Testcase-Klasse weitere Hilfsmethoden bereitgestellt, die das interagieren mit dem Mage-Mock während des Testes vereinfachen. Beispielsweise kann über die Methode addMageModel() ein neues, gemocktes Model für einen bestimmten Key angelegt werden.

Implementierung addCallInterceptorMethod()

Um den Aufwand beim Implementieren der magischen Methoden in die Mock-Instanzen zu reduzieren, wurde die Methode addCallInterceptorMethod() in der TechDivision_MagentoUnitTesting_TestCase_Abstract Klasse implementiert. Diese Methode meldet beliebig viel magische Funktionen im Mock an.

Helper_Proxy Klasse

Mit Hilfe der Klasse TechDivision_MagentoUnitTesting_Helper_Proxy können Proxy-Instanzen für sämtliche Mock-Objekte erzeugt werden. Der Proxy stellt drei Methoden bereit (disableMethod(), addBefore(), addAfter()), mit deren Hilfe bestimmte Funktionen deaktiviert bzw. überbrückt werden können.
In allen Test die vom abstrakten Testcase TechDivision_MagentoUnitTesting_TestCase_Abstract ableiten, wird die Methode buildProxy() bereitgestellt, um das Erstellen von neuen Proxys zu erleichtern. Gleichzeitig wurde die Methode assertMethodInvocationInProxy() im abstrakten Testcase implementiert, sodass der Aufruf der überbrückten Methode als Testfall überprüft werden kann.

Wer soll das bezahlen?

Häufig hört man den Einwand, dass Shop-Projekte sowieso schon sehr umfangreich und teuer sind und man daher nicht auch noch zusätzliche Aufwände für diverse Testmechanismen aufbringen möchte. Dem kann entgegnet werden, dass bei entsprechender Erfahrung und den nötigen Tools der Mehraufwand für solche Tests im Rahmen der Implementierung sehr überschaubar ist und in der Folge deutlich weniger Aufwand beim (manuellen) Testen sowie bei etwaigen Bugfixing anfällt und die Software zudem qualitativ besser und damit auch stabiler und sicherer sein wird was einen nicht unerheblichen mittel- und langfristigen Kostenvorteil mit sich bringt. Insofern kann das Argument aus unserer Sicht so nicht aufrecht erhalten werden. Eines muss dabei immer klar sein: Qualität kostet immer Geld, keine Qualität kostet im schlimmsten Fall aber das Überleben!

In der täglichen Arbeit an diversen, zum Teil sehr umfangreichen und komplexen Magento-Projekten erreichen wir mit unserem Framework im übrigen zwischenzeitlich auch Testabdeckungen, die bislang häufig nicht für möglich gehalten wurden. Nachfolgend ein Screen aus einem aktuellen Kundenprojekt:



Das TechDivision MagentoUnitTesting Framework steht unter Github zum Download zur Verfügung und wird von uns bereits seit längerem sehr erfolgreich in der täglichen Projektarbeit verwendet. Über Feedback bzw. Input zu unserem Framework aus der Community freuen wir uns jederzeit! Darüber hinaus fänden wir es cool, wenn wir damit einen kleinen Beitrag zu besserer Qualität bei Magento-Projekten leisten könnten.

Neueste Posts

360 Stories – ein Spiel für Teams Die B2B E-Commerce Pyramide
Digital Storytelling - ein Kurztrip in die Kreativität und wieder zurück
TechDivision veröffentlicht Magento 2 Schnittstelle für pixi* TechDivision wird von Focus Business als „TOP Arbeitgeber Mittelstand 2018“ ausgezeichnet

Archiv

Dezember November Oktober September August Juli Juni Mai April März Februar Januar
Dezember November Oktober September August Juni Mai April Februar Januar
Dezember November Oktober September August Juli Juni März Februar
Oktober September August Juli Juni Mai April März Januar
Dezember November Oktober September August Juli Mai April Februar
November Oktober September April Februar
Dezember September Juni Mai Februar Januar
Juli Mai April März Februar Januar
September August Juli März
Oktober September Juli Juni Mai März Februar
Februar

Kategorien

E-Commerce Unternehmensmeldung Online-Marketing Magento Commerce Neos TYPO3 SEO SEA Usability Digitale Transformation Agile Projektentwicklung Corporate Web Analytics Künstliche Intelligenz Mobile Marketing Social Media Veranstaltungen Research & Development

Unser Herz schlägt online -
Deins Auch?


Wir stellen uns jeden Tag neuen Heraus-forderungen des Online-Business – immer auf der Suche nach spannenden Lösungs-ansätzen und sinnvollen Technologien. Eine Vielzahl namhafter Kunden vertrauen auf das Online Know-how „Made in Kolbermoor / Rosenheim und München“. 

Lust auf TechDivision? Hier geht zu unseren Stellenanzeigen

eStrategy Magazin


Erfahren Sie mehr zu den Themen E-Commerce, Online-Marketing, Mobile, Projektmanagement, Webentwicklung und E-Recht in unserem kostenlosen Online-Magazin.

Jetzt herunterladen!

Whitepaper:
Agiles Projektmanagement


In unserem kostenlosen Whitepaper versuchen wir Basiswissen und Erfahrungen aus vielen Jahren täglicher Projekt- und Unternehmenspraxis zu vermitteln, mit denen Sie die Anforderungen des Arbeitslebens von Heute besser bewältigen können.

Jetzt herunterladen!

Autor

Haben wir Ihr Interesse mit unserem Blog geweckt?

Wir sind der richtige Partner für anspruchsvolle Projekte im Bereich E-Commerce, Corporate Web, Consulting und Online-Marketing. Sprechen Sie mit uns!

Autor

Josef Willkommer Geschäftsführer / CMO