【问题标题】:Is it possible to debug PhpUnit tests with --process-isolation option?是否可以使用 --process-isolation 选项调试 PhpUnit 测试?
【发布时间】:2012-04-06 02:25:13
【问题描述】:

用于单元测试

class SampleTest extends PHPUnit_Framework_TestCase
{
    public function testBreakpoint()
    {
        $a = 18;
    }
}

第 5 行有断点 "$a = 18;",

  • Xdebug v2.1.0,
  • PHPUnit 3.6.10,
  • PHP 5.3.6,
  • ubuntu 10.11

使用 NO --process-isolation 选项运行 unittest 会按预期停止第 5 行的脚本执行。 使用 --process-isolation 选项运行相同的配置不会停止第 5 行的执行。

选项 --process-isolation 使用 https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php 的 runJob 函数中的 'proc_open' 在新进程中运行每个测试

使用带有调试器插件的 PhpStorm 3 和 vim 7 进行测试。它允许调试 PHPUnit 本身,但不能调试测试用例。

有什么方法可以调试 PhpUnit 使用 Xdebug 创建的子进程?可能是 Zend 调试器?

【问题讨论】:

  • 我没有准备好在 PHP Storm 或 VIM 中进行调试,所以你必须尝试一下。如果您以某种方式可以退出环境变量,则可以使用它们触发 Xdebug 或 ZendDebugger。 Zend 示例 QUERY_STRING="start_debug=1&debug_host=10.1.1.17&no_remote=1&debug_port=10000&debug_stop=1" /usr/local/bin/php /var/www/test.php (kb.zend.com/index.php?View=entry&EntryID=130) 。 Xdebug 示例导出 XDEBUG_CONFIG="idekey=session_name" (xdebug.org/docs/remote)。让我知道这是否有效。
  • @SamHennessy 是的,这正是调试 CLI 脚本的方法。在魔术export 命令之后,环境变量就存在了。调试 CLI 脚本不是问题。正如我所提到的,当 PHPUnit 在同一个线程中运行测试用例时,我可以调试单元测试:phpunit SampleTest 就像一个魅力。 phpunit --process-isolation SampleTest 不起作用。最后一个命令创建了 2 个进程:主 PHPUnit 和每个测试的子进程。我只能调试主进程,不能调试子进程,这是个问题。
  • 我的假设是运行 PHPUnit 的用户与 proc_open 操作中使用的用户是同一用户。如果这是真的,那么它应该触发额外的调试会话。我不知道 VIM 或 PHP Storm 是否可以支持多个调试会话。您可能需要在您的个人资料中设置环境变量才能使其正常工作。
  • @SamHennessy 你是对的。不支持多个调试会话。 The issue 已创建半年多。它可以被接受为正确答案。
  • 很高兴能帮您解决这个问题。

标签: php phpunit xdebug phpstorm


【解决方案1】:

如问题中的 cmets 所述。问题是PHP Storm didn't support multiple parallel debugging sessions。

【讨论】:

    【解决方案2】:

    进入 PHPStorm 项目设置 - PHP - 调试并将 Xdebug 设置为“当脚本在项目之外时在第一行强制中断”。

    它应该在某些 main() 方法上中断,如果您跨过几次(或按恢复),它将到达您的测试。

    【讨论】:

    • Yes: 它停在 PHPUnit 的第一行。正如我所说,使用远程调试侦听器或本地调试器(Shift-F9)调试 PHPUnit 本身没有问题。 否:它不会达到我的测试。如果您“越过”甚至“进入”,您就不会到达测试中的断点。调试器不会“进入”proc_open 创建的子进程
    【解决方案3】:

    这不是一个完美的答案,但您可以使用 xdebug_start_trace() 和 xdebug_stop_trace() 调用包围任何代码块,以便为目标代码块生成堆栈跟踪。在测试其他人的代码时,我已经使用它来准确查看单元测试中特定点发生的情况。

    class SampleTest extends PHPUnit_Framework_TestCase
    {
        public function testBreakpoint()
        {
            xdebug_start_trace('/tmp/testBreakPointTrace');
            $a = 18;
            xdebug_stop_trace();
        }
    }
    

    请记住,任何失败都会导致 PHPUnit 的异常处理程序介入并导致堆栈跟踪看起来有点奇怪。如果遇到错误,可以通过添加出口来获得干净的跟踪;在 xdebug_stop_trace 之后调用:

    class SampleTest extends PHPUnit_Framework_TestCase
    {
        public function testBreakpoint()
        {
            xdebug_start_trace('/tmp/testBreakPointTrace');
            $a = 18;
            xdebug_stop_trace();
            exit;
        }
    }
    

    【讨论】:

    • 嗯,它是一个选项,还有 var_dump()。有两个问题:它需要更改代码以进行调试,并且它不像visual debugger那样具有交互性。我目前使用的解决方法是分配给测试的唯一组,因此为该组运行 phpunit 会使该测试单独执行。
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 2019-11-09
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多