Seit Jahren ist das Test-Framework
EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.
Tipp #7: YAML Verzeichnis-Fallback
YAML-Dateien für Fixtures, Expectations und Data Providers werden standardmäßig in folgendem Schema erwartet, wobei in diesem Beispiel Importer.php den Test Case enthält und testImport die Test-Methode ist:
│ Importer.php
│
├───Importer
│ ├───expectations
│ │ testImport.yaml
│ │
│ ├───fixtures
│ │ testImport.yaml
│ │
│ └───providers
│ testImport.yaml
Hier die Signatur mit Annotations:
/**
* @param string $csv CSV file content
* @test
* @loadFixture
* @loadExpectation
* @dataProvider dataProvider
*/
public function testImport($csv)
Anstelle des Methodennamens kann der Dateiname der YAML-Datei jeweils explizit angegeben werden, hier z.B. in einem weiteren Test, der auch fixtures/testImport.yaml benutzt (wie das auch für Data Provider funktioniert, siehe Tipp #3).
/**
* @param string $csv CSV file content
* @test
* @loadFixture testImport
* @dataProvider dataProvider
* @expectedException RuntimeException
*/
public function testFailingImport($csv)
Aber auch die Verzeichnisstruktur muss nicht in dieser Form genutzt werden. Findet EcomDev_PHPUnit die jeweilige Datei nämlich nicht an der Stelle, greift folgende Fallback-Hierarchie:
- Default: siehe oben
- Module: Die Verzeichnisse “fixtures”, “expectations” und “providers” werden direkt im “Test” Verzeichnis des Moduls gesucht
- Global: Die Verzeichnisse werden in sämtlichen Oberverzeichnissen des Test Cases bis hin zum Magento Root gesucht
Auf diese Weise lassen sich Fixtures etc. Test Case übergreifend verwenden. Ich bevorzuge mittlerweile zumindest für Fixtures in den meisten Fällen die zweite Variante für modulweite Definition.
Die Hierarchie ist übrigens in der config.xml von EcomDev_PHPUnit wie folgt definiert:
<config>
<phpunit>
<suite>
<yaml>
<model>ecomdev_phpunit/yaml_loader</model>
<loaders>
<default>ecomdev_phpunit/yaml_loader_default</default>
<module>ecomdev_phpunit/yaml_loader_module</module>
<global>ecomdev_phpunit/yaml_loader_global</global>
</loaders>
</yaml>
</suite>
</phpunit>
</config>
Diese Loaders sind Models, die von EcomDev_PHPUnit_Model_Yaml_AbstractLoader
erben, mit einem eigenen Modul lassen sich hier also theoretisch weitere, eigene Loader hinzufügen und somit beliebige Quellen für die YAML Dateien verwenden.