你如何断言断言已经完成

时间:2015-04-16 12:29:45

标签: php phpunit

我们在应用程序中构建测试助手特征,它们主要以方便的方式应用断言逻辑。问题是我们可以测试这些特征是否存在错误,但我们不能假设没有错误并且测试已通过。

我发现这有点落伍,但我的同事真的要测试一切甚至自定义断言。

我查看了PHPUnit代码,以确保没有关于此的未记录的功能,例如getAssertionCount(),并且发现实际上存在此功能:

TestCase::getNumAssertions()

但它似乎没有更新,始终为零。

那你如何判断断言是否已经完成?


以下是我正在运行的测试示例:

/**
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::assertHasConstraintViolation
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::assertNotHasConstraintViolation
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::getViolations
 */
public function testAssertConstraintViolations()
{
    $o = new EntityWithValidators();
    $this->assertHasConstraintViolation($o, 'property', null);
    $this->assertNotHasConstraintViolation($o, 'property', 'valid value');
}

现在这段代码真的运行“assertHasContraintViolation”,但我们无法测试断言是否运行。如果断言失败,我抓住了它,如:

/**
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::assertHasConstraintViolation
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::assertNotHasConstraintViolation
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::getViolations
 * @expectedException PHPUnit_Framework_ExpectationFailedException
 */
public function testAssertHasConstraintViolationsAssertionFailsCorrectly()
{
    $o = new EntityWithValidators();
    $this->assertHasConstraintViolation($o, 'property', 'valid value');
}

/**
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::assertHasConstraintViolation
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::assertNotHasConstraintViolation
 * @covers UgroupMedia\CommonBundle\TestHelper\ModelTestTrait::getViolations
 * @expectedException PHPUnit_Framework_ExpectationFailedException
 */
public function testAssertNotHasConstraintViolationsAssertionFailsCorrectly()
{
    $o = new EntityWithValidators();
    $this->assertNotHasConstraintViolation($o, 'property', null);
}

然后这实际上验证了断言以负面方式完成了它所需要的东西。我们捕获错误和assertTrue(true)来声明它没问题。但我们不能断言断言是以任何合理的方式传递的。

2 个答案:

答案 0 :(得分:3)

所以你需要测试单元测试以确保它们实际上是在测试吗?但谁检查这个2级测试?您需要另一个级别来确保基于断言数量的断言。等等...

单元测试不需要测试,因为它们的实现应该简单和线性。在代码审查阶段可以捕获缺失的断言。如果你不相信单元测试,你也不相信代码,这是一个更大的问题。

答案 1 :(得分:2)

我不会讨论可能的实现细节,我只是想指出,测试在测试套件中进行的断言数基本上是一个坏主意,因为这个值真的很难维护。让我们说你有1724个测试。您需要在测试套件中的每个更改中跟踪此值。这没有意义imo。

相反,我会使用$this->markTestSkipped()$this->markTestIncomplete()和朋友来确保所有内容都按预期运行。