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

2022-08-30 06:25:07

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


答案 1

更新

刚刚意识到另一种方法,比命令行选项效果好得多:--verbose

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

这使您可以随时将任何内容转储到控制台,而无需CLI选项附带的所有不需要的输出。--verbose


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

$this->expectOutputString('foo');

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

$ phpunit --verbose -c phpunit.xml

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

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


答案 2

更新:请参阅下面 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.

请务必禁用您为测试设置的任何其他断言,因为它们可能会在测试输出断言之前失败(因此您不会看到输出)。


推荐