PHPUnit 严格模式有啥作用?

Posted

技术标签:

【中文标题】PHPUnit 严格模式有啥作用?【英文标题】:What does PHPUnit Strict mode do?PHPUnit 严格模式有什么作用? 【发布时间】:2012-05-18 05:26:14 【问题描述】:

我想知道“phpUnit 中的严格模式是什么”?

例如:

phpunit --strict

或在 phpunit.xml 中

<phpunit strict="true"/>

我打开它只是为了尝试它,我的测试开始失败

PHP_Invoker_TimeoutException: Execution aborted after 1 second

【问题讨论】:

【参考方案1】:

请注意,PHPUnit 会吞下测试执行期间发出的所有输出。在严格模式下,发出输出的测试将失败。

这就是我在文档中可以找到的全部内容,但我还检查了来源,发现在严格模式下:

    没有断言的测试可能会被标记为不完整/失败。

    每个测试都可能在执行时间限制下运行,具体取决于它的大小以及pcntl extension 和PHP_Invoker library 的存在。有三个超时值:

    timeoutForSmallTests(默认值:1) timeoutForMediumTests(默认值:10) timeoutForLargeTests(默认值:60)

    测试大小(小、中或大)由PHPUnit_Util_Test::getSize() 方法确定:

    PHPUnit_Extensions_Database_TestCasePHPUnit_Extensions_SeleniumTestCase 下降的测试用例很大。 也可以通过将测试用例和单个测试分别添加到“大”或“中”groups 来将它们设为大或中。 否则,测试很小。

似乎严格模式只进行了上述三个更改,但我对此并不确定。之前没研究过PHPUnit的源码,也没用过严格模式。

【讨论】:

【参考方案2】:

简答: 对于长时间运行的测试,请使用注释来增加允许的运行时间:

@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using

长答案:

这是在@Crozin 的帮助下获得的一组更新信息。

在我的情况下,错误是测试花费的时间太长(>1 秒。)(Doctrine ORM 模式 drop + create 会减慢速度,see this ZendCast for what I was doing)。这导致 PHP_Invoker 出现问题(和一些输出)。严格模式不允许任何输出。

通过阅读/逆向工程 /usr/share/php/pear/share/pear/PHPUnit/Util/Test.php::getSize() (和 getGroups() 在同一个类)..我发现有我们可以使用 3 个未记录的注释:

@large  // 10 seconds
@medium // 5 seconds
@small // 1 second max run time

它们可以在类级别或方法级别上指定。 Issue #490 on the PHPUnit github 暗示了提供类级别和方法级别的问题,因此如果您混合使用它们,则为 YMMV。正如 crozin 所说,分配的超时时间分别为 10、5、1 秒。

另一种解决方案是增加被调用函数的运行时间(在我的慢速计算机上)。

sudo vi /usr/share/php/pear/share/pear/PHP/Invoker.php

Increase line 1 "declare(ticks = 1);" to
    "declare(ticks = 10);" // or any higher int that meets your needs 

这里有一堆关于严格模式的信息,帮助我找到了解决方案:

PHP_Invoker 用于调用具有超时的可调用对象的实用程序类。这个包是在严格模式下强制测试超时所必需的。 [PHPUnit Install Instructions]

严格模式 不断言任何内容的测试被标记为不完整 不完整(或跳过)的测试不会产生代码覆盖Slideshare by Sebastian Bergmann (slide 10)

注意 请注意,PHPUnit 会吞下测试执行期间发出的所有输出。在严格模式下,发出输出的测试将失败。 Testing output section of PHPUnit Manual

【讨论】:

更改允许的测试时间,您也可以在 phpunit.xml 文件中进行测试,如此处所述***.com/a/13722524/1387163

以上是关于PHPUnit 严格模式有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Doctype作用?严格模式与混杂模式如何区分?它们有何意义

Doctype作用?严格模式与混杂模式如何区分?它们有何差异?

Doctype作用?严格模式与混杂模式如何区分?它们有何意义?

html的doctype作用?严格模式与混杂模式如何区分?它们有何意义

Doctype的作用?严格模式和混杂模式的区分,以及如何触发着2中模式?

严格模式