2012-03-21 10 views
5

Per unittestÈ possibile eseguire il debug dei test PhpUnit con l'opzione --process-isolation?

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

con punto di interruzione sulla linea 5 "$ a = 18;",

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

unità di esecuzione test con NO - l'opzione di isolamento del processo interrompe l'esecuzione dello script sulla riga 5, come previsto. esecuzione la stessa configurazione WITH --process-isolamento non interrompe l'esecuzione sulla linea 5.

L'opzione --process-isolamento viene eseguito ogni prova nuovo processo che utilizza 'proc_open' in funzione runJob in https://github.com/sebastianbergmann/phpunit/blob/3.6/PHPUnit/Util/PHP.php

Testato con PhpStorm 3 e vim 7 con plugin per debugger. Permette di eseguire il debug di PHPUnit stesso, ma non di testare.

Esiste un modo per eseguire il debug del processo figlio creato da PhpUnit utilizzando Xdebug? potrebbe essere Zend Debugger?

+0

Non sono configurato per il debug in PHP Storm o VIM, quindi dovrai provarlo. Se in qualche modo si possono avere delle variabili ambientali, è possibile attivare Xdebug o ZendDebugger con quelle. Esempio 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). Esempio di Xdebug export XDEBUG_CONFIG = "idekey = session_name" (http://xdebug.org/docs/remote). Fammi sapere se funziona. – SamHennessy

+0

@SamHennessy sì, è esattamente il modo di eseguire il debug degli script CLI. Le variabili ambientali sono diventate esistenti dopo il comando magico 'export'. Non è un problema eseguire il debug degli script CLI. Come ho detto, posso eseguire il debug di unittests quando PHPUnit esegue testcases nello stesso thread: 'phpunit SampleTest' funziona come un incantesimo. Il 'SampleTest 'di phpunit - process-isolation non funziona. L'ultimo comando crea 2 processi: il principale PHPUnit e un figlio per ogni test. Posso eseguire il debug solo del processo principale, ma non del bambino, e questo è un problema. –

+1

I miei presupposti erano che l'utente su cui era stato eseguito PHPUnit sarebbe lo stesso utente utilizzato dall'utente nell'operazione proc_open. Se questo è vero, allora dovrebbe attivare un'ulteriore sessione di debug. Non so se VIM o PHP Storm possano supportare più sessioni di debug. Potrebbe essere necessario impostare env vars nel tuo profilo per farlo funzionare. – SamHennessy

risposta

2

Andate in Impostazioni progetto PhpStorm - PHP - Debug e impostare Xdebug di "rompere vigore alla prima linea quando script è al di fuori del progetto" ..

Dovrebbe rompere su qualche metodo main() .. e se si passare un paio di volte (o premere riprendere), raggiungerà il tuo test

+0

** Sì: ** si ferma sulla prima riga di PHPUnit. Come stavo dicendo, non ci sono problemi a eseguire il debug di PHPUnit stesso utilizzando il listener di debug remoto o il debugger locale (Shift-F9). ** No: ** non raggiungerà il mio test. Se si esegue il "passaggio" o "passaggio" in "non si raggiunge il punto di interruzione nel test. Il debugger non "entra in" processo figlio creato da [proc_open] (http://php.net/manual/en/function.proc-open.php) –

1

Questa non è una risposta perfetta, ma puoi circondare qualsiasi blocco di codice con le chiamate xdebug_start_trace() e xdebug_stop_trace() per generare uno stack traccia per un blocco di codice mirato. L'ho usato per vedere esattamente cosa succede in punti specifici nei miei test unitari durante il test del codice di altre persone.

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

Basta tenere a mente che qualsiasi guasto causerà gestore di eccezioni di PHPUnit di intervenire e causare la traccia dello stack di guardare un po 'strano. Se si verifica un errore, è possibile ottenere una traccia pulita aggiungendo un'uscita; chiamare subito dopo xdebug_stop_trace:

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

Bene, è un'opzione, così come var_dump(). Ci sono 2 problemi: richiede di cambiare codice per scopi di debug e non è interattivo come [visual debugger] (http://www.jetbrains.com/phpstorm/features/index.html#Visual_PHP_Debugger). La soluzione che uso al momento è un gruppo univoco assegnato al test, quindi l'esecuzione di phpunit per questo gruppo rende questo test eseguito separatamente. –

Problemi correlati