2010-03-17 9 views
10

Cuando en la prueba PHPUnit falla, se muestran los valores reales y esperados.
Pero cuando se aprueba la prueba, esta información no se muestra.PHPUnit: fuerza de visualización de valores afirmados

¿Cómo forzar a PHPUnit a mostrar siempre el resultado de aserción esperado y real?

+3

La pregunta obvia ... ¿por qué? –

+1

Esta es una solicitud inusual. La mayoría de la gente no querría hacer esto. Por esta razón, nada como esto sería implementado por PHPUnit. Tendría que hacerlo usted mismo. – ryeguy

+1

Pregunta no relacionada, pero ¿por qué la necesitas? "normalmente", no se supone que produzcas resultados durante las pruebas, porque el objetivo es que se ejecute automáticamente (no se supone que un humano lea la salida si todo salió bien) –

Respuesta

3

Como lo más probable es que llame a las aserciones con $ this-> assert ...(), puede sobrescribir esos métodos en su caso de prueba. Ejemplo rápido:

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

Por supuesto, tearDownAfterClass() puede no ser lo suficientemente tarde como para su gusto. No es lo mismo que una falla de afirmación.

+0

Sí, también he pensado en esto, pero no he encontrado ningún método base para todas las afirmaciones. – takeshin

+0

¡Oh! Ya veo. Pero me pregunto: ¿sería (si existiera) lo sensato? Las diferentes aserciones tienen diferentes semánticas y diferentes parámetros. ¿No tratar de reducirlos a un método no diluye (o empeora) la efectividad de los comentarios que desea? – pinkgothic

+0

La única opción sensata para lo que quiero es un cambio de línea de comando. Y una implementación si esto sería un poco más complicado. – takeshin

11

corriendo

phpunit --testdox 

mostrará el nombre de cada prueba. Entonces, como solución alternativa, podría incorporar los resultados de aserción esperados y reales dentro del nombre de la prueba ... aún así es solo una solución ...

2

O bien create your own Assertion class y que se comporte como un proxy para la clase de afirmación real y para hacer eco los valores antes de delegar a la aserción real, por ejemplo

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

o anular propia clase de PHPUnit (que creo que va a ser muy complicado) o simplemente

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

Eso no es bastante bien, porque va a meter la pata de salida cuando se ejecuta a través de CLI. Si usa Zend Studio, verá el resultado en la pestaña de salida de depuración.

Otra ruta sería con TestListeners, pero no sé lo suficiente sobre ellos para informarle de cualquier detalle. Parece que puedes conectarte al proceso de prueba.

+0

Para lograr esto, puedo simplemente modificar 'PHPUnit_Assert', pero Esperaba que algún modificador de línea de comando tuviera esta función bajo demanda ... – takeshin

+0

@takehin se está modificando las bibliotecas centrales ** siempre ** una mala idea. La próxima vez que actualice PHPUnit, todas sus modificaciones desaparecerán. Es por eso que sugerí extender o usar una afirmación personalizada en su lugar. – Gordon

+0

Tienes razón Gordon. Pero eso es solo una idea hipotética. No pretendo reescribir PHPUnit ni poner var_dumps en todas partes, justo cuando quiero ver depuración por un momento :) – takeshin

0

¿En realidad puede simplemente usar el valor de $ mensaje en la declaración ??? método y poner lo que quieras en ese campo. Normalmente lo uso para mostrar cuáles son los valores esperados y reales, así como un nombre único para la afirmación (suponiendo que tengo más de uno en una prueba determinada).

+0

Ese mensaje solo se mostrará si la afirmación falla. – pinkgothic

0

Otra cosa podría ser escribir su propio Oyente. De esta manera, puede dar el resultado que desea y dejar las afirmaciones a la phpunit. Esta podría ser la forma más fácil y personalizable de hacerlo, supongo.

3

Vine a este post en busca de algo similar. tengo este caso de prueba:

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

y mi método de números es la siguiente:

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

Lo que sucede es que se consigue una salida como esta de 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')'. 
. 

No lo hará te diga el resultado real de la función probada a menos que la prueba falle pero al menos puedas ver todos los valores afirmados.

Cuestiones relacionadas