你怎么能断言一个断言已经完成
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 级测试呢?您将需要另一个级别来确保根据断言的数量做出断言。等等...
不需要测试单元测试,因为它们的实现应该是简单和线性的。并且可以在代码审查阶段发现缺失的断言。如果你不相信单元测试,你也不相信代码,这是一个更大的问题。
我们在我们的应用程序中构建测试助手特征,它们主要以方便的方式应用断言逻辑。问题是我们可以测试这些特征是否存在错误,但我们不能假设没有错误并且测试通过。
我觉得这有点过分了,但我的同事真的很想测试所有东西,甚至是自定义断言。
我查看了 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 级测试呢?您将需要另一个级别来确保根据断言的数量做出断言。等等...
不需要测试单元测试,因为它们的实现应该是简单和线性的。并且可以在代码审查阶段发现缺失的断言。如果你不相信单元测试,你也不相信代码,这是一个更大的问题。