首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何断言断言已完成

如何断言断言已完成
EN

Stack Overflow用户
提问于 2015-04-16 12:29:44
回答 2查看 240关注 0票数 1

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

我觉得这有点过头了,但我的同事真的很喜欢测试、everything、,甚至是自定义断言。

我查看了PHPUnit代码,以确保没有关于getAssertionCount()这样的无文档化的特性,并发现实际上存在这样的特性:

代码语言:javascript
复制
TestCase::getNumAssertions()

但它似乎没有更新,而且总是处于零状态。

那么,您如何才能确定是否做了断言呢?

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

代码语言:javascript
复制
/**
 * @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“,但是我们无法测试断言是否运行。如果断言失败并且我捕获了它,如下所示:

代码语言:javascript
复制
/**
 * @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(真)来声明它是正常的。但我们不能断言断言是以任何合理的方式通过的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 13:38:07

我将不讨论可能的实现细节,我只想指出,测试测试套件中的断言数量基本上是个坏主意,因为这个值很难维护。假设你有1724个测试。您需要在测试套件中的每个更改中跟踪这个值。这是没有意义的海事组织。

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

票数 2
EN

Stack Overflow用户

发布于 2015-04-16 16:00:52

所以你需要测试单元测试来确保它们真的在测试?但是谁来检查这个二级测试呢?您将需要另一个级别来确保基于断言数量的断言已经完成。等等..。

单元测试不应该被测试,因为它们的实现应该是简单和线性的。缺少的断言可以在代码评审阶段捕捉到。如果您不信任单元测试,您也不信任代码,这是一个更大的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29674772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档