2011-07-26 40 views

回答

7

你可以只保存了对于最终失败,说有

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

,但我非常不鼓励这种测试形式。我已经写过这样的测试,并且他们指数地失控,更糟的是,你开始因为难以找到的原因而出现奇怪的失败。

此外,比我更聪明的人同意,测试不应该有任何conditionals(if/else,try/catch),因为每个条件都会增加测试的复杂性。如果需要一个条件,也许应该仔细查看测试和SUT或被测系统,以便使其更简单。

更好的方法是将其更改为两个测试,如果它们共享设置的重要部分,则将这两个测试移动到新的测试类中,并在Setup()中执行共享设置方法。

7

中,这可能会破坏单元测试的重点。您可能希望将其分解为更多的测试方法,而不是采用单片测试方法。

这是一些伪代码,作为一个不好的例子。

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

MyMethod2 and myResult2 will fail。

这是一个更好的例子。

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

像OP一样,我需要明显的答案。默认情况下,PHPUnit会在测试失败后继续执行,而不是在单个测试中。 –

+0

@SethBattin所以这就是你需要的? –

+0

是的,谢谢。 –

10

其他回答者是正确的 - 如果你希望能够做到这一点,你真的应该把你的断言分解成单独的测试。但是,假设您有合理的理由想要这样做...有一种方法。

Phpunit声明失败实际上是异常,这意味着你可以自己捕捉并抛出它们。例如,你可以做个试验:

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

正如你所看到的,它会尝试两个断言,它们都失败了,但它等待,直到最后抛出的所有故障输出消息作为一个例外。