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"; } }
你应该真的考虑你的意图:如果你现在需要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); } }