[英]Printing debug output to console in Codeception
很厚的问题,但是有没有办法在 Codeception 中将您自己的调试消息打印到控制台? 我的意思是与断言无关的消息,纯粹用于调试测试本身(例如,就像您在任何常规 PHP 网站中使用var_dump()
变量一样)
我已经尝试过var_dump()
、 echo
和print
但无济于事。 使用WebDebug
的makeAResponseDump()
也不会产生所需的结果,我只想能够看到我的变量的内容而不必运行像xdebug这样的调试器。
请参阅调试,其中说
您可以使用 codecept_debug 函数打印测试中的任何信息。
我在*Cept类中使用它:
codecept_debug($myVar);
您的调试输出仅在您使用 --debug 运行时可见(-v 不显示,但 -vv 和 -vvv 显示):
codecept run --debug
输出看起来像:
Validate MyEntity table insert (MyCept)
Scenario:
* I persist entity "AppBundle\Entity\MyEntity"
AppBundle\Entity\MyEntity Object
(
[Id:AppBundle\Entity\MyEntity:private] => 1
[Description:AppBundle\Entity\MyEntity:private] => Description
)
PASSED
\Codeception\Util\Debug::debug($this->em);die();
并使用--debug
标志运行 Codeception。
我似乎通过使用辅助类找到了解决此问题的方法:
class WebHelper extends \Codeception\Module
{
public function seeMyVar($var){
$this->debug($var);
}
}
并像这样调用类:
$foo = array('one','two');
$I->seeMyVar($foo);
然后我得到了我正在寻找的调试输出
I see my var "lambda function"
Array
(
[0] => one
[1] => two
)
我会接受这是一个临时解决方案,但是我想保持我的断言干净,而不是用升级到测试功能的 var_dumps 来混淆它们,所以如果有人有一个概念上正确的解决方案,请提交
或者您可以使用详细控制命令,例如:
codecept run -vvv
其中每个v
增加输出的详细程度(默认情况下非常安静)。
默认情况下,Codeception 表示存在错误,但没有详细显示。 但是,根据这篇博客文章,添加 --debug 会详细显示错误。
codecept run --debug
简短版本将是codecept run tests/acceptance/SomeCest.php -d
-d 将显示步骤和调试
绝对带有--debug
选项的codecept_debug
是正确的方法之一。
但是--debug
显示了很多冗长的内容,我们可能不需要所有时间来查看单个变量的值。 有时我们可能需要在 CLI 上滚动很多才能到达我们的变量
然而,还有另一种简短、漂亮且简单的方法
使用assertSame
以 true 或任何随机值断言变量以显示/var_dump 变量
假设我需要看看$mango
里面有什么,我确定它不是真的或“随机的东西”
$I->assertTrue($mango)
$I->assertSame($mango, 'something random') // I am pretty sure $mango does not equals to 'something random'
上面的语句会在打印出$mango
时抛出错误,最好的部分是它会打印在底部,所以不需要滚动也没有冗长。 同样以这种方式不需要在 CLI 命令中添加--debug
局限性:
PHP 中的 10 种数据类型
Four scalar types:
bool
int
float (floating-point number, aka double)
string
Four compound types:
array
object
callable
iterable
And finally two special types:
resource
NULL
以上我的方式只适用于 6:
Four scalar types:
bool
int
float (floating-point number, aka double)
string
One compound types:
array
And finally one special types:
NULL
object
, resource
值不会被很好地打印出来。
ob_flush()
示例代码:
public function testDebugOutputToCli() {
var_dump(new DateTime());
ob_flush();
}
代码和输出截图:
我在上面的所有答案中苦苦挣扎,特别是因为所选的答案——使用codecept_debug()
和--debug
正如手册所说——导致了大量的调试输出,使我无法使用它。
我像一个好书呆子一样阅读 PHPUnit 手册并偶然发现了这一点,我认为这解释了导致整个 PHPUnit 整个问题的原因,而不仅仅是 Codeception:
PHPUnit 手册,测试输出:“有时您想断言某个方法的执行,例如,生成预期的输出(例如,通过 echo 或 print)。 PHPUnit\\Framework\\TestCase 类使用 PHP 的输出缓冲功能来提供所需的功能。”
这完全有道理并解释了为什么我们看不到输出。 PHPUnit 正在保存它,以防我们要检查注释! 这就是它在我们的实际测试中应该始终工作的方式,我们当然不希望随机的东西仅仅因为我们调用了一个使用echo
的函数而出现在屏幕上。
但是当我们调试的时候,我们只想马上看到文本,理解这一切,解决方案很明确:只需使用ob_flush()
打印输出缓冲区的内容!
为阅读有趣的手册而欢呼三声!
PS还发现这个技巧隐藏在如何在phpunit中显示var_dumps或由Julian在dev.to上的codeception中显示
根据 OP
我只想能够看到我的变量的内容
如果你有一个像
$var="hello";
你想在控制台中输出它然后简单地做
$I->comment($var);
use Codeception\Lib\Console\Output;
$c = new Output([]);
$c->writeln("");
$c->writeln("<info>info</info>");
$c->writeln("<debug>debug</debug>");
$c->writeln("<comment>debug</comment>");
$c->writeln("<error>error</error>");
不需要嘈杂的调试标志。 所有控制台控制字符都有效,例如 \t 选项卡等 干净的内置解决方案
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.