Feature-Tests & Plugin Events fehlerhaft

Hallo Forum,

in einem Plugin (SW 5.2 Struktur) habe ich mehrere Subscriber (via Resources/services.xml) eingebunden in denen verschiedene Model Events als Event/Listener registriert sind. Alles klappt soweit wie es soll.

Ich habe allerdings Probleme, für das Plugin Feature Tests zu schreiben. Das Problem dabei ist, dass, wenn ich mehrere Tests (oder alle) ausführen lasse, einige Tests nicht durchlaufen und fehschlagen, obwohl sie es eigentlich sollten. Denn wenn ich den vermeintlich fehlerhaften Test dann alleine ausführe ist alles gut und der Test läuft problemlos durch. Beide Verhalten sind auch reproduzierbar.

Wenn ich die Tests jedoch isoliert (processIsolation = true in der phpunit.xml) ausführe, dann laufen alle durch, jedoch ist dann natürlich die Ausführungszeit deutlich höher aufgrund der Art, wie die Tests ausgeführt werden.

Es sieht für mich danach aus, dass die Events/Subscriber nach einem Test zurück gesetzt werden bzw. nicht richtig aus dem Plugin geladen werden. so dass dann der nachfolgende Test logischerweise nicht das gewünschte Ergebnis liefert. Der folgende Code bestätigt mir diese Annahme auch:

public function setUp()
{
    parent::setUp();

    $listeners = Shopware()->Events()->getAllListeners();
}

In meinem Feature Test sind 2 Tests enthalten, wenn der erste Test ausgeführt wird, sind noch alle Events/Listeners, die durch das Plugin registriert werden, in der Liste enthalten. Bei der zweiten Methode fehlen genau diese Events/Listeners. Die Feature Tests leiten alle von der Enlight_Components_Test_Plugin_TestCase Shopware Klasse ab (engine/Library/Enlight/Test/Plugin/TestCase.php). Es scheint da beim setUp/reset was schief zu laufen.

Hat jemand ein ähnliches Problem und hat dafür vielleicht eine Lösung? 

Vielen Dank,
yulquen

Hallo yulquen,

der Grund, warum deine Tests im Gesamten fehlschlagen, könnte sein, dass einige Tests einen State zurücklassen, der dann wiederum andere Tests beeinflusst. Hier muss man natürlich dafür sorgen, dass die Tests möglichst keine Seiteneffekte verursachen. Ohne Code-Beispiel wird es aber schwierig, die Ursache für die Fehler in deinen Tests zu finden. 
Vielleicht hilft dir auch eins unserer Plugins weiter, in dem wir relativ ausführlich viele Stellen testen: SwagPaymentPayPalUnified/Tests at master · shopwareLabs/SwagPaymentPayPalUnified · GitHub
Hier werden u.a. auch Subscriber getestet. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hallo Michael,

vielen Dank für Deine Rückmeldung. Ich guck die ganze Zeit schon in die SWAG Feature Tests rein um ein paar hilfreiche Tricks zu finden :wink:

Ich hab jetzt, nach sehr langem Suchen mit Xdebug, zumindest folgendes herausgefunden:

  • Ich muss manuell \_GET und _POST leeren, da ansonsten das Routing nicht richtig funktioniert. Es wurde z.B die Route von einem vorigen Test übernommen.
  • Ich muss über den Container meine Services per reset($service_id) zurücksetzen, da ansonsten die Services nicht korrekt geladen werden. Da ich in den Tests auch teilweise mit Mocks in den Services arbeite, kam Shopware da anscheinend durcheinander.

Für den Moment kann ich zumindest sagen, dass die Feature Tests jetzt soweit alle wie erwartet funktionieren und ich die Tests nicht mehr isoliert in PHPUnit ausführen muss.

Viele Grüße,
yulquen

Hi zusammen,

ich bin gerade an einem ähnlichen Punkt und komme leider nicht weiter:

  • ich subscribe auf folgendes Event: sBasket::sUpdateArticle::after
  • jetzt möchte ich im Test dieses Event triggern.
  • beim ersten Test wird das Event auch korrekt ausgeführt, beim zweiten leider nicht mehr.

Um das Verhalten zu veranschaulichen, gibt es hier ein Beispiel Plugin: GitHub - rofthedeep/SubscriberTest: Shopware Subscriber Tests

Und der Screenshot der Command Line - wie beschrieben wird beim ersten Test das Event korrekt getriggert, beim zweiten nicht.

Habt ihr eventuell eine Idee, warum das so ist? Reicht „this->reset();“ nicht? Muss der Kernel erneut gestartet werden?

Die besten Grüße,

Tim

P.S.: Für die Isntallation habe ich die Composer Variante von Shopware verwendet. Deswegen erbt die bootstrap.php Datei der Tests auch von app/autoload.php …

 

Hab mittlerweile dank eines netten Tipps eine Lösung gefunden:

  • in der phpunit.xml.dist muss ein Parameter processIsolation=„true“ eingefügt werden. Damit wird die Applikation für jeden Test neu gestartet und die Events werden korrekt jedes mal getriggert :slight_smile:

Auch das Github Repository habe ich dahingehend angepasst: GitHub - rofthedeep/SubscriberTest: Shopware Subscriber Tests

Und noch eine Info: dass die Events bei der zweiten Ausführung nicht ausgeführt werden, ist bereits in einem Issue festgehalten: support functional test for plugins (services.xml) by wesolowski · Pull Request #1376 · shopware/shopware · GitHub

1 „Gefällt mir“