PHPUnit 严格模式有什么作用?

2022-08-30 13:10:26

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

例如:

phpunit --strict

或在 phpunit 中.xml

<phpunit strict="true"/>

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

PHP_Invoker_TimeoutException: Execution aborted after 1 second

答案 1

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

这就是我在文档中能找到的,但我也检查了源代码,我发现在严格模式下:

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

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

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

    • 测试用例从中降序而来或很大。PHPUnit_Extensions_Database_TestCasePHPUnit_Extensions_SeleniumTestCase
    • 测试用例和单个测试也可以通过分别添加到“大型”或“medum”组中来制作大或中。
    • 否则,测试很小。

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


答案 2

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

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

长答案:

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

在我的情况下,错误是测试花费的时间太长(>1秒)。(Doctrine ORM schema 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 上的问题 #490 暗示了提供类级别和方法级别的问题,因此 YMMV 如果混合使用,则为 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 安装说明]

不断言任何内容的严格模式测试被标记为不完整的测试,这些测试不完整(或跳过)产生没有代码覆盖率 塞巴斯蒂安·伯格曼的幻灯片共享(幻灯片 10)

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


推荐