Come saltare i test in PHPunit?


88

Sto usando phpunit in connessione con jenkins e voglio saltare alcuni test impostando la configurazione nel file XML phpunit.xml

So che posso usare sulla riga di comando:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

come lo traduco nel file XML poiché il <filters>tag è solo per la copertura del codice?

Vorrei eseguire tutti i test a parte testStuffThatAlwaysBreaks


1
KO: che ne dici di riparare il test? a proposito, ciao da Welly ;-)
zerkms

Non ho scritto i test, è qualcosa di irrilevante e inoltre non voglio modificare i file core
Filype

Dubito che tu possa farlo. È un requisito molto strano
zerkms

PS: hai menzionato i filtri, ma non ti è stato di aiuto, perché esclude tutto il percorso. Altrimenti <exclude>- farebbe il lavoro per te
zerkms

potete postare il file phpunit.xml.dist proposto?
Filype

Risposte:


167

Il modo più semplice e veloce per saltare i test che sono interrotti o su cui è necessario continuare a lavorare in un secondo momento è semplicemente aggiungere quanto segue all'inizio del test individuale dell'unità:

$this->markTestSkipped('must be revisited.');

puoi sempre aggiungere directory o test al file di configurazione xml, tuttavia, se questo è un controller o simile non è davvero molto pratico perché probabilmente hai dozzine di altri test in quel file. Immagino che se non hai accesso agli unit test, non sono sicuro di aver capito perché, allora non hai altra scelta che escludere.
jsteinmann

5
Poiché è un metodo statico (almeno in PHPUnit 3) e alcune classi usano afaik di binding statico tardivo, dovresti usare static::markTestSkipped('');invece di $this->. Genererà un avviso nelle nuove versioni di PHP. Firma: public static function markTestSkipped($message = '')
Daniel W.

Ha bisogno di un esempio migliore del file di unit test completo. Non solo uno snippet.
Ligemer

@DanielW. il manuale ufficiale di phpunit ha esempi che mostrano$this->markTestSkipped()
nulll

@nulll che puoi vedere nel codice sorgente di 6.5 , markTestSkipped()è ancora un metodo statico.
Daniel W.

30

Se riesci a ignorare l'intero file, allora

<?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>

Questo è quello che ho provato, ancora dice 893 test senza <exclude>e 893 test con<exclude>
Filype

1
I test richiedono circa 20 minuti per essere eseguiti, esiste un modo semplice per vedere quanti test verranno eseguiti? attualmente, devo aspettare fino al completamento della prima riga....... 63 / 893 ( 7%)
Filype

5
@Filype: allora probabilmente hai specificato il percorso sbagliato. Funziona bene per me. Non sono sicuro che sia possibile ottenere il conteggio dei test. PS: i test unitari non dovrebbero essere eseguiti così a lungo. Consiglierei di utilizzare @groupannotazioni e split test per loro natura
zerkms

20

A volte è utile saltare tutti i test da un file particolare in base a condizioni personalizzate definite come codice php. Puoi farlo facilmente usando la funzione setUp in cui funziona anche makeTestSkipped.

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

your_custom_condition può essere passato tramite un metodo / proprietà di classe statica, una costante definita nel file bootstrap phpunit o anche una variabile globale.


Cos'è una Configclasse? Dove lo metto?
cronfy

@cronfy può essere qualsiasi classe accessibile con ambito globale (Singleton / Register design pattern) o anche variabile globale impostata nel file bootstrap in phpunit. Fondamentalmente la logica è: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski

rimuovi il condizionale e la tua risposta sarebbe semplice ... "markTestSkipped all'interno del setup per saltare l'intero file"
SparK

1
@SparK Capisco il tuo punto, ma stavo fornendo un modo per saltare condizionale dell'intera classe di test. L'ho cambiato un po ', rimuovendo il mio modo personalizzato di farlo a favore della regola generale.
Konrad Gałęzowski
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.