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


当前回答

下面是PHPUnit 4.x中用于打印调试消息的几个有用方法:

syslog(LOG_DEBUG, "Debug: Message 1!"); More practical example: syslog(LOG_DEBUG, sprintf("%s: Value: %s", __METHOD__, var_export($_GET, TRUE))); Calling syslog() will generate a system log message (see: man syslog.conf). Note: Possible levels: LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING, LOG_ERR, etc. On macOS, to stream the syslog messages in realtime, run: log stream --level debug --predicate 'processImagePath contains "php"' fwrite(STDERR, "LOG: Message 2!\n"); Note: The STDERR constant is not available if reading the PHP script from stdin. Here is the workaround. Note: Instead of STDERR, you can also specify a filename. file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND); Note: Use this method, if you don't have STDERR constant defined. register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND); Note: Use this method, if you'd like to print something at the very end without affecting the tests.

要转储变量,使用var_export(),例如:值:。var_export($some_var, TRUE)。“\ n”。

若要仅在verbose或调试模式下打印上述消息,请参见:是否有一种方法可以判断在测试中——debug或——verbose是否传递给了PHPUnit ?


如果测试输出是测试本身的一部分,请查看:测试输出文档页面。

其他回答

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

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

更新

刚刚发现了另一种方法,它比——verbose命令行选项更好:

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

这让您可以随时将任何内容转储到控制台,而不会出现——verbose CLI选项带来的所有不必要的输出。


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

$this->expectOutputString('foo');

然而,有时调皮一点,看看测试用例中的一次性/临时调试输出是有帮助的。但是,不需要使用var_dump黑客/变通方法。这可以通过在运行测试套件时设置——verbose命令行选项轻松实现。例如:

$ phpunit --verbose -c phpunit.xml

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

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

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

$ phpunit --verbose -c phpunit.xml 

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

我希望这能有所帮助。

这是从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;
    }
}
?>

我必须修改这段代码的源代码才能工作,所以你需要为这个fork repos添加URL到composer,这样才能工作

class TestCase extends \PHPUnit_Framework_TestCase
{
    /**
     *  Save last response
     * @var Response|null A Response instance
     */
    static $lastResponse;
    /**
     *  Modify to save response
     *
     * @param  string $method
     * @param  string $uri
     * @param  array $parameters
     * @param  array $files
     * @param  array $server
     * @param  string $content
     * @param  bool $changeHistory
     * @return \Illuminate\Http\Response
     */
    final public function call(
        $method,
        $uri,
        $parameters = [],
        $files = [],
        $server = [],
        $content = null,
        $changeHistory = true
    ) {

        $response = parent::call($method, $uri, $parameters, $files, $server, $content, $changeHistory);
        static::$lastResponse = $this->client->getResponse();
        return $response;
    }


    /**
     * Modify message to add response text
     *
     * @param mixed $value
     * @param PHPUnit_Framework_Constraint $constraint
     * @param string $message
     * @since  Method available since Release 3.0.0
     */
    final public static function assertThat($value, PHPUnit_Framework_Constraint $constraint, $message = '')
    {
        $message .= PHP_EOL . static::$lastResponse . PHP_EOL;
        parent::assertThat($value, $constraint, $message);
    }
}