我们在应用程序中构建测试助手特性,它们大多以一种方便的方式应用断言逻辑。问题是我们可以测试有这些特征的错误,但我们不能假设没有错误并且测试通过了。
我觉得这有点过头了,但我的同事真的很喜欢测试、everything、,甚至是自定义断言。
我查看了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(真)来声明它是正常的。但我们不能断言断言是以任何合理的方式通过的。
发布于 2015-04-16 13:38:07
我将不讨论可能的实现细节,我只想指出,测试测试套件中的断言数量基本上是个坏主意,因为这个值很难维护。假设你有1724个测试。您需要在测试套件中的每个更改中跟踪这个值。这是没有意义的海事组织。
相反,我会使用$this->markTestSkipped()、$this->markTestIncomplete()和朋友来确保一切按预期运行。
发布于 2015-04-16 16:00:52
所以你需要测试单元测试来确保它们真的在测试?但是谁来检查这个二级测试呢?您将需要另一个级别来确保基于断言数量的断言已经完成。等等..。
单元测试不应该被测试,因为它们的实现应该是简单和线性的。缺少的断言可以在代码评审阶段捕捉到。如果您不信任单元测试,您也不信任代码,这是一个更大的问题。
https://stackoverflow.com/questions/29674772
复制相似问题