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


当前回答

只需在输出文本后调用ob_flush()即可

示例代码:

    public function testDebugOutputToCli() {
        var_dump(new DateTime());
        ob_flush();
    }

代码和输出截图:

为什么?PHPUnit总是输出缓冲区,所以我们需要在调试时转储缓冲区

我对上面所有的答案都很纠结,特别是因为所选的答案——使用codeplet_debug()和——debug(如手册所述)——导致了大量的调试输出,使我无法使用它。

我像一个好书呆子一样阅读PHPUnit手册,无意中发现了这个,我认为这解释了导致整个PHPUnit问题的原因,而不仅仅是Codeception:

PHPUnit手册,测试输出:“有时你想断言一个方法的执行,例如,产生一个预期的输出(例如,通过回显或打印)。PHPUnit\Framework\TestCase类使用PHP的Output Buffering特性来提供必要的功能。

这是完全有意义的,并解释了为什么我们看不到输出。PHPUnit正在保存它,以防我们想要检查注释!这就是它在我们实际测试中的工作方式,我们当然不希望仅仅因为我们调用了一个使用echo的函数就有随机的东西出现在屏幕上。

但是在调试时,我们只想立即看到文本,并且理解了这一切,解决方案就很清楚了:只需使用ob_flush()按需打印输出缓冲区的内容!

为阅读有趣的手册欢呼三声!

另外,还发现这个技巧隐藏在如何在phpunit中显示var_dump或codeception中,由Julian在dev.to上编写

其他回答

这是从PHPUnit文档关于装置。

这应该允许您在phpunit测试生命周期的任何时候转储信息。

只需将下面代码中的__METHOD__替换为您想要输出的任何内容

例4.2:显示所有可用模板方法的示例

<?php
class TemplateMethodsTest extends PHPUnit_Framework_TestCase
{
    public static function setUpBeforeClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function setUp()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function assertPreConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public function testOne()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(TRUE);
    }

    public function testTwo()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        $this->assertTrue(FALSE);
    }

    protected function assertPostConditions()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function tearDown()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    public static function tearDownAfterClass()
    {
        fwrite(STDOUT, __METHOD__ . "\n");
    }

    protected function onNotSuccessfulTest(Exception $e)
    {
        fwrite(STDOUT, __METHOD__ . "\n");
        throw $e;
    }
}
?>

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

var_dump($array);
ob_flush();

还有第二个PHP方法

flush() 

我没有试过。

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

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

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

可以使用Symfony\Component\Console\Output\TrimmedBufferOutput,然后像这样测试缓冲的输出字符串:

use Symfony\Component\Console\Output\TrimmedBufferOutput;

//...
public function testSomething()
{
   $output = new TrimmedBufferOutput(999);
   $output->writeln('Do something in your code with the output class...');
   
   //test the output:
   $this->assertStringContainsString('expected string...', $output->fetch());   
}

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

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

收益率:

...
There was 1 error:

1) theTest::testOutput
Exception: hello