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

时间:2011-09-18 00:00:06

标签: phpunit

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

有没有人遇到过这个问题,或者知道可能导致这个问题的原因。

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

13 个答案:

答案 0 :(得分:53)

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

display_errors = On
display_startup_errors = On

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

答案 1 :(得分:40)

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

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

之后再次运行测试,现在你可以看到为什么PHPUnit失败了,

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

答案 2 :(得分:27)

我知道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);        
}

答案 3 :(得分:22)

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

答案 4 :(得分:6)

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

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

答案 5 :(得分:5)

我设法用一个自定义的“致命错误处理程序”在一个角落里画出了自己的画面,在某些罕见的情况下,这些处理器输出 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);

如果有人设法做到比这更糟糕,并以某种方式阻止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);
});

答案 6 :(得分:4)

检查你的代码中是否有任何逻辑已经死掉,没有输出。例如,

<?php

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

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

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

答案 7 :(得分:4)

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

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

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

答案 8 :(得分:3)

如果从命令行运行最新版本的phpunit,就像这样

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

你立即回复提示,没有任何消息,这可能是由于&#34; suhosin secutiry&#34;建立。 phpunit现在是一个&#34; phar&#34;包括所有图书馆。为了能够在php启用了suhosin安全模块时运行此类文件,您必须先设置此

suhosin.executor.include.whitelist = phar

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

答案 9 :(得分:2)

我在这里尝试了一切,但在我尝试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');
    }
}

答案 10 :(得分:1)

检查您运行的phpunit和您安装的phpunit是否相同:

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

尝试使用完整路径执行完全正确的phpunit。

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


如果这没有用,请在phpunit可执行文件中使用write,例如: “回声123;”并运行phpunit。检查一下你是否看到了。

答案 11 :(得分:1)

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

xdebug.remote_enable=1

答案 12 :(得分:0)

我正面临一个问题。我可以从根目录运行phpunit,但不能从其他任何地方运行。所以我将“ --configuration”标记放置到了我的xml配置中。

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

phpunit的路径是最优的,之所以使用它,是因为我是由作曲家在本地安装的。