【问题标题】:Debugging PHPUnit tests in VS Code?在 VS Code 中调试 PHPUnit 测试?
【发布时间】:2019-12-29 09:32:05
【问题描述】:

我最近配置了 VS 代码来使用 xdebug 调试 PHP。它可以可靠地与我的应用程序代码一起工作,但是当我使用 PHPunit 运行单元测试时,我的断点会被忽略。

我的服务器在一个 vagrant box 中运行。

我的php.ini 文件包含以下几行:

[xdebug]
zend_extension="/usr/lib/xdebug/xdebug-2.2.7/modules/xdebug.so" 
xdebug.remote_enable=1
xdebug.remote_port=9000
xdebug.remote_connect_back=1
xdebug.remote_autostart=1

我使用PHP Debug VS Code 扩展。

这是我的launch.json 配置:

{
    "name": "Listen for XDebug",
    "type": "php",
    "request": "launch",
    "pathMappings": {
        "/var/www/mysite.local/": "${workspaceFolder}"
    },
    "port": 9000,
    "log": true
}

我的单元测试运行良好,例如,在/var/www/mysite.local 内,我可以运行:

phpunit --filter myTestMethod path/to/my/test/file/myTest.php

但是当测试将运行时,我在测试本身中的断点始终被忽略,我无法弄清楚原因。

有人遇到过类似的问题吗?在正常的应用程序请求和单元测试的上下文中调试的工作方式有区别吗?

【问题讨论】:

  • 我认为xdebug.log 可能更具解释性。将xdebug.remote_log=xdebug.log 添加到您的xdebug 配置中并尝试再次调试phpunit 测试。然后编辑您的问题并将xdebug.log 放入您的答案中。 xdebug.log 将位于项目的根目录中。

标签: php visual-studio-code phpunit vscode-debugger


【解决方案1】:

当您使用绝对路径运行单元测试时,由于pathMappings 设置,您的问题正在发生,我的建议是替换

   "pathMappings": {
        "/var/www/mysite.local/": "${workspaceFolder}"
    },

   "pathMappings": {
        "/var/www/mysite.local/": "${workspaceFolder}",
        "${workspaceFolder}": "${workspaceFolder}"
    },

或在运行单元测试时禁用它

【讨论】:

  • 感谢@mfort 的回答。我尝试将"${workspaceFolder}": "${workspaceFolder}" 添加到我的路径映射中,但没有这样的运气。运行单元测试时应该禁用什么?
  • @loxyboi 参考这一行"/var/www/mysite.local/": "${workspaceFolder}",替换为// "/var/www/mysite.local/": "${workspaceFolder}",
  • 谢谢@mfort,但这似乎并没有解决我的问题。
【解决方案2】:

在我的例子中,phpunit 正在调用 php cli,而后者没有使用我的测试服务器使用的 php.ini conf 文件,该文件已激活 xdebug。

确保使用了正确的 php.ini 文件。您可以在使用-c 参数调用php 时指定它。

您可以通过编辑可以在 vendor/bin/phpunit.bat 中找到的 phpunit 的启动脚本(对于 windows)来将此参数传递给 php。

文件如下所示:

@ECHO OFF
setlocal DISABLEDELAYEDEXPANSION
SET BIN_TARGET=%~dp0/../phpunit/phpunit/phpunit
php "%BIN_TARGET%" %*

只需在 php 后面添加-c 和 php.ini 目录的路径即可:

php -c PATH_TO_PHP.INI_DIRECTORY "%BIN_TARGET%" %*

【讨论】:

  • phpunit 的-c 标志是加载一个XML 文件(来自帮助:-c|--configuration <file> Read configuration from XML file)但是php.ini 文件不是一个XML 文档,那么你是如何加载它的?
  • 那是 php 的 -c 标志,而不是 phpunit。我可能不是很清楚,让我更新答案。
猜你喜欢
  • 2021-05-12
  • 2019-10-10
  • 2017-10-02
  • 2020-12-16
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多