PHPUnit问题-没有错误消息


PHPUnit problem - no error messages

我试图解决这个问题已经有一段时间了。

我有一个简单的PHPUnit测试用例,包含2个测试。当我运行它时,我得到的输出是:

PHPUnit 3.5.14 by Sebastian Bergmann.
.

所以第一个断言运行,通过。然而,第二个断言会导致一些PHP错误(异常或其他什么),PHPUnit就这样死了,没有任何可能出错的信息。

这是我的phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
    backupStaticAttributes="false"
    colors="false"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="true"
    syntaxCheck="false"
    bootstrap="bootstrap.php.cache"
>
    <testsuites>
        <testsuite name="Portal Test Suite">
            <directory>../src/OneSolution/Portal/*Bundle/Tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

syntaxCheck设置为true不会提供任何有关错误的附加信息。然而,它确实打印了两次(在运行任何测试之前)The filename, directory name, or volume label syntax is incorrect.

那么,有人知道我该怎么做才能让PHPUnit报告这些错误消息吗(--verbose选项也没有帮助)?

编辑:我发现了导致测试失败的原因。方法名打错了(我想我太依赖代码辅助了)。然而,这并不能解决主要问题PHPUnit不报告任何警告、错误或异常

好的,所以如果有人在从PHPUnit命令行获得无输出或不完整输出时遇到问题,请仔细检查php.ini配置指令:

  • 对于您的开发环境,error_reporting-应设置为E_ALL | E_STRICT
  • display_errors-应设置为On

即使启用了所有错误报告,我也遇到了同样的问题。

我试图将echo语句放入我的测试和setUp方法中,以找出它挂在哪里,但它们从未出现。问题出在PHP的输出缓冲上。当我在测试中添加以下方法时:

protected function debug($text)
{
    echo "'nDEBUG: $text'n";
    flush();
    ob_flush();
}

并且使用$this->debug()而不是普通的echo,我能够看到我的调试语句。对代码进行二进制搜索很快就找到了问题的根源(在我的例子中,是一个无效的数据库固定装置)。

我使用--debug标志来精确定位输出消失之前运行的最后一个测试。然后,在吞下所有输出之前,我从测试一直深入到方法运行。让我们称之为blackHole()。您可以将该调用移动到自己的测试中,也可以在错误的上下文中快速运行它

在我的案例中,问题部分来自blackHole(),部分来自它的依赖性。已经对blackHole()进行了更改,但从那以后,他们所有的测试都没有运行过。然后,它的依赖项出现了多个错误(最重要的是系统级/语法错误,如无效的接口实现。然后,意外类型作为参数提供)。在修正了它们、固定装置、所有测试通过等之后,最初的SUT开始通过。

我相信,当PHPUnit在测试范围之外遇到如此低级别的错误时,它就达到了不可回头的地步。或者,它可能有一个小的内存限制,深度嵌套的异常可能会溢出,从而导致崩溃。由于所有输出都被缓冲,直到运行完成,所以没有任何东西能到达终端