2012-09-22 21 views
6

Questo codice con PHP/Xdebug (utilizzando Xdebug 2.2.1 e PHP 5.4 su Windows 7 x64, anche io ho aggiunto un contatore di linea per migliorare la leggibilità):Cosa restituisce Xdebug in PHP?

1: xdebug_start_code_coverage(); 
2: 
3: for ($ii = 0; $ii < 3; ++$ii) 
4: $x = time(); 
5: 
6: if (false) 
7: echo "Never executed."; 
8: 
9: echo var_dump(xdebug_get_code_coverage()); 

..Io ottenere questa uscita (ho modificato alcuni valori per renderlo più leggibile):

array (size=1) 
    '..\testpage.php' => 
    array (size=4) 
     3 => int 1 
     4 => int 1 
     7 => int 1 
     9 => int 1 

la documentazione sopra presso la sede del Xdebug dice:

"il valore negli elementi rappresenta il numero totale di unità di esecuzione su questa linea è stata eseguita. "

Fonte: http://www.xdebug.com/docs/code_coverage

Quindi a quanto pare l'uscita è sbagliato. Le linee 3 e 4 dovrebbero essere state eseguite tre volte mentre Xdebug diceva 1 rispettivamente. La riga 6 avrebbe dovuto essere eseguita una volta, Xdebug non aveva affatto un proverbio. La riga 7 non dovrebbe essere stata eseguita, tuttavia Xdebug ha detto che è stato eseguito una volta. Va detto che l'output rimane lo stesso con o senza parentesi graffe.

corso a questo indirizzo: http://xdebug.org/archives/xdebug-general/0377.html

.. Derick Rethans 'colto dicendo (7 anni fa!) Che in qualche modo la documentazione è sbagliato (e ancora è), che restituisce solo Xdebug -1, 0 o 1 Tuttavia, come mostra il mio esempio, Xdebug restituisce 1 dritto e il contatore truccato sembra rendere arbitraria la sua selezione. Anche se Xdebug restituisse -1, 0 o 1, non saprei dire cosa dicono questi valori.

Quindi, qualcuno di voi programmatori d'élite ha un'idea ?? E se c'è davvero qualcosa di sbagliato in Xdebug, vuol dire che non posso fidarmi di altre applicazioni e plugin usati per la profilazione e la copertura del codice che a loro volta usano Xdebug? Sto pensando a Phing e PHPUnit che sembra essere un matrimonio comune.

Inoltre se avete voglia di elaborare alcuni su questo problema; se Xdebug è difettoso e come tale, tutte le applicazioni dipendenti, che cosa usi per i report sulla copertura del codice in PHP?

EDIT: L'uscita elencati sopra utilizzando lo stesso esempio di codice, è invariato se invio argomenti XDEBUG_CC_UNUSED o XDEBUG_CC_DEAD_CODE come argomenti a xdebug_start_code_coverage. Sto iniziando a pensare che Xdebug non funzioni affatto per la copertura del codice, non sul mio sistema.

+0

Forse il parser PHP ha ancora di leggerlo e di generare codice nativo per esso anche se non sarà eseguito? –

+0

Cole, scommetto che stai pensando alla linea 7 e sì, potrebbe essere il caso. Ma Xdebug non sarebbe completamente inutile se non fosse in grado di spiegare una cosa del genere? E ancora, c'è il problema delle linee 3, 4 e 6. –

+1

Non ho mai usato Xdebug quindi non posso dare risposte certe, ma secondo (http://www.digipedia.pl/usenet/thread/15739/ 883 /) sembra che in realtà non restituisca il numero di volte che la linea deve essere eseguita. – kennypu

risposta

4

So che c'è un problema quando si usano condizionali con sintassi di indentazione.

XDebug conosce solo "istruzioni" e in realtà non capisce "righe" anche se è così che viene visualizzato e parlato.

questo:

1 <?php 
2 
3 xdebug_start_code_coverage(); 
4 
5 for ($ii = 0; $ii < 3; ++$ii) { 
6  $x = time(); 
7 } 
8 
9 if (false) { 
10 echo "Never executed."; 
11 } 
12 
13 echo var_dump(xdebug_get_code_coverage()); 

produce:

array(1) { 
    ["./test.php"]=> 
    array(5) { 
    [5] => int(1) 
    [6] => int(1) 
    [7] => int(1) 
    [9] => int(1) 
    [13] => int(1) 
    } 
} 

Per ulteriori informazioni, vedere: Edge Cases nel manuale PHPUnit

e altri SO domande:

+0

Grazie willoller, il tuo commento è stato sicuramente utile. Ma ora sono ancora più confuso. Ho riprodotto il tuo codice e ottenuto lo stesso risultato. Mi chiedo perché Xdebug dice riga 7 e non è stata eseguita la riga 11 (o è __statement__ 7 e __statement__ 11?)? –

+0

Sul mio codice 7 viene eseguito perché 6 è. 11 non è perché 10 non è. Il trailing '}' è una rovina per chiunque abbia una copertura obbligatoria al 100%. Per risolvere questo problema, phpUnit ha aggiunto '// @ codeCoverageIgnore' (?) In modo da poterlo inserire dopo le parentesi:'} // @ codeCoverageIgnore'. Blech. – willoller