Ich unterhalte eine Magento 1.9-Site mit mehreren benutzerdefinierten Modulen. Einige der Funktionen sind geschäftskritisch und erfordern dringend einige Komponententests. ZB ein Stückpreisrechner.
Normalerweise entwickle ich in Symfony und würde es wirklich vorziehen, PHPUnit (mit Composer) zu verwenden, wenn das überhaupt möglich ist.
Einige Funktionen basieren auf Daten, die in mehrere benutzerdefinierte Datenbanktabellen importiert wurden. Daher würde ich es vorziehen, Fixtures irgendwie zu laden.
Daher suche ich nach dem Best-Practice-Ansatz für das Schreiben einiger Komponententests. Gerne nehme ich Tutorials oder ähnliches an. Jede Hilfe wird geschätzt.
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:\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.\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 SiesetUp()
und wie Raphael sagte, umtearDown()
den Test in eine Transaktion zu verpacken, die nach dem Test (zum BeispielMage::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()
undMage::helper()
.Einige andere zentrale Objekte können aktiviert werden
Mage::app()
(z. B. die Anforderung).Um Klassen zu ersetzen, die über
Mage::getModel()
oderMage::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.
quelle