在Codeception中将调试输出打印到控制台

时间:2014-02-19 07:24:42

标签: php debugging console output codeception

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

我已经尝试var_dump()echoprint,但无济于事。使用WebDebug的{​​{1}}也不会产生所需的结果,我只是希望能够看到我的变量的内容,而无需运行像 xdebug 这样的调试器。

9 个答案:

答案 0 :(得分:47)

请参阅Debugging说明

  

您可以使用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 

答案 1 :(得分:45)

\Codeception\Util\Debug::debug($this->em);die();

并使用--debug标志运行Codeception。

答案 2 :(得分:10)

我似乎通过使用帮助程序类找到了解决问题的方法:

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升级到测试功能,所以如果有人有一个概念上正确的解决方案,请提交

答案 3 :(得分:6)

或者您可以使用详细程度控制命令,如:

codecept run -vvv

其中每个v增加输出的详细程度(默认情况下非常安静)。

答案 4 :(得分:2)

默认情况下,Codeception表示存在错误但未详细显示。但是根据this blog post添加--debug会详细显示错误。

codecept run --debug

答案 5 :(得分:0)

短版本将是 codecept run tests/acceptance/SomeCest.php -d
-d将显示步骤和调试

答案 6 :(得分:0)

简短、漂亮、简单的方法

绝对 codecept_debug--debug 选项是正确的方法之一。

但是 --debug 显示了很多冗长的内容,我们可能不需要所有时间来查看单个变量的值。 有时我们可能需要在 CLI 上滚动很多才能到达我们的变量

然而,还有另一种简短、漂亮且简单的方法

使用 assertSame 显示/var_dump 变量,使用 true 或任何随机值断言变量

假设我需要查看 $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 的值不会被很好地打印出来。

答案 7 :(得分:0)

输出文本后调用ob_flush()

示例代码:

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

代码和输出截图:

Screenshot of using ob_flush to echo out content that would otherwise have been hidden by PHPUnit

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

我一直在为上面的所有答案而苦苦挣扎,尤其是因为所选的答案——使用 codecept_debug()--debug,如手册所述——导致了大量调试输出,使我无法使用.

我像个书呆子一样阅读 PHPUnit 手册并偶然发现了这一点,我认为这解释了导致整个 PHPUnit 整个问题的原因,而不仅仅是 Codeception:

<块引用>

PHPUnit manual, Testing Output:“有时你想断言一个方法的执行,例如,产生一个预期的输出(例如,通过 echo 或 print)。 PHPUnit\Framework\TestCase 类使用 PHP 的输出缓冲功能来提供所需的功能。”

这完全有道理并解释了为什么我们看不到输出。 PHPUnit 正在保存它,以防我们要检查注释!这就是它在我们的实际测试中应该始终工作的方式,我们当然不希望随机的东西仅仅因为我们调用了一个使用 echo 的函数而出现在屏幕上。

但是在调试的时候,我们只想马上看到文字,明白了这一切,解决办法很明确:只要使用ob_flush()按需打印输出缓冲区的内容!

为阅读有趣的手册而喝三声!

附言还发现此提示隐藏在 How to show var_dumps in phpunit or codeception by Julian on dev.to

答案 8 :(得分:0)

根据 OP

<块引用>

我只想能够看到我的变量的内容

如果你有一个像

这样的变量
$var="hello";

并且你想在控制台输出它然后简单地做

$I->comment($var);