PHPUnit-断言失败,但我想继续测试
第一个断言失败,执行停止。但我想继续进一步的代码片段PHPUnit-断言失败,但我想继续测试,php,unit-testing,phpunit,Php,Unit Testing,Phpunit,第一个断言失败,执行停止。但我想继续进一步的代码片段 在PHPUnit中是否有可能违反单元测试的要点。您可能希望将其分解为更多的测试方法,而不是单一的测试方法 下面是一些伪代码,作为一个糟糕的示例 ->assertTrue(false); ->assertTrue(true); MyMethod2和myResult2将失败 这里有一个更好的例子 MyBadTestMethod() { someResult = MyMethod(); assertIsCorrect(so
在PHPUnit中是否有可能违反单元测试的要点。您可能希望将其分解为更多的测试方法,而不是单一的测试方法 下面是一些伪代码,作为一个糟糕的示例
->assertTrue(false);
->assertTrue(true);
MyMethod2
和myResult2
将失败
这里有一个更好的例子
MyBadTestMethod()
{
someResult = MyMethod();
assertIsCorrect(someResult);
myResult2 = MyMethod2(someResult);
assertIsCorrect(myResult2);
}
你可以把失败储存起来,比如说
MyTestMethod1()
{
someResult = MyMethod();
assertIsCorrect(someResult);
}
MyTestMethod2()
{
myResult2 = MyMethod2(someCorrectResult);
assertIsCorrect(myResult2);
}
但我强烈反对这种形式的测试。我写过这样的测试,它们以指数级的速度失控,更糟糕的是,你开始因为难以找到的原因而出现奇怪的失败
此外,比我聪明的人都同意,测试不应该有任何条件(if/else,try/catch),因为每个条件都会给测试增加显著的复杂性。如果需要一个条件,可能测试和SUT,或者被测试的系统,都应该非常仔细地研究,以寻找使其更简单的方法
更好的方法是将其更改为两个测试,如果它们共享设置的很大一部分,则将这两个测试移动到一个新的测试类中,并在setup()方法中执行共享设置。其他回答者是正确的-您确实应该将您的断言分离到单独的测试中,如果你想做到这一点。然而,假设你有合法的理由想这么做。。。有办法 Phpunit断言失败实际上是异常,这意味着您可以自己捕获并抛出它们。例如,尝试以下测试:
$passing = true;
if (! false) { $passing = false; }
if (! true) { $passing = false; }
$this->assertTrue($passing);
如您所见,它尝试了两个断言,两个断言都失败了,但它会等到最后将所有失败输出消息作为一个异常抛出。我迟到了,但我建议使用测试套件的配置文件来轻松实现这一点 您可以从运行phpunit测试的位置创建
phpunit.xml
文件。因此,phpunit将运行此处列出的所需测试
塞巴斯蒂安·伯格曼的PHPUnit 3.7.38
从/path/phpunit.xml读取配置
在该文件中,您可以指定不希望在出现故障时停止
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)
);
}
}
tests/ClassTest.php
希望这能有所帮助。像OP一样,我需要一个显而易见的答案。默认情况下,PHPUnit在测试失败后继续,只是不在单个测试中。@SethBattin所以这就是您所需要的?这似乎只适用于整个测试套件。从文档中:此属性配置在第一次测试完成且状态为“失败”后是否应停止测试套件的执行
<phpunit bootstrap="vendor/autoload.php" stopOnFailure="false">
<testsuites>
<testsuite name="Test">
<file>tests/ClassTest.php</file>
</testsuite>
</testsuites>
</phpunit>