我想知道什么是“PHPUnit 中的严格模式”?
例如:
phpunit --strict
或在 phpunit.xml
<phpunit strict="true"/>
我打开它只是为了尝试它,我的测试开始失败
PHP_Invoker_TimeoutException: Execution aborted after 1 second
我想知道什么是“PHPUnit 中的严格模式”?
例如:
phpunit --strict
或在 phpunit.xml
<phpunit strict="true"/>
我打开它只是为了尝试它,我的测试开始失败
PHP_Invoker_TimeoutException: Execution aborted after 1 second
请注意,PHPUnit 会吞下测试执行期间发出的所有输出。在严格模式下,发出输出的测试将失败。
这就是我在文档中可以找到的全部内容,但我也检查了来源,发现在严格模式下:
每个测试可能会在执行时间限制下运行,具体取决于它的大小以及pcntl 扩展和PHP_Invoker 库的存在。有三个超时值:
timeoutForSmallTests
(默认值:1)timeoutForMediumTests
(默认值:10)timeoutForLargeTests
(默认值:60)测试大小(小、中或大)由以下PHPUnit_Util_Test::getSize()
方法确定:
PHPUnit_Extensions_Database_TestCase
或PHPUnit_Extensions_SeleniumTestCase
很大。严格模式似乎只进行了上述三个更改,但我对此并不确定。我以前从未研究过 PHPUnit 的源代码,也没有使用过严格模式。
简短回答: 对于长时间运行的测试,使用注释来增加允许的运行时间:
@large // 10 seconds
@medium // 5 seconds
@small // 1 second max <-- Default, so no point using
长答案:
这是在@Crozin 的帮助下得出的一组更新信息。
在我的情况下,错误是测试花费了太长时间(> 1 秒。)(Doctrine ORM 模式 drop + create 可以减慢速度,请参阅此 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
它们可以在类级别或方法级别上指定。 PHPUnit github 上的 Issue #490暗示了提供类级别和方法级别的问题,因此如果混合使用它们,则为 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 安装说明]不断言任何内容的严格模式测试被标记为不完整的测试不完整(或跳过)不会产生代码覆盖塞巴斯蒂安·伯格曼(Sebastian Bergmann)的幻灯片共享(幻灯片 10)
注意
请注意 PHPUnit 会吞下测试执行期间发出的所有输出。在严格模式下,发出输出的测试将失败。PHPUnit手册的测试输出部分