PHPUnit严格模式有什么作用?

时间:2012-05-09 16:44:05

标签: php unit-testing phpunit

我想知道什么"严格模式在PHPUnit" ?

例如:

phpunit --strict

或在phpunit.xml中

<phpunit strict="true">

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

PHP_Invoker_TimeoutException: Execution aborted after 1 second

2 个答案:

答案 0 :(得分:32)

  

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

这就是我在文档中找到的所有内容,但我也查看了源代码,我发现在严格模式下:

  1. 没有断言的测试可能会被标记为不完整/失败。
  2. 每个测试可能会按照执行时间限制运行,具体取决于它的大小以及pcntl extensionPHP_Invoker library的存在。有三个超时值:

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

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

    • 来自PHPUnit_Extensions_Database_TestCasePHPUnit_Extensions_SeleniumTestCase的测试用例很大。
    • 测试用例和个别测试也可分别通过将它们添加到“大”或“medum”groups来大或中等。
    • 否则,测试很小。

  3. 严格的模式似乎只做了以上三种变化,但我并不完全确定。我以前从未研究过PHPUnit的源代码,也没有使用严格模式。

答案 1 :(得分:20)

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

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

长答案:

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

在我的情况下,错误是测试耗时太长(> 1秒。)(Doctrine ORM架构丢弃+创建可以减慢速度,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。正如克罗辛所说,分配的时间分别为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
     用于通过超时调用callables的实用程序类。此程序包需要在严格模式下强制执行测试超时。 [PHPUnit Install Instructions]

     

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

     

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

相关问题