【问题标题】:Printing debug output to console in Codeception在 Codeception 中将调试输出打印到控制台
【发布时间】:2014-03-19 09:13:15
【问题描述】:

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

我已经尝试过var_dump()echoprint,但无济于事。使用WebDebugmakeAResponseDump() 也不会产生所需的结果,我只想能够看到我的变量的内容,而不必运行像 xdebug 这样的调试器。

【问题讨论】:

    标签: php debugging console output codeception


    【解决方案1】:

    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 
    

    【讨论】:

    • 这对我有用。只是希望我可以拥有这个自定义和临时调试输出,而不会看到每次运行都会显示的所有 --debug 内容。
    【解决方案2】:
    \Codeception\Util\Debug::debug($this->em);die();
    

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

    【讨论】:

    • 调试方法无所谓。你可以使用var_dump()。如果你运行 phpunit 测试,甚至 --debug 都没有必要。
    【解决方案3】:

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

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

    【讨论】:

    • 我开始觉得我有点笨,因为没有看到明显的方法来做到这一点。感谢您分享您的解决方案!
    • 为什么不直接打电话给var_dumpprint_rprint?它适用于我在tryToTest
    • 因为上述两种方法在我的测试中都不起作用,也许现在有一个更新的版本,因为原来的帖子让它对你有用?
    • 添加 -v 或 -vv , -vvv 标志将使您的所有 print_r 和 var_dump 在输出中可见。
    【解决方案4】:

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

    codecept run -vvv
    

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

    【讨论】:

      【解决方案5】:

      默认情况下,Codeception 说有一个错误,但没有详细显示。但是根据this blog post 添加--debug 会详细显示错误。

      codecept run --debug

      【讨论】:

        【解决方案6】:

        短小精悍的方法

        绝对codecept_debug--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 的值不会很好地打印出来。

        【讨论】:

          【解决方案7】:

          输出文字后直接调用ob_flush()

          示例代码:

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

          代码和输出截图:

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

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

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

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

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

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

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

          附:还发现隐藏在How to show var_dumps in phpunit or codeception by Julian on dev.to中的这个提示

          【讨论】:

          • 令人难以置信的是,多个问题的数十个答案都没有谈到这一点。感谢您最终提出一个好的工作解决方案。我可以做更多的事情来让更多人看到这一点吗?
          • 谢谢,很高兴它有帮助,希望我们可以传播这个词哈哈。除了否决其他答案(这真的很讨厌)之外,您的评论可能是最好的。
          【解决方案8】:

          根据 OP 的规定

          我只是希望能够看到我的变量的内容

          如果你有类似的变量

          $var="hello";
          

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

          $I->comment($var);
          

          $I 是AcceptanceTester class 的默认对象名称

          【讨论】:

          • $I 应该代表什么?
          • @ThaJay 这是 AcceptanceTester 类的默认对象名称
          • 这是唯一对我有用的,因为我需要同时登录测试和测试代码。
          • 是的,我对这里所有无用的答案都这样做了,因此它有助于将好的答案放在首位。如果您在答案中解释它何时起作用或不起作用以及为什么起作用,我准备删除对此的反对票。在我看来,大多数人都在寻找一些简单但总是有效的东西。这意味着正确答案是:“使用任何日志记录功能,然后使用ob_flush()”。您的建议旨在将 cmets 添加到测试的输出中,这在某些情况下是可用的,但并不是这个特定问题的真正答案。我只是想让 php 对每个人来说都不那么奇怪。
          • 我看到你已经根据我昨天的问题改进了答案,很好:)
          【解决方案9】:

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

          【讨论】:

            猜你喜欢
            • 2016-05-21
            • 1970-01-01
            • 2021-12-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-04
            相关资源
            最近更新 更多