在运行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错误?


当前回答

恶意的,但有效:抛出异常,并将调试输出作为其消息。

class theTest extends PHPUnit_Framework_TestCase
{
    public function testOutput() {
        throw new \Exception("hello");
    }   
}

收益率:

...
There was 1 error:

1) theTest::testOutput
Exception: hello

其他回答

简而言之,phpunit抑制了STDOUT。默认情况下,它会写入STDERR,除非你添加——verbose或——debug。你可以做这些事情中的一件:

相反,将调试输出打印到STDERR 像往常一样Var_dump调试,但是在phpunit命令行中添加——verbose Var_dump你的调试像往常一样,但添加一行ob_flush();下面 在phpunit中使用正确的命令来测试您在这里要测试的内容

显然,最后一件事是要做的好事,剩下的都是临时的小技巧。

您应该认真考虑您的意图:如果您现在在调试以修复测试时需要这些信息,那么当测试中断时,您将在下周再次需要这些信息。

这意味着当测试失败时,您总是需要这些信息——而添加var_dump来查找原因实在是太麻烦了。而是把数据放到你的断言中。

如果您的代码过于复杂,那么就将其拆分,直到达到一个断言(带有自定义消息)足以告诉您哪里出错了,为什么出错以及如何修复代码的程度。

更新:参见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.

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

它是一个付费产品,但我发现它做得很好:来自Spatie的Ray https://spatie.be/products/ray

就像这样使用它:

射线(“消息”)

消息将显示在Ray输出窗口中

PHPUnit用ob_start()隐藏输出。我们可以暂时关闭它。

    public function log($something = null)
    {
        ob_end_clean();
        var_dump($something);
        ob_start();
    }