PHPUnit erweitern: einen Dekorator hinzufügen

9

Kontext

Ich habe kürzlich die Entwicklung und Wartung einer gut programmierten PHP-Anwendung (Sarkasmus) geerbt. Die Anwendung basiert auf einer kommerziellen Software (die ich nicht nennen werde), und es gibt eine Anpassungsschicht (unsere), die darauf aufgebaut ist.

Leider verwendet diese Anwendung eine Tonne von Globalen und Singletons (Wortspiel beabsichtigt). Ich habe Testfälle für all die Dinge erstellt, die wir außer Kraft gesetzt haben. Viele Dinge hängen jedoch von einem globalen Zustand ab, der Rassenbedingungen und alle möglichen seltsamen Dinge verursachen kann.

Randomisierung der Tests

Um die meisten dieser seltsamen-o-Tonnen zu fangen (ich nenne sie so), habe ich eine PHPUnit TestDecorator erstellt, [wie im Handbuch dokumentiert] [1] . Dieser:

%Vor%

Im Grunde wird die Reihenfolge der Tests zufällig festgelegt, um sicherzustellen, dass ein Test nicht von einem globalen Zustand abhängt, der korrekt oder nicht korrekt ist.

Die Frage

Das Problem trat auf, als die Zeit kam, meinen benutzerdefinierten Dekorateur zu testen. Ich habe nirgendwo im Handbuch, Google oder Stack Overflow gefunden, wie man es lädt.

Als ich den Code analysierte, sah ich, dass PHPUnit selbst den RepeatedTest Dekorator in der Methode TextUI_TestRunner::doRun() instanziiert hat. Ich weiß, dass ich die TestRunner , override doRun() unterordnen kann, arrangiere, dass mein Decorator erstellt wird, und rufe dann einfach die parent::doRun() mit meiner Decorator-Instanz als Argument auf, überschreibe TextUI_Command und erstelle ein neues CLI-Skript meine Sachen statt der eingebauten Sachen.

Bevor ich das Rad neu erfinde, habe ich mich nur gefragt, ist es möglich, einen benutzerdefinierten Dekorator zu laden, ohne den TestRunner zu untergliedern?

Danke.

    
netcoder 15.11.2011, 20:46
quelle

1 Antwort

3

Mit den aktuellen PHPUnit-Versionen gibt es keine einfache Möglichkeit, den eigenen Code größtenteils einzubinden. Das einzige, was Austauschbarkeit bietet, ist der TestRunner und das, was Sie beschrieben haben, ergibt für mich Sinn.

Mir ist keine andere Möglichkeit bekannt, Testdekoratoren zur Verfügung zu stellen oder die meisten anderen Klassen, die phpunit benutzt, zu ändern.

Die Art und Weise, wie Sie die Reihenfolge der Testausführung ändern möchten, scheint zu funktionieren, obwohl ich nicht sicher bin, wie gut es sich mischen würde.

Eine andere Möglichkeit, dies zu erreichen, wäre weniger mühsam, eine Unterklasse von PHPUnit_Framework_TestSuite randomly addTest Ihres Codes zu erstellen.

Wenn das nicht funktioniert, wäre eine andere Option, die XML-Konfigurationsdatei zu verwenden und die Testsuite aus <file> -Tags zu erstellen und vor jeder Ausführung Code zu mischen, der diese Tags enthält. Afaik phpunit sortiert sie nicht in irgendeiner Weise, so wird die Ausführung zufällig sein

Möchten Sie sehen, ob alle Tests wirklich funktionieren und interdependente Tests gefunden werden sollen?

Oder willst du wirklich sehen, ob etwas schrecklich bricht, wenn du eine Menge Dinge tust, die nichts in der falschen Reihenfolge ändern sollten?

Ich frage nur, ob Sie --process-isolation noch nicht berücksichtigt haben. (Was ich vermute, dass du fragst, wird nicht weh tun und dir vielleicht Zeit und Mühe ersparen :))

Wenn Sie jeden Test mit einem neuen Satz von Globals ausführen, werden Sie zumindest alle Testabhängigkeiten finden, und das ist nur ein Klick, um sicherzustellen, dass jeder Test in Ihrer Suite von selbst funktioniert.

    
edorian 15.11.2011, 23:07
quelle

Tags und Links