2011-07-26 9 views

Respuesta

7

Se podía almacenar hasta los fracasos para el final, dice con una

$passing = true; 
if (! false) { $passing = false; } 
if (! true) { $passing = false; } 
$this->assertTrue($passing); 

pero altamente desalentar este tipo de pruebas. He escrito pruebas como esta, y de forma exponencial se salen de control, y lo que es peor, comienzas a tener extraños errores por razones difíciles de encontrar.

Además, las personas más inteligentes que yo estoy de acuerdo, las pruebas no deben tener ningún conditionals (if/else, try/catch), porque cada condicional agrega una complejidad significativa a la prueba. Si se necesita un condicional, tal vez tanto la prueba como el SUT o el sistema bajo prueba se deben analizar con mucho cuidado para encontrar maneras de hacerlo más simple.

Una forma mucho mejor sería cambiarla para que sea dos pruebas, y si comparten una parte importante de la configuración, mueva esas dos pruebas a una nueva clase de prueba, con la configuración compartida realizada en la Configuración() método.

7

que vence a la punta de una unidad de prueba. Es posible que desee dividirlo en algunos otros métodos de prueba en lugar de tener un método de prueba monolítico.

Aquí hay un pseudo-código, como un mal ejemplo.

MyBadTestMethod() 
{ 
    someResult = MyMethod(); 
    assertIsCorrect(someResult); 
    myResult2 = MyMethod2(someResult); 
    assertIsCorrect(myResult2); 
} 

MyMethod2 y myResult2 se producirá un error.

Aquí hay un mejor ejemplo.

MyTestMethod1() 
{ 
    someResult = MyMethod(); 
    assertIsCorrect(someResult); 
} 
MyTestMethod2() 
{ 
    myResult2 = MyMethod2(someCorrectResult); 
    assertIsCorrect(myResult2); 
} 
+0

Al igual que el OP, necesitaba la respuesta obvia. PHPUnit continúa después de una prueba fallida por defecto, simplemente no dentro de una sola prueba. –

+0

@SethBattin, así que esto es lo que necesitabas? –

+0

Es, gracias. –

10

Los otros que responden son correctos: en realidad debería separar sus afirmaciones en pruebas separadas, si desea poder hacer esto. Sin embargo, suponiendo que tenga una razón legítima para querer hacer esto ... hay una manera.

Las fallas de afirmación de Phpunit son en realidad excepciones, lo que significa que puede atraparlas y tirarlas usted mismo. Por ejemplo, haga esta prueba:

public function testDemo() 
{ 
    $failures = []; 
    try { 
     $this->assertTrue(false); 
    } catch(PHPUnit_Framework_ExpectationFailedException $e) { 
     $failures[] = $e->getMessage(); 
    } 
    try { 
     $this->assertTrue(false); 
    } catch(PHPUnit_Framework_ExpectationFailedException $e) { 
     $failures[] = $e->getMessage(); 
    } 
    if(!empty($failures)) 
    { 
     throw new PHPUnit_Framework_ExpectationFailedException (
      count($failures)." assertions failed:\n\t".implode("\n\t", $failures) 
     ); 
    } 
} 

Como se puede ver, se trata de dos afirmaciones, las cuales fallan, pero se espera hasta el final de tirar todos los mensajes de salida fracaso como una sola excepción.

Cuestiones relacionadas