你怎么能断言一个断言已经完成

How can you assert an assertion was done

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

我觉得这有点过分了,但我的同事真的很想测试所有东西,甚至是自定义断言。

我查看了 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) 声明它没问题。但是我们不能断言断言以任何合理的方式通过了。

我不会深入探讨可能的实现细节,我只是想指出,测试测试套件中做出的断言数量基本上是个坏主意,因为这个值真的很难维护。假设您有 1724 个测试。您需要在测试套件中的每个更改中跟踪此值。这在我看来没有意义。

相反,我会使用 $this->markTestSkipped()$this->markTestIncomplete() 和朋友来确保一切按预期运行。

所以您需要测试单元测试以确保它们确实在测试?但是谁来检查这个 2 级测试呢?您将需要另一个级别来确保根据断言的数量做出断言。等等...

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