Wenn ich meine Module schreibe, versuche ich, ihnen Komponententests für die kritischsten Teile der Anwendung zur Verfügung zu stellen. Es gibt jedoch im Moment (Magento 2.1.3) verschiedene Möglichkeiten, um Unit-Tests zu schreiben:
Verschiedene Testmethoden
- Integrieren Sie es in
bin/magento dev:tests:run unit
und führen Sie es über die mit Magento mitgelieferten phpunit-Standardeinstellungen aus. - Schreiben Sie sie separat, führen Sie sie mit aus
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
und verspotten Sie alles, was Magento ist. - Schreiben Sie sie separat, verspotten Sie alles und verwenden Sie eine systemweite Version von PHPUnit.
- Schreiben Sie sie separat, führen Sie sie mit aus
vendor/bin/phpunit
, aber nutzen Sie sie trotzdem\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 und PHPUnit
Außerdem wird Magento 2 mit PHPUnit 4.1.0 ausgeliefert, das nicht PHP7-kompatibel ist. Indem Sie Eingeborene (wie string
und `int) mit Typhinweisen versehen und Rückgabetypen in Ihren Signaturen deklarieren, werden Fehler ausgegeben. Zum Beispiel eine Schnittstelle / Klasse mit einer Methodensignatur wie folgt:
public function foo(string $bar) : bool;
... kann von PHPUnit 4.1.0 nicht verspottet werden. :-(
Meine aktuelle Situation
Aus diesem Grund schreibe ich meine Unit-Tests jetzt hauptsächlich auf die dritte Art und Weise (durch Aufrufen einer system-globalen PHPUnit-Version).
In meinem Setup habe ich PHPUnit 5.6 global installiert, damit ich den richtigen PHP7-Code schreiben kann, aber ich muss einige Verbesserungen vornehmen. Beispielsweise:
phpunit.xml
muss so aussehen, damit ich den Composer-Autoloader verwenden kann:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... und in all meinen setUp()
Methoden habe ich folgende Prüfung, damit ich meine Tests mit Aufwärtskompatibilität schreiben kann:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
Auf diese Weise wird kein Fehler ausgegeben, wenn meine Tests von Magentos 'eingebautem PHPUnit ausgeführt werden.
Meine Frage
Hier ist meine Frage: Ist dies eine "gesunde" Art, Komponententests zu schreiben? Weil es mir nicht richtig erscheint, dass Magento mit einer ganzen Reihe von Tools zum Testen geliefert wird und ich sie nicht verwenden kann, weil ich PHP7 verwende. Ich weiß, dass es auf GitHub Tickets gibt, die dieses Problem beheben, aber ich frage mich, wie die Community derzeit ihre Tests schreibt.
Gibt es eine Möglichkeit, in Magento 2 Komponententests zu schreiben, damit ich meinen Code nicht 'downgraden' muss und trotzdem die integrierten Hilfsprogramme von Magentos verwenden kann, um alles zu verspotten, was der Objektmanager berührt? Oder ist es sogar eine schlechte Übung, den Objektmanager auch in Ihren Unit-Tests zu verwenden?
Ich vermisse viele Anleitungen / Beispiele, wie Sie Ihre eigenen benutzerdefinierten Module testen können.