测试未命中 Docker + XDebug + VSCode 设置中的断点

Tests not hitting breakpoints in Docker + XDebug + VSCode setup

提问人:dotNET 提问时间:10/24/2023 更新时间:10/24/2023 访问量:38

问:

今天已经花了大半夜和几个小时,浏览了几十篇文章、视频等等,我都无法让它发挥作用。

这是一个 Laravel 10 应用程序,我正在尝试调试一些测试。应用程序在 Docker 容器内运行。以下是我所取得的成就:

  1. 该容器基于应用以及 XDEBUG 并正确运行。php:8.2-apacheList item enter image description here

  2. 我正在通过 INI 文件复制 XDEBUG 设置,并且它们被正确应用。enter image description here

  3. 以下行也来自:phpinfo()

    IDE Key:                      VSCODE
    xdebug.client_host:         host.docker.internal
    xdebug.client_port:         9015
    xdebug.discover_client_host:    On
    xdebug.idekey:                VSCODE
    xdebug.start_with_request       yes
    
  4. launch.jsonXDEBUG 的配置如下所示:

     {
     "name": "Listen for Xdebug",
     "type": "php",
     "request": "launch",
     "port": 9015,
     "log": true,
     "hostname": "0.0.0.0",
     "externalConsole": false,
     "pathMappings": {
       "/var/www/html": "${workspaceRoot}/backend",
     },
     "ignore": [
       "**/vendor/**/*.php"
     ],
     "maxConnections": 100,
     "xdebugSettings": {
       "max_children": 99,
       "max_depth": 3,
     },
    

    },

  5. docker 服务配置如下所示:

     apache-php-8.2:
         build:
           context: ./
           dockerfile: /Dockerfile
           args:
              xdebug_port: 9015
         image: apache
         environment:
           - "APACHE_LOG_DIR:/app"
           - XDEBUG_MODE=develop,debug
           - XDEBUG_CONFIG="idekey=VSCODE"
         ports:
           - "8443:443"
           - "8080:80"
         volumes:
           - ../back:/var/www/html      
         extra_hosts:
          - "host.docker.internal:host-gateway"
    
  6. 最后,如果有什么要做的,这里是它的样子:phpunit.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true">
        <testsuites>
            <testsuite name="Unit">
                <directory>tests/Unit</directory>
            </testsuite>
            <testsuite name="Feature">
                <directory>tests/Feature</directory>
            </testsuite>
        </testsuites>
        <source>
            <include>
                <directory>app</directory>
                <directory>tests</directory>
            </include>
        </source>
        <php>
            <ini name="xdebug.remote_enable" value="1"/>
            <ini name="xdebug.remote_autostart" value="1"/>
    
            <ini name="xdebug.mode" value="debug"/>
            <ini name="xdebug.start_with_request" value="yes"/>
            <ini name="xdebug.client_port" value="9015"/>
            <ini name="xdebug.client_host" value="host.docker.internal"/>
    
            <env name="APP_ENV" value="testing"/>
            <env name="BCRYPT_ROUNDS" value="4"/>
            <env name="CACHE_DRIVER" value="array"/>
            <env name="MAIL_MAILER" value="array"/>
            <env name="QUEUE_CONNECTION" value="sync"/>
            <env name="SESSION_DRIVER" value="array"/>
            <env name="TELESCOPE_ENABLED" value="false"/>
    
            <env name="XDEBUG_CONFIG" value="idekey=VSCODE"/>
        </php>
    </phpunit>
    

其中许多设置都是我在研究过程中积累的,因此可能存在一些冗余或重叠。

有趣的是,当我在浏览器中浏览应用程序时,我的断点被正确命中。似乎只有 PHPUnit 没有停止。测试本身运行正常,我确实看到消息,而不会停止我在这些测试中设置的任何断点。OK(1 test, 1 assertion)

有人可以帮助和指导我在这里做错了什么吗?

php docker apache phpunit xdebug

评论

0赞 LazyOne 10/24/2023
您的第一个屏幕截图(输出的顶部)显示相同但在 PHPUnit 测试中捕获的屏幕截图。我不知道它会在您的 Docker 中如何,但您可以让 Apache 和 CLI 使用不同的 php.ini(这是 PHPUnit 使用的)。如果您直接在 Linux/Mac 主机操作系统上运行 PHP,这是一种常见的设置。您需要确保以相同的方式配置它,即 Xdebug 存在并为 CLI 启用。phpinfo()
0赞 LazyOne 10/24/2023
P.S. 最好避免排队。我没有使用 VSCode,但在 SO 上看到了多个问题/答案,这导致 VSCode 看不到 Xdebug 连接的问题。附注您还可以启用 Xdebug 日志记录并尝试调试它工作的地方(网页)而不是 (CLI / PHPUnit),然后比较它们 - Xdebug 甚至尝试在以后连接/响应的差异等。"hostname": "0.0.0.0",
0赞 LazyOne 10/24/2023
附注 和 -- 这是 Xdebug v2 选项,它们在 Xdebug v3 中不执行任何操作(好吧,Xdebug 可能会在 PHP 的错误日志中打印有关使用过时配置参数的警告)xdebug.remote_enablexdebug.remote_autostart
0赞 dotNET 10/24/2023
@LazyOne:非常感谢您抽出宝贵时间回答。我已经删除并尝试在附加到我的 docker 容器的 shell 内的命令行上捕获。它们似乎具有良好的 xdebug 配置。关于您的上一条评论,我已将它们添加为安全措施,以防万一 phpunit 或其他东西仍在使用旧选项(希望它们的存在不会造成任何伤害)。我仍然无法让它达到断点。关于日志输出,我认为我的 xdebug 配置将输出写入 STDOUT。我确实看到一些 JSON 在终端中被吐出来(一些选项)。hostnamephp -isetBreakPoint
0赞 LazyOne 10/24/2023
1)好吧,那么我能在这里说什么:将你的Xdebug日志指向一个文件,做那些工作和不工作的调试会话(以不同的名称保存文件,以便每个文件只包含1个调试会话)并在这里共享它们 - 也许我们可以从那里看到一些东西。例如,这可能是一个错误的路径映射问题,也许是您在 VSCode launch.json 等中的部分。 2)“希望他们的存在不会造成任何伤害”没有伤害。除了 Xdebug 在 PHP 日志中唠叨它。"ignore":

答: 暂无答案