PHPUnit:在testingdebugging期间的CLI输出可能吗?

当运行一个PHPUnittesting,我想能够转储输出,所以我可以debugging一个或两个东西。

我已经尝试了以下(类似于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的错误?

UPDATE

刚刚意识到另一种方式来做到这一点比--verbose命令行选项更好:

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

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


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

 $this->expectOutputString('foo'); 

但是,有时在您的testing用例中调皮一下,看到一次性/临时debugging输出会很有帮助。 不过,没有必要使用var_dump hack / workaround。 这可以通过在运行testing套件时设置--verbose命令行选项来轻松完成。 例如:

 $ phpunit --verbose -c phpunit.xml 

这将在CLI环境中运行时显示您的testing方法内的输出。

更新:关于使用fwrite(STDERR, print_r($myDebugVar, TRUE));请参阅rdlowrey的更新 fwrite(STDERR, print_r($myDebugVar, TRUE)); 作为一个更简单的工作


这种行为是故意的(正如贾森巴 指出的那样 )。 本手册的冲突状态已经被报告给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. 

一定要禁用任何其他断言你有testing,因为他们可能会失败之前,testing输出断言(因此你不会看到输出)。

尝试使用--debug

如果您正在尝试获取包含或源数据文件的正确path,那么这很有用。

这不是一个错误,而是非常有意的。 最好的办法是写入某种types的日志文件,并将日志logging下来以便观察输出。

如果你正在尝试输出,请检查这一点 。

也:

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

我对VisualPHPUnit有一些好运, 除此之外 ,它确实有助于显示输出。

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

TestHello结果

你应该真的考虑你的意图:如果你现在需要debugging信息来修复testing,那么当testing中断的时候,你会在下周再次需要它。

这意味着当testing失败的时候你总是需要这些信息 – 并且添加一个var_dump来查找原因只是太多的工作。 而是把数据放到你的断言中。

如果你的代码太复杂了,就把它分开,直到你达到一个断言(带有一个自定义消息)的程度,告诉你足够的知道它破坏的地方,为什么以及如何修正代码。

对于某些情况,可以使用类似的东西来输出一些东西给控制台

 class yourTests extends PHPUnit_Framework_TestCase { /* Add Warnings */ protected function addWarning($msg, Exception $previous = null) { $add_warning = $this->getTestResultObject(); $msg = new PHPUnit_Framework_Warning($msg, 0, $previous); $add_warning->addWarning($this, $msg, time()); $this->setTestResultObject($add_warning); } /* Add errors */ protected function addError($msg, Exception $previous = null) { $add_error = $this->getTestResultObject(); $msg = new PHPUnit_Framework_AssertionFailedError($msg, 0, $previous); $add_error->addError($this, $msg, time()); $this->setTestResultObject($add_error); } /* Add failures */ protected function addFailure($msg, Exception $previous = null) { $add_failure = $this->getTestResultObject(); $msg = new PHPUnit_Framework_AssertionFailedError($msg, 0, $previous); $add_failure->addFailure($this, $msg, time()); $this->setTestResultObject($add_failure); } public function test_messages() { $this->addWarning("Your warning message!"); $this->addError("Your error message!"); $this->addFailure("Your Failure message"); } /* Or just mark test states! */ public function test_testMarking() { $this->markTestIncomplete(); $this->markTestSkipped(); } } 

这来自https://phpunit.de/manual/current/en/fixtures.html

这应该允许您在phpunittesting生命周期中的任何时候丢弃信息。

只需将下面的代码中的__METHOD__replace为您想要输出的内容即可

例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; } } ?> 

在laravel 5中,你可以使用dump(),转储最后一个响应的内容。

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

我输出我的testing结果基于HTML,在这种情况下刷新内容是有帮助的:

 var_dump($array); ob_flush(); 

还有第二个PHP方法

 flush() 

我没有试过。

我不得不修改此代码的源代码工作,所以你需要添加这个分叉回购协议的composer php的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); } }