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

Posted

技术标签:

【中文标题】PHPUnit - 啥都不做,没有错误,没有输出【英文标题】:PHPUnit - does nothing, no errors, no outputPHPUnit - 什么都不做,没有错误,没有输出 【发布时间】:2011-11-19 11:51:32 【问题描述】:

对于另一个“phpunit 不起作用”的问题,我们深表歉意。它曾经工作多年。今天我重新安装了 PEAR 和 phpunit,原因与此问题无关。现在,当我像往常一样运行 phpunit 时。什么都没发生。 cli 只显示了一个新行,没有任何输出。

有没有人遇到过这个问题或者知道是什么原因造成的。

PHPUnit Version: 3.5.15 
PEAR Version: 1.9.4 
PHP Version: 5.3.8 
Windows 7

【问题讨论】:

在没有bootstrap.phpphpunit.xml 的情况下创建最简单的测试类,以首先验证您的新安装是否有效。如果 PHPUnit 无法实例化所有测试用例(每个测试方法和数据提供者一个),PHPUnit 将在没有任何消息的情况下停止。 @DavidHarkness 感谢您的建议,我能够解决问题。经过几次随机更改后,phpunit 开始输出常规错误消息。如果您将此评论作为答案发布,我可以接受。 【参考方案1】:

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

display_errors = On
display_startup_errors = On

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

【讨论】:

请记住,您需要修改 php.ini 的 CLI 版本,可能会有所不同。快速定位它:php -i | grep php.ini 此解决方案更改了所有使用相同 php 二进制文件的应用程序的 php.ini,这使得它过于宽泛而无法正确:) 我建议指定与单元测试相关的配置 (ini)在phpumit.xml 中描述为here【参考方案2】:

为了将来的参考,对于那些遇到 PHPUnit 任何问题,并且 PHPUnit 静默失败的人,只需在 phpunit.xml 中添加这三行:

<phpunit ....... >
    ...
    ...
    <php>
         <ini name="display_errors" value="true"/>
    </php>
</phpunit>

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

并且...享受单元测试:)

【讨论】:

谢谢!这成功了,并显示了导致错误的行 这是一个很好的答案,因为它不需要对全局 php.ini 文件进行任何修改。然后 PHPUnit 会抛出可见的错误,让您可以诊断和排序问题。 这看起来很有希望,但不幸的是似乎对我没有效果。 也许您遗漏了什么,如果您愿意,可以将您的问题详细信息发送到我的电子邮件,我们可以尝试找出答案:) 你刚刚用这个答案拯救了我的一天 :)【参考方案3】:

我知道原始发帖人的问题已经得到解答,但对于任何将来搜索的人来说:可能导致 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);        

【讨论】:

谢谢,很好的贡献! 在尝试了许多其他建议的“解决方案”之后,这是唯一对我有用的;它帮助我找到了一个损坏的 Laravel 安装,该安装导致 PHPUnit 静默失败,退出代码为 255。非常感谢! 我希望我能为这个解决方案加注星标。 没有解决我的问题,但最终它让我走上了正轨。 +1。我在下面添加了自己的解决方案,如果您想笑我的费用:-) 谢谢 - 我一直在疯狂地试图找出我的 Laravel API 发生了什么【参考方案4】:

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

【讨论】:

这个答案也帮助了我。我的问题是设置正确的路由并删除控制器中的访问控制检查,以防环境正在测试。【参考方案5】:

你已经想出了如何让它工作,但我的解决方案有点不同。

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

【讨论】:

对于 bash 新手,请使用 echo $? 检查退出状态(它会为您提供最后一条命令的状态码,0 表示正常)。 这实际上是我认为的最佳答案,因为当退出代码为 255 时,设置 error_reporting 不会有太大帮助。 那么为什么是最好的?我得到了 255,不知道该怎么做 :) @eddy147【参考方案6】:

我设法用一个自定义的“致命错误处理程序”把自己画在一个角落里,在某些罕见的情况下结果证明它不会输出 nothing。根据墨菲定律,一旦我忘记了处理程序就位,这些条件就会实现。

因为它不是真正的“PHPunit 问题”,所以其他答案都没有帮助 [尽管@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);

