Jak pominąć testy w PHPunit?

88

Używam phpunita w połączeniu z jenkinsem i chcę pominąć niektóre testy, ustawiając konfigurację w pliku XML phpunit.xml

Wiem, że mogę użyć w linii poleceń:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

jak przetłumaczyć to na plik XML, skoro <filters>tag służy tylko do pokrycia kodu?

Chciałbym przeprowadzić wszystkie testy oprócz testStuffThatAlwaysBreaks

Typ pliku
źródło
1
OK: a co z naprawieniem testu? btw, cześć z welly ;-)
zerkms
Nie pisałem testów, to coś nieistotnego, a także nie chcę zmieniać podstawowych plików
Filype
Niewątpliwie możesz to zrobić. To bardzo dziwny wymóg
zerkms
PS: wspomniałeś o filtrach - ale to nie pomogło, bo wyklucza całą ścieżkę. W przeciwnym razie <exclude>-
wykonałby
czy możesz opublikować proponowany plik phpunit.xml.dist?
Filype

Odpowiedzi:

168

Najszybszym i najłatwiejszym sposobem pominięcia testów, które są uszkodzone lub musisz kontynuować pracę później, jest po prostu dodanie następujących elementów na początku indywidualnego testu jednostkowego:

$this->markTestSkipped('must be revisited.');
jsteinmann
źródło
zawsze możesz dodać katalogi lub testy do pliku konfiguracyjnego xml, jednak jeśli jest to kontroler lub podobny, nie jest to zbyt praktyczne, ponieważ prawdopodobnie masz dziesiątki innych testów w tym pliku. Myślę, że jeśli nie masz dostępu do testów jednostkowych, nie jestem pewien, czy rozumiem dlaczego, nie masz innego wyjścia, jak tylko wykluczyć.
jsteinmann
5
Ponieważ jest to metoda statyczna (przynajmniej w PHPUnit 3), a niektóre klasy używają późnego statycznego wiązania afaik, powinieneś użyć static::markTestSkipped('');zamiast $this->. W nowszych wersjach PHP wygeneruje ostrzeżenie. Podpis: public static function markTestSkipped($message = '')
Daniel W.
Potrzebuje lepszego przykładu pełnego pliku testu jednostkowego. Nie tylko fragment.
Ligemer
@DanielW. oficjalny podręcznik phpunit zawiera przykłady pokazujące$this->markTestSkipped()
nulll
@nulll, który można zobaczyć w kodzie źródłowym 6.5 , markTestSkipped()jest nadal metodą statyczną.
Daniel W.
30

Jeśli możesz sobie poradzić z ignorowaniem całego pliku to

<?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
źródło
To jest to, czego próbowałem, wciąż jest napisane, że 893 testy bez <exclude>i 893 testy z<exclude>
Filype
1
Testy trwają około 20 minut, czy istnieje łatwy sposób sprawdzenia, ile testów zostanie przeprowadzonych? obecnie muszę poczekać, aż pierwszy wiersz zostanie ukończony....... 63 / 893 ( 7%)
Filype
5
@Filype: prawdopodobnie podałeś niewłaściwą ścieżkę. To działa dobrze dla mnie. Nie jestem pewien, czy możliwe jest uzyskanie liczby testów. PS: testy jednostkowe nie powinny trwać tak długo. Polecam używanie @groupadnotacji i testów dzielonych ze swej natury
zerkms
20

Czasami przydatne jest pominięcie wszystkich testów z określonego pliku w oparciu o niestandardowe warunki zdefiniowane jako kod php. Możesz to łatwo zrobić za pomocą funkcji setUp, w której działa również makeTestSkipped.

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

your_custom_condition może być przekazane przez jakąś statyczną metodę / właściwość klasy, stałą zdefiniowaną w pliku bootstrap phpunita lub nawet zmienną globalną.

Konrad Gałęzowski
źródło
Co to jest Configklasa? Gdzie to umieścić?
cronfy
@cronfy może to być dowolna klasa dostępna w zakresie globalnym (wzorzec projektowy Singleton / Register) lub nawet zmienna globalna ustawiona w pliku bootstrap w phpunicie. Zasadniczo logika jest następująca: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski
usuń warunek, a twoja odpowiedź byłaby prosta ... "markTestSkipped wewnątrz konfiguracji, aby pominąć cały plik"
SparK
1
@SparK Widzę twój punkt widzenia, ale przedstawiłem sposób warunkowego pomijania całej klasy testowej. Zmieniłem to trochę, usuwając mój zwyczajowy sposób robienia tego na rzecz ogólnej zasady.
Konrad Gałęzowski