2010-10-12 3 views
15

Est-il possible de marquer un test comme "attendu à l'échec" avec PHPUnit? Cela serait utile lors de l'exécution de TDD, et vous voulez faire la distinction entre les tests réellement échoués, et les tests qui échouent parce que le code associé n'a pas encore été écrit.Comment indiquer qu'un test PHPUnit échoue?

Répondre

21

Je pense que dans ces cas, il est assez standard pour marquer simplement le test sautée. Vos tests seront toujours exécutés et la suite passera, mais le coureur de test vous alertera des tests sautés.

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

+0

Je suppose que ça va faire. Je cherchais quelque chose comme le support des blocs TODO dans le module Perl's Test :: More http://perldoc.perl.org/Test/More.html#Conditional-tests qui exécutera les tests qui devraient échouer, et signaler s'ils ont réussi (de façon inattendue). (PHPUnit semble être seulement capable de sauter complètement.) – mjs

+1

Je pense que la réponse Tom B ci-dessous sur la méthode markTestIncomplete est mieux –

+1

qui ne fait pas l'affaire. Une solution devrait être de marquer le test comme TDD, donc il affiche 'I' si le test échoue (pas encore implémenté), et surtout, il devrait échouer si le test passe car cela signifie que nous avons oublié d'enlever la marque TDD. Je ne sais pas comment faire le tour facilement dans phpunit – Alcalyn

1

Si vous voulez avoir un échec du test mais sachez que son échec était attendu, vous pouvez add a message to the assertion qui sortira dans les résultats:

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

Dans les résultats:

There was 1 failure: 

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

Cela provoquerait l'échec de la suite, ce qui ne semble pas être le résultat souhaité. –

+1

La question mentionnée TDD, dans laquelle vous écrivez des tests échouant contre le code qui n'existe pas. –

+1

$ this-> fail ('Je savais que cela arriverait!'); est un raccourci pour ça :). –

8

Je pense vraiment que c'est une mauvaise pratique, mais vous pouvez tromper PHPUnit cette façon:

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

Plus proprement:

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

Le code ci-dessus fonctionne, mais je devais attraper 'PHPUnit_Framework_AssertionFailedError', pas' PHPUnit_Framework_ExpectationFailedException' –

+1

c'est une bonne pratique si vous testez réellement une assertion elle-même, par exemple testAssertEqual_fail: D afin que vous puissiez vérifier vos affirmations personnalisées échouent comme prévu, mais pour genral utilisez, vous faites quelque chose de mal – aqm

11

La méthode 'correcte' de la manipulation est d'utiliser $this->markTestIncomplete(). Cela marquera le test comme incomplet. Il reviendra comme passé, mais il affichera le message fourni. Voir http://www.phpunit.de/manual/3.0/en/incomplete-and-skipped-tests.html pour plus d'informations.

+2

La question est sur TDD, où vous écrivez (idéalement complète) des tests avant le code principal. Cependant, 'markTestIncomplete' est pour quand vous avez un « test inappliquées »(http://phpunit.de/manual/3.7/en/incomplete-and-skipped-tests.html commence par la description d'une méthode d'essai pour un test vide inappliquées , explique ensuite comment cela conduit à un faux succès). –

1

Le commentaire par soixante-neuf ci-dessus est presque parfait pour ce que je cherchais. méthode

fail() est utile lorsque vous définissez un test pour une exception prévue et si elle n'a pas déclenché l'exception que vous voulez que l'échec du test.

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

Bien sûr, l'exception triggerException est remplacée par quelque chose dans votre objet.

Questions connexes