PHPUnit严格模式有什么作用?

Mik*_*raf 36 php phpunit unit-testing

我想知道什么是"PHPUnit中的严格模式"?

例如:

phpunit --strict
Run Code Online (Sandbox Code Playgroud)

或者在phpunit.xml中

<phpunit strict="true"/>
Run Code Online (Sandbox Code Playgroud)

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

PHP_Invoker_TimeoutException: Execution aborted after 1 second
Run Code Online (Sandbox Code Playgroud)

Cro*_*zin 34

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

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

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

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

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

    • 测试用例下降PHPUnit_Extensions_Database_TestCasePHPUnit_Extensions_SeleniumTestCase大.
    • 通过将测试用例和单个测试分别添加到"大"或"中间" ,也可以使测试用例和单个测试成为大或中等.
    • 否则,测试很小.

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


Mik*_*raf 21

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

@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using
Run Code Online (Sandbox Code Playgroud)

答案很长:

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

在我的情况下,错误是测试花了太长时间(> 1秒.)(Doctrine ORM架构丢弃+创建可以减慢速度,看看ZendCast我正在做什么).这导致了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
Run Code Online (Sandbox Code Playgroud)

可以在类级别或方法级别指定它们. 关于PHPUnit github的问题#490暗示了提供类级别和方法级别的问题,如果你混合使用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 
Run Code Online (Sandbox Code Playgroud)

以下是一些有关严格模式的信息,可帮助我找到解决方案:

PHP_Invoker
用于调用超时的callables的实用程序类.此程序包需要在严格模式下强制执行测试超时.[ PHPUnit安装说明 ]

严格模式测试不断言任何东西被标记为不完整测试不完整(或跳过)不产生代码覆盖率Slideshare by Sebastian Bergmann(幻灯片10)

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

  • 更改允许你在phpunit.xml文件中测试的时间,如此处所述http://stackoverflow.com/a/13722524/1387163 (5认同)