繁体   English   中英

在 Codeception 中打印调试 output 到控制台

[英]Printing debug output to console in Codeception

很厚的问题,但是有没有办法在 Codeception 中将您自己的调试消息打印到控制台? 我的意思是与断言无关的消息,纯粹用于调试测试本身(例如,就像您在任何常规 PHP 网站中使用var_dump()变量一样)

我已经尝试过var_dump()echoprint但无济于事。 使用WebDebugmakeAResponseDump()也不会产生所需的结果,我只想能够看到我的变量的内容而不必运行像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

objectresource值不会被很好地打印出来。

输出文本后调用ob_flush()

示例代码:

    public function testDebugOutputToCli() {
        var_dump(new DateTime());
        ob_flush();
    }

代码和输出截图:

使用 ob_flush 回显本来会被 PHPUnit 隐藏的内容的屏幕截图

为什么? PHPUnit一直是输出缓冲的,所以我们在调试的时候需要转储缓冲

我在上面的所有答案中苦苦挣扎,特别是因为所选的答案——使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM