Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit-断言失败,但我想继续测试_Php_Unit Testing_Phpunit - Fatal编程技术网

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>