2010-10-12 8 views
15

Kann ein Test mit PHPUnit als "erwartet ausfallen" markiert werden? Dies ist nützlich, wenn TDD ausgeführt wird, und Sie möchten zwischen wirklich fehlgeschlagenen Tests und fehlgeschlagenen Tests unterscheiden, da der zugehörige Code noch nicht geschrieben wurde.Wie wird angezeigt, dass ein PHPUnit-Test fehlschlägt?

Antwort

21

Ich denke in diesen Fällen ist es ziemlich Standard, den Test einfach als übersprungen markieren. Ihre Tests werden weiterhin ausgeführt und die Suite wird bestehen, aber der Test-Runner wird Sie über die übersprungenen Tests informieren.

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

+0

Ich denke, dass das tun wird. Ich suchte nach etwas wie der Unterstützung für TODO-Blöcke in Perl's Test :: More Modul http://perldoc.perl.org/Test/More.html#Conditional-tests, die die Tests, die voraussichtlich fehlschlagen werden, ausführen und melden wenn sie (unerwartet) erfolgreich waren. (PHPUnit scheint nur in der Lage zu sein, vollständig zu überspringen.) – mjs

+1

Ich denke, dass Tom B unten antworten über markTestIncomplete-Methode ist besser –

+1

Das tut nicht den Trick. Eine Lösung sollte sein, den Test als TDD zu markieren, so dass "I" angezeigt wird, wenn der Test fehlschlägt (noch nicht implementiert), und am wichtigsten ist, dass er fehlschlägt, wenn der Test bestanden hat, weil wir vergessen haben, die TDD-Markierung zu entfernen. Ich weiß nicht, wie man den Trick in phpunit leicht tut – Alcalyn

1

Wenn Sie einen Test haben scheitern aber wissen, dass ihr Versagen zu erwarten war, kann man add a message to the assertion, dass folgende Ausgabe in den Ergebnissen:

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

In den Ergebnissen:

There was 1 failure: 

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

Dies würde dazu führen, dass die Suite fehlschlägt, was nicht das gewünschte Ergebnis zu sein scheint. –

+1

Die Frage erwähnt TDD, in der Sie fehlgeschlagene Tests gegen Code schreiben, der nicht existiert. –

+1

$ this-> fail ('Ich wusste, dass das passieren würde!'); ist eine Abkürzung dafür :). –

8

Ich denke wirklich, es ist eine schlechte Praxis, aber Sie können PHPUnit auf diese Weise Trick:

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

saubere:

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

Der Code oben funktioniert, aber ich musste fangen 'PHPUnit_Framework_AssertionFailedError', nicht' PHPUnit_Framework_ExpectationFailedException' –

+1

es ist gute Praxis, wenn Sie tatsächlich testen eine Behauptung es selbst ist, zB testAssertEqual_fail: D so können Sie überprüfen, Ihre benutzerdefinierten Behauptungen wie erwartet fehlschlagen, aber für general Verwenden Sie, Sie tun etwas falsch – aqm

11

Die 'richtige' Methode des Umgangs mit dieser ist $this->markTestIncomplete() zu verwenden. Dies markiert den Test als unvollständig. Es wird zurückkommen wie übergeben, aber es wird die Nachricht angezeigt. Weitere Informationen finden Sie unter http://www.phpunit.de/manual/3.0/en/incomplete-and-skipped-tests.html.

+2

Die Frage ist über TDD, wo Sie schreiben (idealerweise abgeschlossen) Tests vor dem Hauptcode. "MarkTestIncomplete" ist jedoch für einen "nicht implementierten Test" gedacht (http://phpunit.de/manual/3.7/de/incomplete-and- skipped-tests.html beginnt mit der Beschreibung einer leeren Testmethode für einen nicht implementierten Test , erklärt dann, wie das zu einem falschen Erfolg führt). –

1

Der Kommentar von neunundsechzig oben ist fast perfekt für das, was ich suchte.

Die fail() -Methode ist nützlich, wenn Sie einen Test für eine erwartete Ausnahme festlegen und die Ausnahme nicht auslösen, die der Test fehlschlagen soll.

Natürlich wird die triggerException durch etwas in Ihrem Objekt ersetzt.

Verwandte Themen