PHPUnit - 为什么PHPUnit似乎在严格模式下运行?

8
问题:为什么PHPUnit看起来在严格模式下运行?
问题描述:
PHPUnit 4.3.1 by Sebastian Bergmann.
Configuration read from /full/path/to/configuration.xml
R
Time: 2.65 seconds, Memory: 11.50Mb
OK, but incomplete, skipped, or risky tests! Tests: 1, Assertions: 1, Risky: 1. Done.
同时:
Risky Test: 测试代码或被测试代码没有(仅)关闭其自己的输出缓冲区
我的PHP版本是5.4。
如文档所述(https://phpunit.de/manual/current/en/strict-mode.html),这只适用于PHPUnit的严格模式设置。
PHPUnit在执行测试时可以执行额外的检查。除了对各种严格模式检查的细粒度控制(参见下面),您可以使用--strict命令行选项或在PHPUnit的XML配置文件中设置strict="true"来启用所有这些检查。

-

测试执行期间的输出

PHPUnit 在测试期间对输出进行严格检查。可以通过在命令行上使用 --disallow-test-output 选项或在 PHPUnit 的 XML 配置文件中设置 beStrictAboutOutputDuringTests="true" 来启用此检查。

当启用此检查时,如果测试代码或被测试代码中调用了 print 等函数来发出输出,则会将其标记为风险测试。

我认为我没有激活严格模式。我的命令行是 "/usr/bin/php /usr/bin/phpunit --colors --bootstrap /full/path/to/bootstrap.php --configuration /full/path/to/configuration.xml /full/path/to/Test.php"。我还使用了 "https://phpunit.de/manual/current/en/appendixes.configuration.html" 中提供的配置。

<phpunit
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.3/phpunit.xsd"
   backupGlobals="true"
   backupStaticAttributes="false"
   cacheTokens="false"
   colors="false"
   convertErrorsToExceptions="true"
   convertNoticesToExceptions="true"
   convertWarningsToExceptions="true"
   forceCoversAnnotation="false"
   mapTestClassNameToCoveredClassName="false"
   printerClass="PHPUnit_TextUI_ResultPrinter"
   processIsolation="false"
   stopOnError="false"
   stopOnFailure="false"
   stopOnIncomplete="false"
   stopOnSkipped="false"
   testSuiteLoaderClass="PHPUnit_Runner_StandardTestSuiteLoader"
   timeoutForSmallTests="1"
   timeoutForMediumTests="10"
   timeoutForLargeTests="60"
   strict="false"
   verbose="false">
</phpunit>

我之前使用过一个更短的配置,它可以得到同样的结果。
<phpunit
   beStrictAboutOutputDuringTests="false"
   strict="false"
   colors="false">
</phpunit>

1
你解决了这个问题吗? - Patrick
我解决了报告的问题,但并非我最初的意图——让PHPUnit忽略这个问题。问题出在我使用的一个库上,我找到了一种方法来解决这个问题: http://help.slimframework.com/discussions/problems/7779-output-buffers-arent-closed-when-using-app-halt - Andreas B
我在这里回答了同样的问题 https://dev59.com/n1oT5IYBdhLWcg3wlwWR#40242323 - Bruno Justino Praciano
我在这里回答了同样的问题 https://dev59.com/n1oT5IYBdhLWcg3wlwWR#40242323 - Bruno Justino Praciano
3个回答

7
看起来,无论文档如何说明,在GitHub上提供的代码中,输出缓冲问题都会被检查并始终报告。因此,您观察到的症状并不意味着测试以严格模式运行。

github.com/sebastianbergmann/phpunit/blob/4.3/src/Framework/TestCase.php#L818

// ...

try {
    $this->stopOutputBuffering();
} catch (PHPUnit_Framework_RiskyTestError $_e) {
    if (!isset($e)) {
        $e = $_e;
    }
}

github.com/sebastianbergmann/phpunit/blob/4.3/src/Framework/TestCase.php#L1938-L1946

private function stopOutputBuffering()
{
    if (ob_get_level() != $this->outputBufferingLevel) {
        while (ob_get_level() > 0) {
            ob_end_clean();
        }
        throw new PHPUnit_Framework_RiskyTestError(
            'Test code or tested code did not (only) close its own output buffers'
        );
    }

    // ...

    $this->outputBufferingActive = false;
    $this->outputBufferingLevel  = ob_get_level();
}

在您喜爱的 PHPUnit 测试调试器中,在上述行处设置断点可能会揭示一些其他依赖项(比如 disallowTestOutput 标志…?)

1
这确实解释了问题。我已经在使用的库中修复了缓冲问题,自那以后就没有遇到类似的情况了。http://help.slimframework.com/discussions/problems/7779-output-buffers-arent-closed-when-using-app-halt - Andreas B
@xmojmr,这应该被视为一个错误吗? - Pacerier
@Pacerier 可能是。我对 phpunit 的文档不太熟悉。如果这种行为与文档的说明相矛盾,那么应该视为一个 bug,并且应该在 问题追踪器 中注册,与其他 147 个已打开的问题一起。 - xmojmr

0

在您的代码库中搜索error_reporting。您可能会在代码中打开严格模式。 error_reporting(E_NOTICE)足以触发您收到的风险警告。

PHPUnit不是特殊的二进制文件(我曾经有这个误解),它只是PHP执行一些引导机制来运行您的代码。这意味着您的代码与PHPUnit共享相同的环境-因此很可能在您的代码中某处设置了错误报告为严格模式。


1
我已经关闭了 e_notice。问题出在输出缓冲上。 - kylehyde215

0

从输出结果来看,我认为您只进行了一个测试,因此设置--stop-on-risky在这里并没有帮助。

我建议确保您在代码本身中关闭了输出缓冲。如果您曾经使用过类似于ob_start的东西,请确保在脚本停止执行之前调用ob_end_clean或ob_end_flush。

另外,作为第二个想法,也许尝试在运行时传递-d和-v标志,看看是否会提供更多信息。


1
您可以[编辑]所有的帖子和评论。也许您应该将评论内容移动到您的答案中,然后删除评论。 - Artjom B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接