8

I have recently configured VS code to debug PHP with xdebug. It works reliably with my application code but when I am running unit tests with PHPunit, my breakpoints are ignored.

My server is run inside a vagrant box.

My php.ini file contains the following lines:

[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

I use the PHP Debug VS Code extension.

This is my launch.json config:

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

My unit tests run fine, for example, from within /var/www/mysite.local, I can run:

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

but while the test will run, a breakpoint I have within the test itself is consistently ignored and I cannot figure out why.

Has anybody had a similar issue? Is there a difference between how debugging works in the context of a normal application request and a unit test?

Pod Mo
  • 248
  • 2
  • 8
jagershark
  • 1,162
  • 3
  • 15
  • 27
  • I think an `xdebug.log` may be more explanatory. Add `xdebug.remote_log=xdebug.log` into your xdebug config and try to debug again a phpunit test. Then edid your question and place the `xdebug.log` into your answer. The `xdebug.log` will be in your project's root. – Dimitrios Desyllas Oct 18 '19 at 07:36

3 Answers3

2

Your problem is happening because of pathMappings settings when you run a unit test with an absolute path, my suggestion is to replace the

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

with

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

or disabled it when you run unit test

Moshe Fortgang
  • 711
  • 4
  • 18
  • Thanks for the answer @mfort. I tried adding `"${workspaceFolder}": "${workspaceFolder}"` to my pathMappings, to no such luck. What exactly should I disable when I run a unit test? – jagershark Aug 26 '19 at 14:51
  • @loxyboi Refer to this line `"/var/www/mysite.local/": "${workspaceFolder}",` replace with `// "/var/www/mysite.local/": "${workspaceFolder}",` – Moshe Fortgang Aug 27 '19 at 10:03
  • Thanks @mfort but that doesn't seem to have solved my problem. – jagershark Aug 27 '19 at 13:05
0

In my case, phpunit was calling the php cli and this latter was not using the php.ini conf file used by my test server which had xdebug activated.

Be sure the right php.ini file is used. You can specify it when calling php with the -c argument.

You can pass this argument to php by editing the launch script of phpunit that can be found in vendor/bin/phpunit.bat (for windows).

The file looks like this:

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

Just add the -c behind php with the path to php.ini directory:

php -c PATH_TO_PHP.INI_DIRECTORY "%BIN_TARGET%" %*
dkg
  • 1,775
  • 14
  • 34
  • The `-c` flag of phpunit is to load an XML file (from the help: `-c|--configuration Read configuration from XML file`) but the `php.ini` file is not an XML document, so how did you get it to load? – Tony Dec 30 '19 at 16:34
  • 1
    That's the `-c` flag of php, not phpunit. I may have not been very clear, let me updated the answer. – dkg Dec 31 '19 at 14:03
0

Do you happen to have your Xdebug 2 set to start on trigger?

xdebug.trace_enable_trigger=1
xdebug.trace_enable=0

xdebug.profile_enable_trigger=1
xdebug.profile_enable=0

On Xdebug 3 with start on trigger (xdebug.start_with_request=trigger), I had to set the xdebug.idekey for vscode. It can also be set using the XDEBUG_CONFIG envvar:

XDEBUG_CONFIG="idekey=VSCODE" phpunit --filter myTestMethod path/to/my/test/file/myTest.php

It seems like vscode checks for any set idekey value; In my browser my Xdebug helper extension has had the idekey set to PHPSTORM, and debugging from there has been working just fine

cjsimon
  • 1,121
  • 12
  • 22
  • You may need to append to the envvar instead if it isn't empty like mine was: `XDEBUG_CONFIG="$XDEBUG_CONFIG \"idekey=VSCODE\""` – cjsimon Mar 31 '23 at 22:55