如何在执行PHP单元测试期间在CLI中输出?

Jes*_*ord 132 php phpunit unit-testing

在运行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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

结果如下:

PHPUnit @package_version@ by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 3.00Mb

OK (1 test, 0 assertions)
Run Code Online (Sandbox Code Playgroud)

请注意,没有预期的输出.

我在2011年9月19日使用了HEAD版本的git repos.

产量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
Run Code Online (Sandbox Code Playgroud)

有什么我做错了,或者这可能是一个PHPUnit错误?

rdl*_*rey 173

UPDATE

刚刚意识到另一种方法,它比--verbose命令行选项更好地工作:

class TestSomething extends PHPUnit_Framework_TestCase {
    function testSomething() {
        $myDebugVar = array(1, 2, 3);
        fwrite(STDERR, print_r($myDebugVar, TRUE));
    }
}
Run Code Online (Sandbox Code Playgroud)

这使您可以随时将任何内容转储到控制台,而不会出现--verboseCLI选项随附的所有不需要的输出.


正如其他答案所指出的那样,最好使用内置方法测试输出,例如:

$this->expectOutputString('foo');
Run Code Online (Sandbox Code Playgroud)

但是,有时候调侃并从测试用例中看到一次性/临时调试输出是有帮助的.但是,不需要var_dump黑客/解决方法.这可以通过--verbose在运行测试套件时设置命令行选项轻松完成.例如:

$ phpunit --verbose -c phpunit.xml
Run Code Online (Sandbox Code Playgroud)

在CLI环境中运行时,这将显示测试方法内部的输出.

请参阅:为PHPUnit编写测试 - 测试输出.

  • 抱歉,我们错过了写给stderr.确实有效.我只是被迫使用`file_put_contents('php:// stderr',$ myDebugVar,FILE_APPEND);`而是,因为我有消息`使用未定义的常量STDERR - 假定'STDERR'`与**fwrite**. (5认同)
  • 您也可以使用“STDOUT”而不是“STERR” (2认同)
  • 是的。它的工作原理似乎与`STDERR` 的输出方式相同。我在 windows cmd 行中使用 `PHPUnit 4.5.0`。`echo` 语句不会给出相同的结果。`echo` 会输出,但仅在显示测试结果之后。`fwrite(STDERR, 'string')` 或 `fwrite(STDOUT,'string')` 产生相同的结果:显示测试结果之前的输出。 (2认同)

Jes*_*ord 33

更新:请参阅下面的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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

得到:

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.
Run Code Online (Sandbox Code Playgroud)

确保禁用测试中的任何其他断言,因为它们可能在测试输出断言之前失败(因此您不会看到输出).


chi*_*him 30

尝试使用 --debug

如果您正在尝试获取包含或源数据文件的正确路径,则非常有用.

  • 这对我来说是正确的答案.在前面的答案中写的所有fwrite语句都不适用于我. (2认同)

jer*_*rke 16

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

\n

示例代码:

\n
    public function testDebugOutputToCli() {\n        var_dump(new DateTime());\n        ob_flush();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

代码和输出的屏幕截图:

\n

使用 ob_flush 回显本来会被 PHPUnit 隐藏的内容的屏幕截图

\n

为什么?PHPUnit始终是输出缓冲,因此我们在调试时需要转储缓冲区

\n

我正在努力解决上面的所有答案,特别是因为所选答案 \xe2\x80\x93using codecept_debug()with--debug正如手册所说的 \xe2\x80\x93 导致了大量的调试输出,这使得它无法为我使用。

\n

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

\n
\n

PHPUnit 手册,测试输出:\xe2\x80\x9c 有时,您想要断言某个方法的执行会生成预期的输出(例如,通过 echo 或 print)。PHPUnit\\Framework\\TestCase 类使用 PHP\xe2\x80\x99s 输出缓冲功能来提供所需的功能。\xe2\x80\x9d

\n
\n

这完全有道理,并解释了为什么我们看不到输出。PHPUnit 正在保存它,以便我们想检查注释!这就是它在我们的实际测试中应该始终工作的方式,我们当然不希望仅仅因为我们调用了一个使用echo.

\n

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

\n

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

\n

PS 还发现此提示隐藏在dev.to 上 Julian 的 How to show var_dumps in phpunit or codeception 中

\n


jas*_*bar 9

这不是一个错误,而是非常有意的.最好的办法是写入某种日志文件并拖尾日志以观察输出.

如果您尝试测试输出,请检查输出.

也:

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


cwe*_*ske 7

您应该考虑一下您的意图:如果您在调试时需要现在的信息来修复测试,那么当测试中断时,您将在下周再次需要它.

这意味着在测试失败时您将始终需要这些信息- 并且添加一个var_dump以查找原因的工作太多了.而是将数据放入您的断言中.

如果您的代码太复杂,请将其拆分,直到达到一个级别,其中一个断言(带有自定义消息)告诉您足以知道它在哪里损坏,为什么以及如何修复代码.

  • 这就是为什么我不喜欢事后猜测用户想要做什么的答案。我来这里是因为我有等待缓存清除的测试。如果缓存 ttl 为 5 秒,这意味着我的测试*似乎挂起*约 16 秒。我只是想向用户发出一些通知:不,没有什么问题,我们只是在等待缓存超时。如果人们能够回答这个问题,那么拥有其他用例的人也会得到答案。 (3认同)
  • 如果您需要在实现这里概述的过程中调试代码怎么办? (2认同)

Bob*_*ein 7

我对VisualPHPUnit运气不错,它确实有助于显示输出等等.

class TestHello extends PHPUnit_Framework_TestCase 
{
    public function test_Hello() 
    {
        print "hello world";
    }
}
Run Code Online (Sandbox Code Playgroud)

TestHello结果


Fab*_*cio 5

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

$ phpunit --verbose -c phpunit.xml 
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是你不需要更改测试代码,你可以打印字符串,var_dump 的 o 任何你想要的东西,并且只有在设置了详细模式时才会在控制台中显示。

我希望这有帮助。


Sla*_*awa 5

PHPUnit 使用ob_start(). 我们可以暂时禁用它。

    public function log($something = null)
    {
        ob_end_clean();
        var_dump($something);
        ob_start();
    }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

100989 次

最近记录:

6 年,8 月 前