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


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.');

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>

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ą.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.