PHPUnit - 什么都不做,没有错误,没有输出

mar*_*kus 45 phpunit

对不起另一个'phpunit不起作用'的问题.它曾经工作多年了.今天我重新安装了PEAR和phpunit,原因与此问题无关.现在,当我像往常一样运行phpunit时.什么都没发生.cli只是向我展示了一条新线,没有任何输出.

有没有人遇到过这个问题,或者有什么可能导致它的问题.

PHPUnit Version: 3.5.15 
PEAR Version: 1.9.4 
PHP Version: 5.3.8 
Windows 7
Run Code Online (Sandbox Code Playgroud)

Bet*_*ide 56

我在OSX和MAMP上.要获取错误消息,我必须调整以下条目php.ini:

display_errors = On
display_startup_errors = On
Run Code Online (Sandbox Code Playgroud)

请注意,这不得不进入/Applications/MAMP/bin/php/php5.3.6/conf/php.ini.

  • 请记住,您需要修改php.ini的CLI版本,这可能会有所不同.找到它的快捷方式:`php -i | grep php.ini` (6认同)
  • 路径是完全依赖的,所以它真的不"必须去"那里..... (3认同)

Ahm*_*jar 42

为了将来参考,对于那些面临任何PHPUnit问题的人,以及PHPUnit静默失败,只需在phpunit.xml中添加以下三行:

<phpunit ....... >
    ...
    ...
    <php>
         <ini name="display_errors" value="true"/>
    </php>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

之后再次运行测试,现在您可以看到PHPUnit失败的原因,

和...享受单位测试:)

  • 这看起来很有希望,但不幸的是似乎对我没有影响。 (2认同)

Isa*_*aac 28

我知道orignal海报的问题已经得到解答,但是对于任何未来搜索的人来说:有一件事可能导致PHPUnit无声地失败(即它只是停止运行测试而不告诉你原因)是它有一个错误处理程序,它在每次测试运行之前设置,用于捕获错误并在测试运行结束时显示它们.问题是某些错误会停止整个测试运行的执行.

作为第一步,当我发生这种情况时,我通常会将错误处理程序重置为立即输出错误消息的内容.在我的基础测试类中,我有一个调用的方法setVerboseErrorHandler,setUp当发生这种情况时,我会在测试的顶部调用(或者调用).下面需要php 5.3或更高版本(由于关闭),所以如果你在5.2或更低,你可以使它成为常规功能.

protected function setVerboseErrorHandler() 
{
    $handler = function($errorNumber, $errorString, $errorFile, $errorLine) {
        echo "
ERROR INFO
Message: $errorString
File: $errorFile
Line: $errorLine
";
    };
    set_error_handler($handler);        
}
Run Code Online (Sandbox Code Playgroud)

  • 我希望我能解决这个问题. (2认同)

Dav*_*ess 22

创建最简单的测试类,无需bootstrap.phpphpunit.xml首先验证新安装是否有效.如果在运行任何测试之前无法实例化所有测试用例(每个测试方法和数据提供者一个),PHPUnit将在没有任何消息的情况下停止.


Kev*_*era 6

你已经知道如何让它工作,但我的解决方案有点不同.

您可以做的第一件事是检查退出状态.如果它不为0,则退出PHP,并且由于设置了INI配置设置,因此未输出任何PHP错误消息.我所做的是启用"display_errors"INI设置,并将"error_reporting"设置为E_ALL.然后,我能够识别错误,例如PHP无法解析某个脚本.一旦我修复了它,PHPUnit就可以正常运行了.

  • 对于刚接触bash的人,用`echo $?`检查退出状态(它给你最后一个命令的状态代码,0表示OK). (5认同)
  • 这实际上是我的观点的最佳答案,因为当退出代码为255时,设置error_reporting将无济于事. (2认同)

LSe*_*rni 5

我设法用一个自定义的"致命错误处理程序"在一个角落里画出了自己的画面,在某些罕见的情况下,这些处理器没有输出任何内容.那些符合墨菲定律的条件,一旦我忘记了处理程序就实现了.

既然它不是真正的"PHP单元问题",其他答案都没有帮助[虽然@David的问题在底层是同样的事情],即使症状是相同的 - phpunit终止没有输出,没有错误,没有记录并没有任何线索.

最后,我不得不通过在引导代码中添加这个来逐步跟踪整个测试套件:

register_shutdown_function(function() {
    foreach ($GLOBALS['lastStack'] as $i => $frame) {
        print "{$i}. {$frame['file']} +{$frame['line']} in function {$frame['function']}\n";
    }
});
register_tick_function(function() {
    $GLOBALS['lastStack'] = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 8);
});
declare(ticks=1);
Run Code Online (Sandbox Code Playgroud)

如果有人设法做到比这更糟糕,并以某种方式阻止stdout,这个修改应该工作:

register_shutdown_function(function() {
    $fp = fopen("/tmp/path-to-debugfile.txt", "w");
    foreach ($GLOBALS['lastStack'] as $i => $frame) {
        fwrite($fp, "{$i}. {$frame['file']} +{$frame['line']} in function {$frame['function']}\n");
    }
    fclose($fp);
});
Run Code Online (Sandbox Code Playgroud)


Dev*_*key 5

这是一个旧线程,但我在遇到同样问题时偶然发现了一个线程。

我遇到了同样的问题,没有返回到控制台,包括 print、print_r、echo 等。

通过--stderr用作测试运行器选项解决了它。