[php] PHP 단위 테스트를 실행하는 동안 CLI로 출력하는 방법은 무엇입니까?

PHPUnit 테스트를 실행할 때 출력을 덤프하여 하나 또는 두 가지를 디버깅 할 수 있기를 원합니다.

나는 다음을 시도했다 ( 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 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 버그입니까?



답변

최신 정보

--verbose커맨드 라인 옵션 보다 훨씬 잘 작동하는 다른 방법을 깨달았습니다 .

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

이를 통해 --verboseCLI 옵션 과 함께 제공되는 원치 않는 모든 출력없이 언제든지 콘솔에 무엇이든 덤프 할 수 있습니다 .


다른 답변에서 언급했듯이 다음과 같은 내장 방법을 사용하여 출력을 테스트하는 것이 가장 좋습니다.

$this->expectOutputString('foo');

그러나 때로는 테스트 케이스 내에서 장난 꾸러기 일회성 / 일시적 디버깅 결과를 보는 것이 도움이됩니다. var_dump그러나 해킹 / 해결 방법이 필요하지 않습니다 . --verbose테스트 스위트를 실행할 때 명령 행 옵션 을 설정하면 쉽게 수행 할 수 있습니다 . 예를 들면 다음과 같습니다.

$ phpunit --verbose -c phpunit.xml

CLI 환경에서 실행할 때 테스트 메소드 내부의 출력이 표시됩니다.

PHPUnit 테스트 테스트 출력 작성을 참조하십시오 .


답변

업데이트 : 훨씬 간단한 해결 방법으로 사용하는 방법에 대해서는 아래 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.

출력 어설 션을 테스트하기 전에 테스트에 실패한 다른 어설 션을 비활성화해야합니다 (따라서 출력이 표시되지 않음).


답변

사용해보십시오 --debug

포함 또는 소스 데이터 파일의 올바른 경로를 얻으려고 할 때 유용합니다.


답변

버그는 아니지만 의도적입니다. 가장 좋은 방법은 어떤 종류의 로그 파일에 쓰고 로그를 출력하여 출력을 감시하는 것입니다.

출력을 테스트하려는 경우 이를 확인 하십시오 .

또한:

참고 : PHPUnit은 테스트 실행 중 발생하는 모든 출력을 삼킨다는 점에 유의하십시오. 엄격 모드에서는 출력을 방출하는 테스트가 실패합니다.


답변

VisualPHPUnit 과 함께 운이 좋으며 무엇보다도 출력을 유용하게 보여줍니다.

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

TestHello 결과


답변

의도를 생각해야합니다. 테스트를 수정하기 위해 디버깅 할 때 정보가 필요하면 테스트가 중단 될 때 다음 주에 다시 정보가 필요합니다.

이것은 테스트가 실패 할 때 항상 정보가 필요하다는 것을 의미합니다 var_dump. 원인을 찾기 위해를 추가하는 것은 너무 많은 작업입니다. 오히려 데이터를 어설 션에 넣습니다.

코드가 너무 복잡하면 사용자 지정 메시지가있는 하나의 어설 션이 코드의 위치, 이유 및 방법을 알 수있는 수준을 알 수있는 수준에 도달 할 때까지 코드를 분할하십시오.


답변

laravel 5에서는 dump ()를 사용할 수 있으며 마지막 응답에서 내용을 덤프합니다.

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

준다