PHPUnit - 断言失败,但我想继续测试
2022-08-30 23:00:21
->assertTrue(false);
->assertTrue(true);
第一个断言失败,执行已停止。但我想继续进一步的代码片段。
在 PHPUnit 中是否有可能
->assertTrue(false);
->assertTrue(true);
第一个断言失败,执行已停止。但我想继续进一步的代码片段。
在 PHPUnit 中是否有可能
其他回答者是正确的 - 如果你想能够做到这一点,你真的应该把你的断言分成单独的测试。但是,假设您有合法的理由想要这样做...有一种方法。
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)
);
}
}
如您所见,它尝试了两个断言,这两个断言都失败了,但它会等到最后才将所有失败输出消息作为单个异常抛出。
你可以把失败储存起来,比如说
$passing = true;
if (! false) { $passing = false; }
if (! true) { $passing = false; }
$this->assertTrue($passing);
但我非常不鼓励这种形式的测试。我写过这样的测试,它们呈指数级地失控,更糟糕的是,你开始因为难以找到的原因而出现奇怪的失败。
此外,比我更聪明的人同意,测试不应该有任何条件(if/else,try/catch),因为每个条件都会给测试增加显着的复杂性。如果需要条件,也许应该非常仔细地查看测试和SUT或被测系统,以找到使其更简单的方法。
更好的方法是将其更改为两个测试,如果它们共享设置的很大一部分,则将这两个测试移动到新的测试类中,并在 Setup() 方法中执行共享设置。