2012-09-22 17 views
6

Este código con PHP/Xdebug (usando Xdebug 2.2.1 y PHP 5.4 en Windows 7 x64, también he añadido un contador de líneas para facilitar la lectura):¿Qué devuelve Xdebug en 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()); 

..I obtener esta salida (he modificado algunos valores para que sea más legible):

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

la documentación más en el sitio de Xdebug dice:

"el valor de los elementos representa el número total de unidades de ejecución en esta línea se ha ejecutado ".

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

Así que al parecer la salida es incorrecto. La línea 3 y 4 deberían haberse ejecutado tres veces, mientras que Xdebug dijo 1, respectivamente. La línea 6 debería haber sido ejecutada una vez, Xdebug no tenía un dicho en absoluto. La línea 7 definitivamente no debería haber sido ejecutada, pero Xdebug dijo que se ejecutó una vez. Se debe decir que la salida se mantiene igual con o sin llaves.

largo en la siguiente dirección: http://xdebug.org/archives/xdebug-general/0377.html

.. Derick Rethans está atrapado diciendo (hace 7 años!) Que de alguna manera la documentación está mal (y todavía es), que Xdebug sólo devuelve -1, 0 o 1 Sin embargo, como muestra mi ejemplo, Xdebug devuelve 1 directamente y el contador manipulado parece hacer que su selección sea arbitraria. Incluso si Xdebug devolviera -1, 0 o 1, no sabría lo que dicen esos valores.

Entonces, ¿alguno de ustedes codificadores de elite tiene una idea? Y si en serio hay algo malo con Xdebug aquí, ¿significa eso que no puedo confiar en otras aplicaciones y complementos utilizados para el perfil y la cobertura de código que a su vez usan Xdebug? Estoy pensando en Phing y PHPUnit, que parece ser un matrimonio común.

También si desea elaborar algo sobre este tema; si Xdebug es defectuoso y, como tal, todas las aplicaciones dependientes, ¿qué utiliza para los informes de cobertura de código en PHP?

EDITAR: La salida enumerados anteriormente utilizando el mismo ejemplo de código, no se modifica si envío argumentos XDEBUG_CC_UNUSED o XDEBUG_CC_DEAD_CODE como argumentos para xdebug_start_code_coverage. Estoy empezando a pensar que Xdebug no funciona para la cobertura del código en absoluto, no en mi sistema.

+0

Tal vez el intérprete PHP todavía tiene que leerlo y generar código nativo para él, incluso si no va a ser ejecutado? –

+0

Cole, apuesto a que estás pensando en la línea 7 y sí, ese podría ser el caso. Pero, ¿no sería Xdebug completamente inútil si no pudiera dar cuenta de tal cosa? Y aún así, está el problema de las líneas 3, 4 y 6. –

+1

Nunca he usado Xdebug, así que no puedo dar respuestas definitivas, pero de acuerdo con (http://www.digipedia.pl/usenet/thread/15739/ 883 /) parece que en realidad no devuelve el número de veces que se supone que se ejecutará la línea. – kennypu

Respuesta

4

Sé que hay un problema al usar condicionales con sintaxis de sangría.

XDebug solo sabe acerca de "declaraciones" y en realidad no entiende "líneas", aunque así es como se muestra y se habla.

Este:

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) 
    } 
} 

Para obtener más información, ver: Edge Cases en el manual de PHPUnit

y otras preguntas SO:

+0

Gracias, Willolou, tu comentario fue muy útil. Pero ahora estoy aún más confundido. Reproduje tu código y obtuve el mismo resultado. Me pregunto por qué Xdebug dice que se ejecutó la línea 7 y no la línea 11 (¿o es __statement__ 7 y __statement__ 11?)? –

+0

En mi código 7 se ejecuta porque 6 es. 11 no es porque 10 no es. El '}' final es una perdición para cualquier persona que sea compulsiva con una cobertura del 100%. Para solucionar esto, phpUnit agregó '// @ codeCoverageIgnore' (?) Para que pueda ponerlo después de las llaves:'} // @ codeCoverageIgnore'. Blech. – willoller

Cuestiones relacionadas