Installation
Da Magento 1 Composer nicht sofort verwendet, macht es meiner Meinung nach keinen großen Unterschied, ob Sie phpunit mit Composer installieren oder einfach die Phar- Version herunterladen .
Wenn Sie Composer bereits zum Verwalten anderer Module oder Bibliotheken von Drittanbietern auf Ihrer Site verwenden, ist Composer wahrscheinlich am sinnvollsten. Wenn Sie PHP7 nicht verwenden, sind Sie jedoch auf eine alte Version von phpunit beschränkt (deshalb habe ich auf die obige Version 4.8 verlinkt).
Integrationstests gegen / und / oder Unit-Tests
Da Magento 1 eine so schwere Anwendung ist, ist es sinnvoll, den phpunit-Bootstrap für die Integration in einen für die Integration und einen für Unit-Tests zu unterteilen.
Der Unit-Test-Bootstrap muss nur den Autoloader initialisieren, während der Integrationstest-Bootstrap die gesamte Anwendungsumgebung einschließlich des Konfigurationsladens und der Datenbankverbindung initialisieren muss.
Aus diesem Grund werden Integrationstests in Magento in der Regel viel langsamer ausgeführt als Unit-Tests (noch mehr als in anderen Anwendungen).
Bootstrapping von Magento in phpunit
Der Autoloader von Magento ist nicht PSR-0-kompatibel, da er eine Ausnahme class_exists
auslöst, wenn er die Datei, in der sich eine Klasse befindet, nicht finden kann. Dadurch werden einige Verwendungen von in phpunit unterbrochen. Es gibt mehrere mögliche (wenn auch hackige) Problemumgehungen:
- Heben Sie die
\Varien_Autoload::autoload()
Registrierung des Magento-Autoloaders auf, indem Sie einen Dekorator einschließen, der die darin enthaltenen Ausnahmen ignoriert, und registrieren Sie den Wrapper als neuen Autoloader. Dies hat eine geringe Wahrscheinlichkeit von Konflikten mit Bibliotheken von Drittanbietern, die Autoloader registrieren und von einer bestimmten Autoloader-Reihenfolge abhängen.
- Verwenden Sie einen benutzerdefinierten Fehlerhandler, der den in Magento 1 integrierten umschließt. Der benutzerdefinierte Fehlerhandler verschluckt vom Magento-Autoloader ausgelöste Fehler. Dies ist die Lösung, die Raphaels Testframework verwendet . Dies scheint am besten mit anderen Erweiterungen von Drittanbietern kompatibel zu sein.
- Verwenden Sie den Include-Path-Hack zum Überschreiben,
\Varien_Autoload::autoload()
um den Fehler nicht auszulösen, wenn die Datei nicht vorhanden ist. Dies steht jedoch im Widerspruch zu mehreren Modulen, die dieselbe Klasse ebenfalls überschreiben. Ich benutze diesen Ansatz nicht selbst.
Um zu vermeiden, dass während des Tests Fehler beim Starten der Sitzung auftreten, legen Sie diese einfach $_SESSON = []
im Bootstrap fest.
Legen Sie ein benutzerdefiniertes Antwortobjekt fest, über Mage::app()->setResponse($testResponse)
das das reale erweitert wird, das jedoch keine Ausgabe oder Header sendet.
Verwenden Sie, um Magento zwischen Integrationstests neu zu initialisieren, die den Laufzeitstatus vollständig ändern Mage::reset(); Mage::app()
. Beachten Sie, dass der Fehlerbehandler danach neu dekoriert werden muss.
Vorrichtungen
Für DB-Fixtures verwende ich normalerweise die regulären Modelle in Fixture-Methoden, um Fixtures zu erstellen, z createSimpleProduct($sku)
. Verwenden Sie setUp()
und wie Raphael sagte, um tearDown()
den Test in eine Transaktion zu verpacken, die nach dem Test (zum Beispiel Mage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction()
) zurückgesetzt wird.
Bei Fixtures mit Speicherkonfiguration tendiere ich dazu, nur In-Memory-Fixtures mit einzurichten Mage::app()->getStore()->setConfig($path, $value)
.
Die EcomDev_PHPUnit
Erweiterung bietet auch die Möglichkeit, DB-Fixtures mit Yaml-Dateien zu erstellen, aber für mich ist es schwieriger, diese zu pflegen, als mit Fixtures, die mit Modellklassen erstellt wurden. YMMV.
Test Doppel
Die Registrierung kann verwendet werden , um Test Doppel für Objekte über erstellt zu injizieren Mage::getSingleton()
, Mage::getResourceSingleton()
und Mage::helper()
.
Einige andere zentrale Objekte können aktiviert werden Mage::app()
(z. B. die Anforderung).
Um Klassen zu ersetzen, die über Mage::getModel()
oder Mage::getResourceModel()
durch Test-Doubles erstellt wurden, muss ein benutzerdefinierter Konfigurationsobjekt-Wrapper verwendet werden. Sehen Sie sich dieses Beispiel in Raphaels Testframework an, wie dies erreicht werden kann.
Zusammenfassung
Sobald Magento gebootet ist, kann so ziemlich alles ziemlich gut getestet werden. Seien Sie jedoch darauf vorbereitet, tiefe Verspottungen zu erstellen, da der Kerncode eine große Anzahl von Methoden verkettet.
Obwohl das Setup hackig ist, funktioniert es gut und ich finde, dass die Tests mir viel Selbstvertrauen und Wert geben, ziemlich vergleichbar mit einer Testsuite für eine Symphony-App.