如何表明 PHPUnit 测试预计会失败?

Posted

技术标签:

【中文标题】如何表明 PHPUnit 测试预计会失败?【英文标题】:How to indicate that a PHPUnit test is expected to fail? 【发布时间】:2011-04-24 11:49:04 【问题描述】:

是否可以使用 phpUnit 将测试标记为“预期失败”?这在执行 TDD 时很有用,并且您想区分真正失败的测试和由于相关代码尚未编写而碰巧失败的测试。

【问题讨论】:

【参考方案1】:

我认为在这些情况下,简单地将测试标记为已跳过是相当标准的。您的测试仍将运行并且套件将通过,但测试运行程序会提醒您跳过的测试。

http://phpunit.de/manual/current/en/incomplete-and-skipped-tests.html

【讨论】:

我想就可以了。我正在寻找类似 Perl 的 Test::More 模块 perldoc.perl.org/Test/More.html#Conditional-tests 中对 TODO 块的支持,它将运行预期会失败的测试,并报告它们是否(意外)成功。 (PHPUnit似乎只能完全跳过。) 我认为 Tom B 下面关于 markTestIncomplete 方法的回答更好 那行不通。一个解决方案应该是将测试标记为 TDD,因此如果测试失败(尚未实现),它会显示 I,最重要的是,如果测试通过,它应该会失败,因为这意味着我们忘记删除 TDD 标记。我不知道如何在 phpunit 中轻松做到这一点【参考方案2】:

如果您希望测试失败但知道它的失败是意料之中的,您可以add a message to the assertion 将在结果中输出:

public function testExpectedToFail()
    
    $this->assertTrue(FALSE, 'I knew this would happen!');

在结果中:

There was 1 failure:

1) testExpectedToFail(ClassTest)
I knew this would happen!

【讨论】:

这会导致套件失败,这似乎不是预期的结果。 问题提到了 TDD,在其中您针对不存在的代码编写失败的测试。 $this->fail('我就知道会这样!');是那个的简写:)。【参考方案3】:

我真的认为这是一个不好的做法,但是你可以这样欺骗 PHPUnit:

/**
 * This test will succeed !!!
 * @expectedException PHPUnit_Framework_ExpectationFailedException
 */
public function testSucceed()

    $this->assertTrue(false);

更干净:

  public function testFailingTest()   
    try   
      $this->assertTrue(false);  
     catch (PHPUnit_Framework_ExpectationFailedException $ex)   
      // As expected the assertion failed, silently return  
      return;  
      
    // The assertion did not fail, make the test fail  
    $this->fail('This test did not fail as expected');  
  

【讨论】:

上面的代码有效,但我必须赶上PHPUnit_Framework_AssertionFailedError,而不是PHPUnit_Framework_ExpectationFailedException 如果您实际测试自己的断言,这是一个很好的做法,例如 testAssertEqual_fail :D 这样您就可以检查您的自定义断言是否按预期失败,但对于一般用途,您做错了什么【参考方案4】:

处理此问题的“正确”方法是使用$this->markTestIncomplete()。这会将测试标记为未完成。它会按过去返回,但会显示提供的消息。请参阅http://www.phpunit.de/manual/3.0/en/incomplete-and-skipped-tests.html 了解更多信息。

【讨论】:

问题是关于 TDD,你在主要代码之前编写(理想情况下是完整的)测试。但是,markTestIncomplete 用于当您有一个“未实现的测试”时(phpunit.de/manual/3.7/en/incomplete-and-skipped-tests.html 首先描述了一个未实现的测试的空测试方法,然后解释了它如何导致错误的成功)。【参考方案5】:

上面 69 的评论对于我正在搜索的内容几乎是完美的。

fail() 方法在您为预期的异常设置测试并且如果它没有触发您希望测试失败的异常时很有用。

$this->object->triggerException();
$this->fail('The above statement was expected to trigger and exception.');

当然 triggerException 会被你的对象中的某些东西所取代。

【讨论】:

【参考方案6】:

在 PHPUnit 8.2.5 中,您可以简单地期待抛出的断言异常:

$this->expectException('PHPUnit\Framework\ExpectationFailedException');
$this->assertTrue(false);

【讨论】:

以上是关于如何表明 PHPUnit 测试预计会失败?的主要内容,如果未能解决你的问题,请参考以下文章

phpstorm laravel单元测试 配置

如何强制 PHPUnit 在跳过的测试中失败?

如何告诉 phpunit 在失败时停止

仅当访问 Laravel 5 中的根页面( visit('/') )时,PHPUnit 测试才会失败

如何在测试过程中停止 PHPUnit 但仍然获得失败/报告列表?

PHPunit - 错误