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

时间:2014-12-06 08:55:12

标签: php unit-testing phpunit

问题:为什么PHPUnit似乎在严格模式下运行?

问题:

  

Sebastian Bergmann的PHPUnit 4.3.1。

     

从/full/path/to/configuration.xml

读取配置      

[R

     

时间:2.65秒,记忆:11.50Mb

     

好的,但不完整,跳过或有风险的测试!测试:1,断言:1,   风险:1。完成。

此外:

  

危险测试:测试代码或测试代码没有(仅)关闭它自己   输出缓冲区

我的PHP版本是5.4。

正如文档(https://phpunit.de/manual/current/en/strict-mode.html)中所述,这似乎只适用于PHPUnits的严格模式设置。

  

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>

3 个答案:

答案 0 :(得分:6)

查看GitHub 上可用的代码似乎,无论文档说什么,都会检查输出缓冲问题并报告始终。< / p>

因此,您观察到的症状并不意味着测试以strict模式运行。

  

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 :(得分:0)

在代码库中搜索error_reporting。您可能在代码中启用严格模式。 error_reporting(E_NOTICE)足以触发您获得的风险警告。

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

答案 2 :(得分:0)

从输出中我相信我认为你只做一次测试是正确的,所以设置--stop-on-risky在这里确实没有用。

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

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