在运行PHPUnit测试时,我希望能够转储输出,以便调试一两个东西。

我已经尝试了以下(类似于PHPUnit手册的例子);

class theTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering disabled
     */
    public function testOutput() {
        print_r("Hello World");
        print "Ping";
        echo "Pong";
        $out = "Foo";
        var_dump($out);
    }   
}

结果如下:

PHPUnit @package_version@ by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.00Mb

OK (1 test, 0 assertions)

注意,这里没有预期的输出。

我使用的是2011年9月19日的git回购的HEAD版本。

php -version输出:

$ php -version
PHP 5.2.9 (cli) (built: Dec  8 2010 11:36:37) 
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
    with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans

是否有什么我做错了,或者这是一个潜在的PHPUnit错误?


当前回答

我在VisualPHPUnit上有一些运气,它确实有用地显示了输出。

class TestHello extends PHPUnit_Framework_TestCase 
{
    public function test_Hello() 
    {
        print "hello world";
    }
}

其他回答

执行phpunit时只需使用——verbose标志。

$ phpunit --verbose -c phpunit.xml 

这种方法的优点是你不需要改变测试代码,你可以打印字符串,var_dump或任何你想要的东西,只有在设置verbose模式时,它才会显示在控制台上。

我希望这能有所帮助。

这不是漏洞,而是故意的。最好的方法是写入某种类型的日志文件,并跟踪日志以观察输出。

如果您正在尝试测试输出,请检查这个。

另外:

注意:请注意PHPUnit吞掉所有发出的输出 在测试执行期间。在严格模式下,发射的测试 输出将失败。

我输出我的Testresults基于HTML,在这种情况下,它是有帮助的刷新内容:

var_dump($array);
ob_flush();

还有第二个PHP方法

flush() 

我没有试过。

如果您使用Laravel,那么您可以使用诸如info()这样的日志函数来记录到存储/日志下的Laravel日志文件。所以它不会出现在终端中,而是出现在日志文件中。

更新:参见rdlowrey的更新下面关于使用fwrite(STDERR, print_r($myDebugVar, TRUE));作为一个简单得多的工作


这种行为是有意为之的(正如jasonbar所指出的)。手册的冲突状态已报告给PHPUnit。

一种变通方法是让PHPUnit断言预期输出为空(当实际上有输出时),这将触发要显示的意外输出。

class theTest extends PHPUnit_Framework_TestCase
{
    /**
     * @outputBuffering disabled
     */
    public function testOutput() {
        $this->expectOutputString(''); // tell PHPUnit to expect '' as output
        print_r("Hello World");
        print "Ping";
        echo "Pong";
        $out = "Foo";
        var_dump($out);
    }   
}

给:

PHPUnit @package_version@ by Sebastian Bergmann.

F

Time: 1 second, Memory: 3.50Mb

There was 1 failure:

1) theTest::testOutput
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-''
+'Hello WorldPingPongstring(4) "Foo"
+'

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

一定要禁用用于测试的任何其他断言,因为它们可能在测试输出断言之前失败(因此您将看不到输出)。