Wie überspringe ich Tests in PHPunit?

87

Ich verwende phpunit in Verbindung mit Jenkins und möchte bestimmte Tests überspringen, indem ich die Konfiguration in der XML-Datei einstelle phpunit.xml

Ich weiß, dass ich in der Befehlszeile verwenden kann:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

Wie übersetze ich das in die XML-Datei, da das <filters>Tag nur zur Codeabdeckung dient?

Ich möchte alle Tests außer ausführen testStuffThatAlwaysBreaks

Dateityp
quelle
1
KO: Was ist mit der Korrektur des Tests? Übrigens, hallo von welly ;-)
zerkms
Ich habe die Tests nicht geschrieben, es ist etwas irrelevantes und ich möchte auch nicht die Kerndateien ändern
Filype
Zweifellos können Sie dies tun. Es ist eine sehr seltsame Anforderung
zerkms
PS: Sie haben Filter erwähnt - aber es konnte Ihnen nicht helfen, da es den gesamten Pfad ausschließt. Andernfalls <exclude>- würde die Arbeit für Sie
erledigen
Können Sie die vorgeschlagene Datei phpunit.xml.dist veröffentlichen?
Filype

Antworten:

163

Der schnellste und einfachste Weg, um Tests zu überspringen, die entweder fehlerhaft sind oder an denen Sie später weiterarbeiten müssen, besteht darin, oben in Ihrem individuellen Komponententest Folgendes hinzuzufügen:

$this->markTestSkipped('must be revisited.');
jsteinmann
quelle
Sie können der XML-Konfigurationsdatei jederzeit Verzeichnisse oder Tests hinzufügen. Wenn dies jedoch ein Controller oder ähnliches ist, ist dies nicht sehr praktisch, da Sie wahrscheinlich Dutzende anderer Tests in dieser Datei haben. Ich denke, wenn Sie keinen Zugang zu Unit-Tests haben, nicht sicher sind, warum, dann haben Sie keine andere Wahl, als auszuschließen.
Jsteinmann
5
Da es sich um eine statische Methode handelt (zumindest in PHPUnit 3) und einige Klassen die späte statische Bindung afaik verwenden, sollten Sie static::markTestSkipped('');stattdessen verwenden $this->. In neueren PHP-Versionen wird eine Warnung generiert. Unterschrift: public static function markTestSkipped($message = '')
Daniel W.
Benötigt ein besseres Beispiel für die vollständige Unit-Test-Datei. Nicht nur ein Ausschnitt.
Ligemer
29

Wenn Sie damit umgehen können, die gesamte Datei zu ignorieren, dann

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>
zerkms
quelle
Dies ist, was ich versucht habe, immer noch steht 893 Tests ohne die <exclude>und 893 Tests mit dem<exclude>
Filype
1
Die Tests dauern ungefähr 20 Minuten. Gibt es eine einfache Möglichkeit, um zu sehen, wie viele Tests ausgeführt werden? Derzeit muss ich warten, bis die erste Zeile fertig ist....... 63 / 893 ( 7%)
Filype
4
@Filype: Dann haben Sie wahrscheinlich den falschen Pfad angegeben. Es funktioniert gut für mich. Ich bin mir nicht sicher, ob es möglich ist, die Anzahl der Tests zu ermitteln. PS: Unit-Tests sollten nicht so lange dauern. Ich würde empfehlen, @groupAnnotation und Split-Tests von Natur aus zu verwenden
zerkms
18

Manchmal ist es nützlich, alle Tests aus einer bestimmten Datei zu überspringen, basierend auf benutzerdefinierten Bedingungen, die als PHP-Code definiert sind. Sie können dies einfach mit der setUp-Funktion tun, in der makeTestSkipped auch funktioniert.

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition kann über eine statische Klassenmethode / -eigenschaft, eine in der phpunit-Bootstrap-Datei definierte Konstante oder sogar eine globale Variable übergeben werden.

Konrad Gałęzowski
quelle
Was ist eine ConfigKlasse? Wo platziere ich es?
Cronfy
@cronfy Es kann sich um eine beliebige Klasse handeln, auf die über einen globalen Bereich zugegriffen werden kann (Singleton / Register-Entwurfsmuster), oder sogar um eine globale Variable, die in der Bootstrap-Datei in phpunit festgelegt ist. Grundsätzlich lautet die Logik: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski
Entfernen Sie die Bedingung und Ihre Antwort wäre einfach ... "markTestSkipped innerhalb des Setups, um die gesamte Datei zu überspringen"
SparK
1
@SparK Ich verstehe Ihren Standpunkt, aber ich habe eine Möglichkeit zum bedingten Überspringen der gesamten Testklasse bereitgestellt . Ich habe es ein wenig geändert und meine benutzerdefinierte Vorgehensweise zugunsten der allgemeinen Regel entfernt.
Konrad Gałęzowski