Jes*_*ord 132 php phpunit unit-testing
在运行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);
}
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Run Code Online (Sandbox Code Playgroud)
请注意,没有预期的输出.
我在2011年9月19日使用了HEAD版本的git repos.
产量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
Run Code Online (Sandbox Code Playgroud)
有什么我做错了,或者这可能是一个PHPUnit错误?
rdl*_*rey 173
UPDATE
刚刚意识到另一种方法,它比--verbose命令行选项更好地工作:
class TestSomething extends PHPUnit_Framework_TestCase {
function testSomething() {
$myDebugVar = array(1, 2, 3);
fwrite(STDERR, print_r($myDebugVar, TRUE));
}
}
Run Code Online (Sandbox Code Playgroud)
这使您可以随时将任何内容转储到控制台,而不会出现--verboseCLI选项随附的所有不需要的输出.
正如其他答案所指出的那样,最好使用内置方法测试输出,例如:
$this->expectOutputString('foo');
Run Code Online (Sandbox Code Playgroud)
但是,有时候调侃并从测试用例中看到一次性/临时调试输出是有帮助的.但是,不需要var_dump黑客/解决方法.这可以通过--verbose在运行测试套件时设置命令行选项轻松完成.例如:
$ phpunit --verbose -c phpunit.xml
Run Code Online (Sandbox Code Playgroud)
在CLI环境中运行时,这将显示测试方法内部的输出.
请参阅:为PHPUnit编写测试 - 测试输出.
Jes*_*ord 33
更新:请参阅下面的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);
}
}
Run Code Online (Sandbox Code Playgroud)
得到:
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.
Run Code Online (Sandbox Code Playgroud)
确保禁用测试中的任何其他断言,因为它们可能在测试输出断言之前失败(因此您不会看到输出).
chi*_*him 30
尝试使用 --debug
如果您正在尝试获取包含或源数据文件的正确路径,则非常有用.
jer*_*rke 16
ob_flush()输出文本后调用即可示例代码:
\n public function testDebugOutputToCli() {\n var_dump(new DateTime());\n ob_flush();\n }\nRun Code Online (Sandbox Code Playgroud)\n代码和输出的屏幕截图:
\n\n我正在努力解决上面的所有答案,特别是因为所选答案 \xe2\x80\x93using codecept_debug()with--debug正如手册所说的 \xe2\x80\x93 导致了大量的调试输出,这使得它无法为我使用。
我像一个书呆子一样阅读 PHPUnit 手册,并偶然发现了这一点,我认为这解释了导致整个 PHPUnit 整个问题的原因,而不仅仅是 Codeception:
\n\n\nPHPUnit 手册,测试输出:\xe2\x80\x9c 有时,您想要断言某个方法的执行会生成预期的输出(例如,通过 echo 或 print)。PHPUnit\\Framework\\TestCase 类使用 PHP\xe2\x80\x99s 输出缓冲功能来提供所需的功能。\xe2\x80\x9d
\n
这完全有道理,并解释了为什么我们看不到输出。PHPUnit 正在保存它,以便我们想检查注释!这就是它在我们的实际测试中应该始终工作的方式,我们当然不希望仅仅因为我们调用了一个使用echo.
但是当我们调试时,我们只想立即看到文本,并且理解了这一切,解决方案就很明确了:只需使用ob_flush()按需打印输出缓冲区的内容即可!
为阅读有趣的手册而欢呼三声!
\nPS 还发现此提示隐藏在dev.to 上 Julian 的 How to show var_dumps in phpunit or codeception 中
\n您应该考虑一下您的意图:如果您在调试时需要现在的信息来修复测试,那么当测试中断时,您将在下周再次需要它.
这意味着在测试失败时您将始终需要这些信息- 并且添加一个var_dump以查找原因的工作太多了.而是将数据放入您的断言中.
如果您的代码太复杂,请将其拆分,直到达到一个级别,其中一个断言(带有自定义消息)告诉您足以知道它在哪里损坏,为什么以及如何修复代码.
我对VisualPHPUnit运气不错,它确实有助于显示输出等等.
class TestHello extends PHPUnit_Framework_TestCase
{
public function test_Hello()
{
print "hello world";
}
}
Run Code Online (Sandbox Code Playgroud)

执行phpunit时只需使用--verbose标志。
$ phpunit --verbose -c phpunit.xml
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是你不需要更改测试代码,你可以打印字符串,var_dump 的 o 任何你想要的东西,并且只有在设置了详细模式时才会在控制台中显示。
我希望这有帮助。
PHPUnit 使用ob_start(). 我们可以暂时禁用它。
public function log($something = null)
{
ob_end_clean();
var_dump($something);
ob_start();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100989 次 |
| 最近记录: |