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

如何表明PHPUnit测试预计会失败?,php,unit-testing,tdd,phpunit,Php,Unit Testing,Tdd,Phpunit,是否可以用PHPUnit将测试标记为“预期失败”?这在执行TDD时非常有用,您希望区分真正失败的测试和由于相关代码尚未编写而碰巧失败的测试。我认为在这些情况下,简单地将测试标记为跳过是相当标准的。您的测试仍将运行,套件将通过,但测试运行程序将提醒您跳过的测试 如果您想让测试失败,但知道它的失败是预期的,您可以在结果中输出: public function testExpectedToFail() { $this->assertTrue(FALSE, 'I knew this

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

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


如果您想让测试失败,但知道它的失败是预期的,您可以在结果中输出:

public function testExpectedToFail()
{    
    $this->assertTrue(FALSE, 'I knew this would happen!');
}
在结果中:

There was 1 failure:

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

我真的认为这是一种不好的做法,但是你可以这样欺骗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');  
  }

处理此问题的“正确”方法是使用
$this->markTestIncomplete()
。这会将测试标记为未完成。它将返回为已通过,但它将显示提供的消息。有关更多信息,请参阅。

以上69人的评论几乎完全符合我所搜索的内容

fail()方法在为预期异常设置测试时非常有用,如果它没有触发异常,则希望测试失败

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

当然,triggerException会被对象中的某个内容替换。

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

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

这将导致套件失败,这似乎不是期望的结果。问题提到了TDD,在TDD中,您可以针对不存在的代码编写失败的测试。$This->fail('我知道会发生这种情况!');是那个的简写:)。我想那就行了。我在Perl的Test::More模块中寻找对TODO块的支持,该模块将运行预期失败的测试,并报告(意外)成功的测试。(PHPUnit似乎只能完全跳过。)我认为下面关于markTestIncomplete方法的Tom B答案更好,但这不会起作用。解决方案应该是将测试标记为TDD,因此如果测试失败(尚未实现),它将显示
I
,最重要的是,如果测试通过,它将失败,因为这意味着我们忘记删除TDD标记。我不知道如何在PHPUnit中轻松实现这一技巧上面的代码是有效的,但我必须捕获
PHPUnit\u框架\u断言失败错误
,而不是
PHPUnit\u框架\u预期失败异常
如果您实际测试的是一个断言本身,这是一个很好的实践,例如testAssertEqual_fail:D所以你可以检查你的自定义断言是否如预期的那样失败,但是对于一般的使用,你做错了什么。问题是关于TDD,你在主代码之前编写(理想情况下完成)测试。但是,
markTestIncomplete
用于“未实现的测试”(首先描述未实现测试的空测试方法,然后解释如何导致错误成功)。