2012-03-21 22 views
5

Para unittest¿Es posible depurar las pruebas de PhpUnit con la opción --process-isolation?

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     $a = 18; 
    } 
} 

con punto de interrupción en la línea 5 "$ a = 18;",

  • v2.1.0 Xdebug,
  • PHPUnit 3.6.10,
  • PHP 5.3.6 ,
  • ubuntu 10,11

unidad de Ejecución la prueba con NO --process-isolation option detiene la ejecución del script en la línea 5, como se esperaba. Ejecución de la misma configuración con la opción --process aislamiento no se detiene la ejecución en la línea 5.

La opción --process aislamiento ejecuta todas las pruebas en el nuevo proceso utilizando 'proc_open' en función de runJob en https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php

Probado con PhpStorm 3 y vim 7 con el plugin de depuración. Permite depurar PHPUnit, pero no testcases.

¿Hay alguna forma de depurar el proceso secundario creado por PhpUnit usando Xdebug? puede ser Zend Debugger?

+0

No estoy configurado para la depuración en PHP Storm o VIM, por lo que tendrá que probar esto. Si de alguna manera puede tener salidas de variables ambientales, podría disparar Xdebug o ZendDebugger con esas. Ejemplo Zend QUERY_STRING = "start_debug = 1 & debug_host = 10.1.1.17 & no_remote = 1 & debug_port = 10000 & debug_stop = 1"/usr/local/bin/php /var/www/test.php (http://kb.zend.com/index.php ? View = entry & EntryID = 130). Xdebug example export XDEBUG_CONFIG = "idekey = session_name" (http://xdebug.org/docs/remote). Avísame si eso funciona. – SamHennessy

+0

@SamHennessy sí, es exactamente la manera de depurar las secuencias de comandos CLI. Las variables ambientales se hicieron existentes después del comando mágico 'export'. No es un problema depurar scripts CLI. Como mencioné, puedo depurar pruebas de unidad cuando PHPUnit ejecuta testcases en el mismo hilo: 'phpunit SampleTest' funciona como un amuleto. El 'phpunit --process-isolation SampleTest' no funciona. El último comando crea 2 procesos: la PHPUnit principal y un elemento secundario para cada prueba. Solo puedo depurar el proceso principal, pero no el niño, y eso es un problema. –

+1

Mis suposiciones eran que el usuario con el que se ejecutó PHPUnit sería el mismo usuario que el usuario utilizado en la operación proc_open. Si eso es cierto, entonces debería desencadenar sesiones de depuración adicionales. No sé si VIM o PHP Storm pueden soportar múltiples sesiones de depuración. Es posible que necesite establecer los archivos en su perfil para que funcione. – SamHennessy

Respuesta

2

entrar en la configuración del proyecto PhpStorm - PHP - Depuración y establecer Xdebug para "romper vigente en primera línea cuando la escritura está fuera del proyecto" ..

Debe roto en algún método main() .. y si paso un par de veces (o presione reanudar), alcanzará su prueba

+0

** Sí: ** se detiene en la primera línea de PHPUnit. Como estaba diciendo, no hay problema para depurar PHPUnit por sí mismo, ya sea utilizando un detector de depuración remota o un depurador local (Shift-F9). ** No: ** no alcanzará mi prueba. Si 'da un paso hacia adelante' o incluso 'entra', no alcanza el punto de corte en su prueba. El depurador no 'entra' en el proceso hijo creado por [proc_open] (http://php.net/manual/en/function.proc-open.php) –

1

Esta no es una respuesta perfecta, pero puede rodear cualquier bloque de código con xdebug_start_trace() y xdebug_stop_trace() llamadas para generar una pila rastrear para un bloque de código específico. Lo he usado para ver exactamente lo que sucede en puntos específicos de mis pruebas unitarias cuando pruebo el código de otras personas.

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     xdebug_start_trace('/tmp/testBreakPointTrace'); 
     $a = 18; 
     xdebug_stop_trace(); 
    } 
} 

Hemos de tener en cuenta que cualquier fallo causará gestor de excepciones de PHPUnit a intervenir y hacer que el seguimiento de la pila para mirar un poco extraño. Si obtiene un error, puede obtener un seguimiento limpio agregando una salida; llamar a la derecha después de xdebug_stop_trace:

class SampleTest extends PHPUnit_Framework_TestCase 
{ 
    public function testBreakpoint() 
    { 
     xdebug_start_trace('/tmp/testBreakPointTrace'); 
     $a = 18; 
     xdebug_stop_trace(); 
     exit; 
    } 
} 
+0

Bueno, es una opción, así como var_dump(). Hay 2 problemas: se requiere cambiar el código para depuración y no es tan interactivo como [depurador visual] (http://www.jetbrains.com/phpstorm/features/index.html#Visual_PHP_Debugger). La solución que uso en este momento es un grupo único asignado a la prueba, por lo que ejecutar phpunit para este grupo hace que esta prueba se ejecute de forma aislada. –

Cuestiones relacionadas