如果有人设法做得比这更糟,并且还以某种方式阻止了标准输出,那么这个修改应该可以工作:

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);
);

【讨论】:

很好的答案!帮助我找到了一些关于memory_limit 问题的@unserialize 呼叫失败。非常感谢。【参考方案7】:

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

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

通过使用--stderr 作为test-runner 选项解决了这个问题。

【讨论】:

【参考方案8】:

检查您是否没有将任何逻辑写入您的代码中,这些逻辑只是死掉了,没有输出。例如,

<?php

if (!array_key_exists('SERVER_NAME', $_SERVER)) 
    die();

这正是我的情况;我对通过 Apache 运行代码时正确的环境做了一些假设,但在从 CLI 运行时没有实现,并且代码没有回显任何输出。

PHPUnit 尝试在提供通常的 init 输出之前包含引导文件,但在引导过程中死亡,因此以状态 0 退出并且没有输出。

【讨论】:

振作起来。我对祝福的数据库做了一些假设。【参考方案9】:

如果当你从命令行运行类似这样的最新版本的 phpunit 时

> php phpunit
or
> ./phpunit
or
> php ./phpunit.phar
or
> ./phpunit.phar

然后您立即返回提示,没有任何消息,这可能是由于“suhosin secutiry”设置所致。 phpunit 现在是一个包含所有库的“phar”包。为了能够在 php 启用了 suhosin 安全模块时运行这样的文件,你必须首先设置这个

suhosin.executor.include.whitelist = phar

进入你的 php.ini 文件(例如,使用 debian/ubuntu,你可能需要编辑文件 /etc/php5/conf.d/suhosin.ini

【讨论】:

谢谢,它帮助了我。 我也推荐阅读***文章:en.wikipedia.org/wiki/Suhosin【参考方案10】:

我在这里尝试了所有方法,但在我尝试phpunit --no-configuration simpletest.php 之前没有任何效果。这最终给了我一些输出,这意味着我的 phpunit.xml.dist 文件已损坏。 (我会在调试后回来更新它。)

simpletest.php 的内容如下,但任何测试文件都应该可以工作。

<?php
use PHPUnit\Framework\TestCase;

final class FooTest extends TestCase

    public function testFoo()
    
        $this->assertEquals('x', 'y');
    

【讨论】:

我遇到了同样的问题;运行测试时我没有输出。幸运的是,通过运行 simpletest.php phpunit 显示了输出。这是设置我的第一个测试的重要一步。在我的情况下没有输出的原因是由包含路径引起的;自动加载器的路径错误。【参考方案11】:

检查你正在运行的phpunit和你安装的是否相同:

$ pear list phpunit/phpunit
...
script /path/to/phpunit
...

尝试使用完整路径准确执行该 phpunit。

然后检查您的 PATH 变量并查看其中是否包含正确的目录。如果没有,请修复它。


如果这没有帮助,请使用将某些内容写入 phpunit 可执行文件,例如“回声 123;”并运行 phpunit。检查你是否看到。

【讨论】:

感谢您的想法,但我的安装一切正常,我只有我提到的一个版本。【参考方案12】:

对我来说,冲突在于 Xdebug 的指令

xdebug.remote_enable=1

【讨论】:

【参考方案13】:

我遇到了一个看似问题。我可以从根目录运行 phpunit,但不能从其他任何地方运行。所以我放了“--configuration”标签,并将它指向我的xml配置。

$ ./<path_to_phpunit>phpunit --configuration <path_to_phpunitxml>/phpunit.xml

phpunit的路径是可选的,我使用它是因为我是composer本地安装的。

【讨论】:

【参考方案14】:

/composer/vendor/phpunit/phpunit/src/TextUI/Command.phpmain() 函数中catch (Throwable $t) var_dump (echo / print_r) 异常。如果存在异常,您可能会解决当前问题。

【讨论】:

以上是关于PHPUnit - 啥都不做,没有错误,没有输出的主要内容,如果未能解决你的问题,请参考以下文章

Process.Start() 啥都不做

IOS Ad Hoc 分发链接啥都不做

DotNet Pack 啥都不做

Netcool/OMNIbus SQL 过程没有运行\啥都不做

JQuery 表单验证啥都不做

没有 else 或啥都不做的 SQL 查询案例?