2010-03-17 13 views
10

Quando in PHPUnit il test ha esito negativo, vengono visualizzati i valori effettivi e previsti.
Ma quando passa il test, questa informazione non viene visualizzata.PHPUnit: visualizzazione forzata dei valori asseriti

Come forzare PHPUnit a visualizzare sempre i risultati di asserzione previsti ed effettivi?

+3

L'ovvia domanda ... perché? –

+1

Questa è una richiesta insolita. La maggior parte delle persone non vorrebbe farlo. Per questo motivo, nulla di simile sarebbe implementato da PHPUnit. Dovresti farlo da solo. – ryeguy

+1

Domanda non correlata, ma perché ne hai bisogno? "normalmente", non si dovrebbe produrre output durante i test, perché lo scopo è quello di essere eseguito automaticamente (un essere umano non dovrebbe leggere l'output se tutto è andato bene) –

risposta

3

Poiché è molto probabile che si chiami le affermazioni con $ this-> asser ...(), è possibile sovrascrivere tali metodi nel proprio caso di test. rapido esempio:

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); 
    } 
} 

Naturalmente, tearDownAfterClass() potrebbe non essere sufficiente in ritardo per i vostri gusti. Non è lo stesso di un errore di asserzione.

+0

Sì, ho pensato anche a questo, ma non ho trovato alcun metodo di base per tutte le asserzioni. – takeshin

+0

Oh! Io vedo. Ma mi chiedo: sarebbe (se esistesse) che fosse ragionevole? Asserzioni diverse hanno semantica diversa e diversi parametri. Non tentare di farli bollire tutti su un metodo non diluito (o peggio) sull'efficacia del feedback che si desidera? – pinkgothic

+0

L'unica opzione ragionevole per quello che voglio è un interruttore a linea di comando. E un'implementazione se questo sarebbe un po 'più complicato. – takeshin

11

esecuzione

phpunit --testdox 

mostrerà ogni nome del test. Quindi, come soluzione, potresti incorporare i tuoi risultati attesi e effettivi all'interno del nome del test ... tuttavia è solo una soluzione ...

2

O create your own Assertion class e comportarsi come un proxy per l'effettiva classe di asserzione ed echoing i valori prima di delegare all'asserzione effettiva, ad es

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

o ignorare propria classe di PHPUnit (che credo sarà molto difficile) o semplicemente

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

Questo non è abbastanza neanche, perché sarà rovinare uscita quando si esegue tramite CLI. Se ti capita di utilizzare Zend Studio, vedrai l'output nella scheda Debug Output.

Un altro percorso sarebbe con TestListeners, ma non ne so abbastanza su di loro per dirti qualche dettaglio. Sembra che tu possa partecipare al processo di test.

+0

Per riuscirci, posso semplicemente modificare 'PHPUnit_Assert', ma speravo in qualche switch da riga di comando di avere questa funzione su richiesta ... – takeshin

+0

@takehin che modifica le librerie di base è ** sempre ** una cattiva idea. La prossima volta che aggiorni PHPUnit, tutte le tue mod sono sparite. Ecco perché ho suggerito di estendere o utilizzare un'asserzione personalizzata. – Gordon

+0

Hai ragione Gordon. Ma questa è solo un'idea ipotetica. Non intendo riscrivere PHPUnit né mettere var_dump ovunque, proprio quando voglio vedere il debug per un momento :) – takeshin

0

In realtà, è possibile utilizzare solo il valore del messaggio $ nell'asserzione ??? metodo e mettere quello che vuoi in quel campo. Normalmente lo uso per mostrare quali sono i valori attesi ed effettivi e un nome univoco per l'asserzione (supponendo che ne abbia più di uno in un determinato test).

+0

Questo messaggio verrà mostrato solo se l'asserzione fallisce, comunque. – pinkgothic

0

Un'altra cosa potrebbe essere scrivere il proprio ascoltatore. In questo modo, puoi dare l'output che desideri e lasciare le asserzioni alla phpunit. Questo potrebbe essere il modo più semplice e personalizzabile per farlo credo.

3

Sono venuto a questo post cercando qualcosa di simile. Ho questo TestCase:

/** 
* 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); 
} 

e il mio metodo di numeri è questo:

/** 
* 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; 
} 

Ciò che accade è che si ottiene un output come questo da phpunit:

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')'. 
. 

Non sarà indica il risultato effettivo della funzione testata a meno che il test non abbia esito positivo, ma almeno riesci a visualizzare tutti i valori asseriti.

Problemi correlati