2010-03-17 4 views
10

Wenn in PHPUnit Test werden, tatsächlichen und erwarteten Werte angezeigt ausfällt.
Aber wenn der Test besteht, wird diese Information nicht angezeigt.PHPUnit: Kraftanzeige von geltend gemachten Werte

Wie PHPUnit zu zwingen, immer erwartet und Ergebnis tatsächliche Behauptung angezeigt werden?

+3

Die offensichtliche Frage ... warum? –

+1

Dies ist eine ungewöhnliche Anfrage. Die meisten Leute würden das nicht wollen. Aus diesem Grund würde nichts dergleichen von PHPUnit implementiert werden. Du müsstest es selbst tun. – ryeguy

+1

Unverknüpfte Frage, aber warum brauchen Sie das? "normal", Sie sollten keine Ausgabe während der Tests erzeugen, weil der Zweck automatisch ausgeführt werden soll (ein Mensch sollte die Ausgabe nicht lesen, wenn alles gut gelaufen ist) –

Antwort

3

Da Sie höchstwahrscheinlich die Assertions mit $ this-> assert ...() aufrufen, können Sie diese Methoden in Ihrem Testfall einfach überschreiben. Schnell Beispiel:

class YourTestCase extends PHPUnit_Framework_TestCase { 
    ... 
    static private $messages = array(); 
    ... 
    static public function assertSame($var1, $var2, $message = '') { 
     parent::assertSame($var1, $var2, $message); 
     // assertSame() throws an exception if not true, so the following 
     // won't occur unless the messages actually are the same 
     $success = print_r($var1, true) . ' is the same as ' 
       . print_r($var2, true); 
     self::$messages = array_merge(self::$messages, array($success)); 
    } 

    static public function tearDownAfterClass() { 
     echo implode("\n", self::$messages); 
    } 
} 

Natürlich tearDownAfterClass() möglicherweise nicht für Ihre Bedürfnisse anpassen spät genug sein. Es ist nicht dasselbe wie ein Assertionsfehler.

+0

Ja, ich habe auch darüber nachgedacht, aber ich habe keine Basismethode für alle Behauptungen gefunden. – takeshin

+0

Oh! Aha. Aber ich frage mich: Würde (wenn es existiert) das vernünftig sein? Verschiedene Aussagen haben unterschiedliche Semantiken und verschiedene Parameter. Würden Sie nicht versuchen, alle auf eine Methode zu bringen, um die Effektivität der gewünschten Rückmeldung nicht zu verringern (oder zu verschlechtern)? – pinkgothic

+0

Die einzige sinnvolle Option für was ich will, ist ein Befehlszeilenschalter. Und eine Implementierung, wenn dies ein wenig mehr Aufwand wäre. – takeshin

11

laufen

phpunit --testdox 

jeden Test durch Namen zeigen. Als Workaround könnten Sie also Ihre erwarteten und tatsächlichen Assertionsergebnisse in den Testnamen einbinden ... immer noch nur eine Problemumgehung ...

2

Entweder create your own Assertion class und es verhält sich wie ein Proxy zur tatsächlichen Assertion-Klasse und zum Echo die Werte vor dem Delegieren an die eigentliche Behauptung, z

$this->assertWithLogging('assertion', $expected, $actual, $message); 

oder PHPUnit eigene Klasse überschreiben (was ich denke, wird sehr schwierig sein) oder einfach tun

$this->assertSame($expected, $actual, $message); 
echo "$expected is $actual"; 

, die entweder nicht schön ist, weil es Ausgabe vermasseln wird, wenn sie durch CLI ausgeführt wird. Wenn Sie Zend Studio benutzen, sehen Sie die Ausgabe auf der Registerkarte Debug-Ausgabe.

wäre eine andere Route mit TestListeners sein, aber ich weiß nicht genug über sie Sie Details zu erzählen. Sieht so aus, als könntest du dich in den Testprozess einklinken.

+0

Um dies zu erreichen, kann ich nur 'PHPUnit_Assert' ändern, aber Ich hatte gehofft, dass einige Befehlszeilenschalter diese Funktion bei Bedarf haben ... – takeshin

+0

@takehin modifizieren Kernbibliotheken ist ** immer ** eine schlechte Idee. Das nächste Mal, wenn Sie PHPUnit aktualisieren, sind alle Ihre Mods verschwunden. Deshalb habe ich vorgeschlagen, stattdessen eine benutzerdefinierte Assertion zu erweitern oder zu verwenden. – Gordon

+0

Sie haben Recht Gordon. Aber das ist nur eine hypothetische Idee. Ich habe nicht die Absicht, PHPUnit neu zu schreiben oder var_dumps überall zu setzen, nur wenn ich für einen Moment debuggen will. – takeshin

0

Sie können tatsächlich benutzen Sie einfach den $ message Wert im assert ??? Methode und setze was immer du willst in diesem Bereich. Ich verwende es normalerweise, um zu zeigen, was die erwarteten und tatsächlichen Werte sind, sowie einen eindeutigen Namen für die Behauptung (vorausgesetzt, dass ich mehr als eins in einem gegebenen Test habe).

+0

Diese Nachricht wird nur angezeigt, wenn die Assertion fehlschlägt. – pinkgothic

0

Eine andere Sache ist, deine eigenen Zuhörer zu schreiben. Auf diese Weise können Sie die gewünschte Ausgabe angeben und die Assertions dem phpunit überlassen. Dies könnte der einfachste und anpassungsfähigste Weg sein, um es zu tun, denke ich.

3

kam ich diesen Beitrag zu ähnlich der Suche nach etwas. Ich habe diesen Testfall:

/** 
* test routing logic (numbers method returns an array of numbers and expected outputs to test) 
* @dataProvider numbers 
*/ 
function testRoute($input,$expected) 
{ 
    $route = new Route($input,'',false); 
    $route->route(); 
    $this->assertEquals($expected,$route->routingResult); 
} 

und meine Zahlen Methode ist folgende:

/** 
* read pairs of numbers (input <tab> expected) from tests.input separater by tab 
* return an array like this: array(array(number1,expected1), array(number2,expected2), ...) 
* provide this array to my tests by returning it 
*/ 
function numbers() 
{ 
    $testcases = file('tests.input'); 
    $tests = array(); 
    foreach($testcases as $test_case) 
    { 
     list($input,$output) = explode("\t",$test_case,2); 
     $tests[] = array(trim($input),trim($output)); 
    } 
    return $tests; 
} 

Was passiert, ist, dass Sie eine Ausgabe wie folgt aus phpunit erhalten:

Starting test 'RouteTest::testRoute with data set #0 ('8596000000', 'rejected (dp not found)x')'. 
F 
Starting test 'RouteTest::testRoute with data set #1 ('8596000001', 'rejected (rejected by scheme)')'. 
. 
Starting test 'RouteTest::testRoute with data set #2 ('8596000003', '1599000003')'. 
. 

Es wird nicht sagen Sie das tatsächliche Ergebnis der getesteten Funktion, es sei denn, der Test schlägt fehl, aber Sie können zumindest alle angegebenen Werte sehen.

Verwandte Themen