Homestead Vagrant xdebug3 vscode phpspec

Updated: 18 July 2021

Reset to original state

./vagrant destroy --force && ./vagrant up


    "version": "0.2.0",
    "configurations": [
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "log": true,
            "pathMappings": {
                "/home/vagrant/homestead.test": "/home/chris/code/homestead.test"

Start an ssh session

./vagrant ssh

Create the xdebug log file

sudo touch /var/log/xdebug.log && sudo chmod 777 /var/log/xdebug.log

Create xdebug settings
sudo nano /etc/php/7.4/fpm/conf.d/20-xdebug.ini
xdebug.mode = debug
xdebug.discover_client_host = true
xdebug.client_host =
xdebug.client_port = 9003
xdebug.max_nesting_level = 512

; required for cli debugging but for browser
; could omit and use query string at end
; of url instead XDEBUG_SESSION_START=name
xdebug.start_with_request = yes

; ensure file exists and is writeable
xdebug.log = /var/log/xdebug.log

Switch to cli PHP 7.4


For cli debugging (alias xon=’sudo phpenmod -s cli xdebug’)


After these changes

./vagrant reload --provision

Run phpspec

./vagrant ssh
tail -f /var/log/xdebug.log
project/dir vendor/bin/phpspec run

If vscode will not stop on a breakpoint try re-enabling PHP Debug extension and restarting vscode.

Run ngrok (outside of Homestead) pointing at a configured Homestead site

ngrok http


Updated: 30 March 2021

Unit Tests

phpunit & phpspec

This type of testing calls methods of an object. Test doubles are used in place of all but the simplest object dependencies of the class under test.

Integration Tests


This type of testing calls methods on an object. Unlike unit testing, the real object dependencies of the class under test are used.

Functional Tests

phpunit & behat

This type of testing does not call the methods of an object directly. Instead, functional testing involves writing code which commands a http client or browser. The general cycle:

  1. Make a request.
  2. Click on a link or submit a form.
  3. Test the response.
  4. Reset fixtures and repeat.

Can also test an http API response.