【问题标题】:Prevent error_log() messages to be printed to the terminal during tests防止在测试期间将 error_log() 消息打印到终端
【发布时间】:2017-07-03 09:40:59
【问题描述】:

正如标题所述,我期待找到一种方法来防止在我的PHPUnit 测试期间在终端中打印error_log() 消息。

在上面的示例中,被测方法通过 error_log('Don\'t show up'),在测试之间打印其消息。

有什么方法可以防止这种行为,让我的测试日志保持花哨?另外,有什么方法可以捕获消息并测试其输出? (对于消息不是简单字符串的情况)。

【问题讨论】:

    标签: php unit-testing phpunit error-log


    【解决方案1】:

    您可以使用set_error_handler() 定义自己的错误处理程序。在评论 #112881 中,您可以看到一个使用回调的示例,您可以根据自己的需要进行调整,例如记录到文件,简单地忽略或其他。

    你可以把它放到你的 phpunit 引导文件中,这样就可以了。

    【讨论】:

      【解决方案2】:

      有什么方法可以防止这种行为,让我的测试日志保持花哨?另外,有什么方法可以捕获消息并测试其输出? (对于消息不是简单字符串的情况)。

      首先你看到的不是测试日志。 显示的错误消息实际上是在标准错误流上而不是标准输出流上。对于您所看到的,这并没有太大区别,因为终端显示两者混合在一起,记录到文件不会记录该错误消息。

      这是 b/c error_log() 将错误消息写入配置的日志文件(PHP 的 error_log ini 指令)。由于 Phpunit 使用 PHP 的 CLI 版本(在命令行上)运行,因此默认情况下这是所述的标准错误流。

      这还包含所有需要的信息,不输出到标准错误流而是捕获它,例如暂时做个测试:

      $capture = tmpfile();
      $saved = ini_set('error_log', stream_get_meta_data($capture)['uri']);
      error_log("Test for this message");
      ini_set('error_log', $saved);
      var_dump(stream_get_contents($capture));
      

      这将通过error_log() 和临时文件提供内容输出:

      string(59) "[06-Jul-2017 12:14:45 Europe/Amsterdam] Test for this message
      "
      

      测试用例结束时会自动删除临时文件。

      【讨论】:

        【解决方案3】:

        您应该为您的脚本设置足够的写入权限的日志文件的正确路径。

        您可以设置错误日志文件路径如下:

        ini_set("error_log", "log_file_name.log");
        

        你可以给出像

        这样的绝对路径
        /tmp/logs/script_output.log
        

        或相对路径。

        【讨论】:

          猜你喜欢
          • 2013-04-15
          • 2013-11-25
          • 1970-01-01
          • 2013-03-01
          • 1970-01-01
          • 2020-06-08
          • 2012-01-22
          • 2012-04-03
          • 1970-01-01
          相关资源
          最近更新 更多