PHPユニットテストの実行中にCLIで出力するには?


Answers

更新: fwrite(STDERR, print_r($myDebugVar, TRUE));の使用については、 以下のrdlowreyのアップデートを参照してくださいfwrite(STDERR, print_r($myDebugVar, TRUE)); はるかに簡単な回避策として

この動作は意図的です( jasonbarが指摘したように )。 マニュアルの矛盾した状態がPHPUnitにreportedreportedています。

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.

出力アサーションがテストされる前にテストが失敗する可能性があるため、テスト用のアサーションをすべて無効にしてください(したがって出力が表示されません)。

Question

PHPUnitテストを実行しているとき、出力をダンプして1つか2つのものをデバッグできるようにしたいと思います。

私は次のことを試しました( PHPUnit Manualの例に似ています )。

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 reposの HEADバージョンを使用しています。

php -version出力 - 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のバグでしょうか?




このコードが動作するようにソースコード変更しなければならなかったので、 このフォークされたreposの URLを作者に追加する必要があります

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);
    }
}



これはバグではなく、非常に意図的です。 あなたの最善の策は、何らかの種類のログファイルに書き出し、出力を監視するためにログを出力することです。

出力をテストしようとしているなら、 thisチェックthisてください。

また、

注意 :PHPUnitは、テストの実行中に出力されるすべての出力を取り込むことに注意してください。 strictモードでは、出力を出すテストは失敗します。




Hackishですが、動作します:デバッグ出力をメッセージとして例外をスローします。

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

収率:

...
There was 1 error:

1) theTest::testOutput
Exception: hello



Testresults HTMLベースを出力しました。この場合、コンテンツをフラッシュするのに役立ちました:

var_dump($array);
ob_flush();

2番目のPHPメソッドがあります

flush() 

私は試していない。




laravel 5ではdump()を使うことができます。最後のレスポンスの内容をダンプします。

class ExampleTest extends TestCase{
    public function test1()
    {
        $this->post('/user', ['name' => 'Gema']);
        $this->dump();
    }
}

gives




テストを修正するためにデバッグするときに情報が必要な場合は、テストが中断したときに次の週に再度情報が必要になります。

これは、テストが失敗したときに常に情報を必要とすることを意味し、原因を見つけるためにvar_dumpを追加することはあまりにも多くの作業です。 むしろデータをあなたのアサーションに入れてください。

あなたのコードが複雑すぎる場合は、1つのアサーション(カスタムメッセージ付き)が、どこが壊れていたのか、なぜ、どのようにコードを修正するのかを知ることができるレベルに達するまで、コードを分割します。