【问题标题】:phpunit - Help needed about risky testsphpunit - 需要帮助进行有风险的测试
【发布时间】:2016-07-15 15:49:48
【问题描述】:

我正在为一个网站实施一些测试。 在特定的测试中,出现了这样的结果:

{
"event": "test",
"suite": "Example_V_test",
"test": "Example_V_test::test_3",
"status": "error",
"time": 13.469105958939,
"trace": [
    {
        "file": "\/opt\/lampp\/htdocs\/buy\/application\/tests\/phpunit.phar",
        "line": 569,
        "function": "main",
        "class": "PHPUnit_TextUI_Command",
        "type": "::"
    }
],
"message": "Risky Test: Test code or tested code did not (only) close its own output buffers",
"output": ""
}R                                                                 3 / 3 (100%)

Time: 25.76 seconds, Memory: 59.25MB

There was 1 risky test:

1) Example_V_test::test_3
Test code or tested code did not (only) close its own output buffers

/opt/lampp/htdocs/buy/application/tests/phpunit.phar:569

OK, but incomplete, skipped, or risky tests!

我的问题是:如何找到导致此“问题”的代码行?

【问题讨论】:

  • 您可以在错误日志中找到它。
  • 在哪里可以找到错误日志?我正在测试一个使用 codeigniter 构建的站点,但在包含 phpunit.phar 文件的目录中没有找到它,即:/opt/lampp/htdocs/codeigniter/application/tests。另外,我查看了 codeigniter/application/log 文件夹,这里没有 phpunit 测试的输出。
  • /var/log/apache2/error_log。试试吧兄弟xD
  • 我明白了。在我的情况下,它是 /opt/lampp/logs/error.log 文件,但是 phpunit test 没有输出...

标签: php testing phpunit


【解决方案1】:

如果 PHPUnit 检测到测试方法结束时的输出缓冲级别与开始时的级别不同,则会报告该消息。这是因为它使用自己的输出缓冲区并检查测试是否产生任何输出。

因为 PHPUnit 中没有选项可以忽略这一点,所以您需要找到代码中的输出缓冲开始但没有结束(或结束太多)的原因并修复它。

这可能真的很难实现,因为没有提示,输出缓冲从哪里开始,但是您可以在源代码(和库)上使用全文搜索来识别候选者。然后寻找异常,这可能会破坏正常的程序流程,从而阻止ob_end_flush()(或类似的)被调用。

【讨论】:

  • 我在测试代码末尾检查了 ob_get_level() 值,它返回 2。现在我将对此进行调查。谢谢你的回答!
  • 现在很好用,谢谢!我在缓冲区中有一个中止/死机,这导致了测试脚本中的错误。之前:ob_start(); abort(404); ob_get_clean(); 解决方案:ob_start(); ob_end_flush(); abort(404); ob_get_clean();
【解决方案2】:

专门给Test code or tested code did not (only) close its own output buffers

最近遇到了这个。

最初是这个 SO 问题,答案对我来说是一个解决方案。但是,我不喜欢这个解决方案。发生这种情况有更深层次的原因,而且我写的数百个测试中只有一个......

在进行更多挖掘之后,我能够找到我的问题源于刀片模板中的 @section()@endsection 调用。

不知何故,由于错误,键盘被敲击并且随机键留在了那里。这不会在视觉上造成问题,也不会在页面呈现时给最终用户带来任何危险信号,因此不会被注意到。

就我而言——我的错误是

@section('sudo')
...
@endsection2

删除 2 修复了原始问题,并允许我删除 hacky 解决方案

//        // start hacky
//            ob_start();
//            ob_end_flush();
//            ob_get_clean();
//        // end hacky

ps。这可能只能解决遇到这个 SO 问题的一部分人的问题。抱歉,如果它不能解决您的问题:)

【讨论】:

    猜你喜欢
    • 2013-10-07
    • 2011-12-19
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多