2010-10-12 8 views
15

È possibile contrassegnare un test come "previsto per non riuscire" con PHPUnit? Ciò sarebbe utile quando si esegue TDD e si desidera distinguere tra test effettivamente falliti e test che si verificano falliti perché il codice associato non è ancora stato scritto.Come indicare che un test PHPUnit dovrebbe fallire?

risposta

21

Penso che in questi casi, è abbastanza normale contrassegnare semplicemente il test come saltato. I test continueranno a essere eseguiti e la suite passerà, ma il test runner ti avviserà dei test saltati.

http://phpunit.de/manual/current/en/incomplete-and-skipped-tests.html

+0

Credo che lo farò. Stavo cercando qualcosa di simile al supporto per i blocchi TODO in Perl's Test :: Più modulo http://perldoc.perl.org/Test/More.html#Conditional-tests che eseguirà i test che si prevede che falliscano e segnalerà se loro (inaspettatamente) ci sono riusciti. (PHPUnit sembra essere in grado di saltare completamente.) – mjs

+1

Penso che Tom B risponda sotto al metodo markTestIncomplete sia migliore –

+1

Questo non fa il trucco. Una soluzione dovrebbe essere quella di contrassegnare il test come TDD, quindi visualizza 'I' se il test fallisce (come non ancora implementato) e, cosa più importante, dovrebbe fallire se il test passa perché significa che abbiamo dimenticato di rimuovere il marchio TDD. Non so come fare il trucco facilmente in phpunit – Alcalyn

1

Se si vuole avere una prova di fallire, ma sappiamo che il suo fallimento è stato previsto, è possibile add a message to the assertion che sarà in uscita nei risultati:

public function testExpectedToFail() 
{  
    $this->assertTrue(FALSE, 'I knew this would happen!'); 
} 

Nei risultati:

There was 1 failure: 

1) testExpectedToFail(ClassTest) 
I knew this would happen! 
+1

Questo potrebbe causare il fallimento della suite, che non sembra essere il risultato desiderato. –

+1

La domanda menzionata TDD, in cui si scrivono test di errore contro il codice che non esiste. –

+1

$ this-> fail ('Sapevo che sarebbe successo!'); è una scorciatoia per quello :) –

8

Penso davvero che sia una cattiva pratica, tuttavia puoi ingannare PHPUnit in questo modo:

/** 
* This test will succeed !!! 
* @expectedException PHPUnit_Framework_ExpectationFailedException 
*/ 
public function testSucceed() 
{ 
    $this->assertTrue(false); 
} 

più pulito:

public function testFailingTest() { 
    try { 
     $this->assertTrue(false); 
    } catch (PHPUnit_Framework_ExpectationFailedException $ex) { 
     // As expected the assertion failed, silently return 
     return; 
    } 
    // The assertion did not fail, make the test fail 
    $this->fail('This test did not fail as expected'); 
    } 
+0

Il codice sopra funziona, ma dovevo prendere 'PHPUnit_Framework_AssertionFailedError', non' PHPUnit_Framework_ExpectationFailedException' –

+1

è una buona pratica se in realtà stai testando un'affermazione come self, ad esempio testAssertEqual_fail: D così puoi controllare che le tue asserzioni personalizzate falliscano come previsto, ma per genral usa, stai facendo qualcosa di sbagliato – aqm

11

Procedimento 'corretta' di manipolazione di questo è quello di utilizzare $this->markTestIncomplete(). Questo segnerà il test come incompleto. Tornerà come passato, ma mostrerà il messaggio fornito. Vedere http://www.phpunit.de/manual/3.0/en/incomplete-and-skipped-tests.html per ulteriori informazioni.

+2

La domanda riguarda TDD, dove scrivi (idealmente completi) i test prima del codice principale. Tuttavia, 'markTestIncomplete' è per quando si ha un" test non implementato "(http://phpunit.de/manual/3.7/en/incomplete-and-skipped-tests.html inizia descrivendo un metodo di test vuoto per un test non implementato , quindi spiega come ciò porti ad un falso successo). –

1

Il commento del sessantanove sopra è quasi perfetto per quello che stavo cercando.

Il metodo fail() è utile quando si imposta un test per un'eccezione prevista e se non ha attivato l'eccezione si desidera che il test abbia esito negativo.

$this->object->triggerException(); 
$this->fail('The above statement was expected to trigger and exception.'); 

Ovviamente il triggerException viene sostituito da qualcosa nel proprio oggetto.

Problemi correlati