->assertTrue(false);
->assertTrue(true);
首先断言是失败和执行已停止。但我想继续进一步的代码片段。PHPUnit的 - 断言失败,但我想继续测试
是否有可能在PHPUnit
->assertTrue(false);
->assertTrue(true);
首先断言是失败和执行已停止。但我想继续进一步的代码片段。PHPUnit的 - 断言失败,但我想继续测试
是否有可能在PHPUnit
你可以只保存了对于最终失败,说有
$passing = true;
if (! false) { $passing = false; }
if (! true) { $passing = false; }
$this->assertTrue($passing);
,但我非常不鼓励这种测试形式。我已经写过这样的测试,并且他们指数地失控,更糟的是,你开始因为难以找到的原因而出现奇怪的失败。
此外,比我更聪明的人同意,测试不应该有任何conditionals(if/else,try/catch),因为每个条件都会增加测试的复杂性。如果需要一个条件,也许应该仔细查看测试和SUT或被测系统,以便使其更简单。
更好的方法是将其更改为两个测试,如果它们共享设置的重要部分,则将这两个测试移动到新的测试类中,并在Setup()中执行共享设置方法。
中,这可能会破坏单元测试的重点。您可能希望将其分解为更多的测试方法,而不是采用单片测试方法。
这是一些伪代码,作为一个不好的例子。
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);
}
其他回答者是正确的 - 如果你希望能够做到这一点,你真的应该把你的断言分解成单独的测试。但是,假设您有合理的理由想要这样做...有一种方法。
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)
);
}
}
正如你所看到的,它会尝试两个断言,它们都失败了,但它等待,直到最后抛出的所有故障输出消息作为一个例外。
像OP一样,我需要明显的答案。默认情况下,PHPUnit会在测试失败后继续执行,而不是在单个测试中。 –
@SethBattin所以这就是你需要的? –
是的,谢谢。 –