我试图解决这个问题已经有一段时间了。
我有一个简单的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在测试范围之外遇到如此低级别的错误时,它就达到了不可回头的地步。或者,它可能有一个小的内存限制,深度嵌套的异常可能会溢出,从而导致崩溃。由于所有输出都被缓冲,直到运行完成,所以没有任何东西能到达终端