• Debugging PHPUnit Tests in NetBeans with XDebug

    by  • May 13, 2011 • PHP, Tips and Tricks, Tools • 4 Comments

    Every now and then you run into this weird situation in your code, where something that was supposed to zig is now zagging and it makes no sense whatsoever. For me this ends up happening in my unit tests since i’m not running everything in the browser everytime and since my tests usually run more scenarios then a regular browser run, that’s where the weird stuff happens.

    So your obvious way out is to add a few var_dumps into the code and try to understand what is happening, if you are doing that: STOP!

    Drop that mouse and step away from your keyboard, you should be debugging not adding code to the mix. So debugging in a browser is a piece of cake in most IDEs like NetBeans and Zend Studio and so forth, but debugging your tests that are running on the command line take a few more cards up your sleeve. So this is how i configured my NetBeans IDE and my PHPUnit tests to communicate and let me debug what happens inside that crazy world.

    Configure your NetBeans Debugging configuration

    This is very straight forward, go to Preferences > PHP and set the debug settings, namely the port and a session id. For example: port 9000 and Session ID netbeans-xdebug.

    Tell Xdebug what you want it to do

    This is done by adding a few settings in you php.ini or if you use additional ini files, I recommend you create a xdebug.ini. You need to configure a few things here, we want xdebug to have remote debugging always enabled and we want to configure the port and ide keys we used in netbeans as well as configuring the output to be “dbgp”. This is how it will look in you ini:

    xdebug.idekey=netbeans-xdebug
    xdebug.remote_enable= On
    xdebug.remote_handler=dbgp
    xdebug.remote_mode=req
    xdebug.remote_host=127.0.0.1
    xdebug.remote_port=9000
    

    Make PHPUnit send stuff to NetBeans

    So this is enough for you to do URL based debugging, but we want to debug our unit tests to pick up on those weird bugs with a easy to repeat script to lock down on it. For this to work you need to export a xdebug config variable in your local environment, so that XDebug kicks off the debugging based on this command line script. You will need to set XDEBUG_CONFIG to “idekey=netbeans-xdebug”, but setting it everytime is a nuisance, so my approach is to create a phpunit-debug file that can do this for me and allows me to kick off debugging by simply changing the executable. This is the content of this file:

    export XDEBUG_CONFIG="idekey=netbeans-xdebug";
    phpunit $@
    

    Make NetBeans start a debug session and not open a browser window

    One last thing is needed for things to run smoothly. When you click on debug in Netbeans the usual process is for it to open up a browser window and debug from there, but we don’t want that, so we need to tell it to not open a browser. This is done by accessing File > Project Properties > Run Configuration and clicking on the “Advanced” button, here you can select “Do no open a browser” and you are set.

    Running Debugging

    To start a debugging session you will need to follow these steps:

    1. Click on “Debug Project” button. Now Netbeans will start waiting for a connection.
    2. Go to command line and run phpunit-debug. Now debugging starts, if you selected “Stop on first line” phpunit file will be opened on your IDE, click play and you are off.

    There you go. Now you are all set to debug your tests and understand better what is triggering that failure deep down inside your suite.

    About

    Rafael Dohms is a PHP Evangelist, Speaker and contributor. He is a very active member of the PHP Community, having helped create and manage two PHP User Groups in Brazil. He shared the lead of PHPSP for 3 wonderful years making a positive mark on the local market. Developer, gamer and lover of code he also hosts Brazil’s first PHP Podcast: PHPSPCast, as well as contributing to well known projects. He moved to the Netherlands in search of new challenges and is now part of the team at WEBclusive, sharing his passion for quality code and working on new awesome ideas with the team. You can always find him at the nearest Community events, speaking, sharing, talking or just learning from the rest.

    http://doh.ms

    4 Responses to Debugging PHPUnit Tests in NetBeans with XDebug

    1. May 13, 2011 at 11:51

      first! o/

    2. Pingback: Debugging PHPUnit Tests in NetBeans with XDebug | Dacoders Pvt. Ltd.

    3. Pingback: Debugging PHPUnit Tests in NetBeans with XDebug | PHP Frameworks

    4. May 19, 2011 at 13:07

      great thing, do you happen to know a way to do the same in phpstorm?

      • Rafael Dohms
        July 2, 2011 at 9:35

        It probably is but i have not had a chance to play with PHPstorm. But the steps should be very similar.

    5. Alberto
      June 6, 2011 at 21:53

      great post.

    6. July 18, 2011 at 10:24

      Great post – thanks.

      Also found out about path mapping – it's on the same dialog as the debug URL. Not seen that screen before!

    7. Pingback: Debugging Zend Framework unit tests with Xdebug and NetBeans ~ Robert Basic

    8. September 28, 2011 at 4:53

      I use free PHP IDE Codelobster PHP Edition with own debugger for PHP development – http://www.codelobster.com

    9. Nasreddine
      January 17, 2012 at 12:55

      Hello,
      How can I execute phpunit-xdebug file on windows machine ?

    10. February 11, 2012 at 15:31

      I am also gntiteg this problem only when I add a watch expression… Please let me know if anyone has resolved this issue. Thanks.

    11. ingo
      April 16, 2012 at 21:44

      hi, thanks for your post!
      i tried to get this working but failed. another alternative that worked for me is described here: https://blogs.oracle.com/netbeansphp/entry/phpuni

    Leave a Reply

    Your email address will not be published. Required fields are marked *