2009-11-22 13 views
31

Tengo un proyecto con código muy desordenado - mucha duplicación y código muerto aquí y allá.Detección de código muerto en PHP

Hace algún tiempo, las pruebas unitarias no cubrían ningún código, pero ahora estamos intentando escribir todo el código nuevo en T.D.D. manera y reducir la deuda técnica cubriendo el código "antiguo" por pruebas unitarias también (técnica de prueba final).

La complejidad de la lógica empresarial es bastante alta y, a veces nadie puede responder si se utilizan algunos métodos o no.

¿Cómo se pueden encontrar estos métodos de código muerto? Extenso registro? Mayor cobertura de prueba (no es muy fácil porque los clientes quieren que salgan nuevas características)

Respuesta

12

xdebug las herramientas de cobertura de código le permiten probar qué líneas de código se están ejecutando realmente, sin necesidad de poner declaraciones de seguimiento en todos de las funciones/métodos.

Ejemplo:

<?php 
    xdebug_start_code_coverage(); 

    function a($a) { 
     echo $a * 2.5; 
    } 

    function b($count) { 
     for ($i = 0; $i < $count; $i++) { 
      a($i + 0.17); 
     } 
    } 

    b(6); 
    b(10); 

    var_dump(xdebug_get_code_coverage()); // array '/path/file.php' => array line_number => int 1 or 0. 
?> 
+0

Ben, ¿puedo usarlo para un código que no está cubierto por pruebas unitarias? – ep3static

+3

La 'cobertura de código' en el sentido xdebug no significa cobertura de prueba. Los dos no están relacionados, por lo que puede usar esto para ver qué líneas se ejecutan, independientemente de si se prueban o no. –

+0

Puede obtener datos sobre la cobertura del código durante las pruebas simplemente habilitando la recopilación de datos de cobertura del código justo antes de ejecutar todas las pruebas, y luego apáguelo. – Ether

3

No sé de una manera de detectar código que no ha sido utilizado, que puede estar más allá de las capacidades de todas las herramientas que hay. Pero en cuanto a las herramientas que hay, marque http://phpqatools.org/ para ver un buen resumen de ellas.

  • Hasta ahora, uno de mis favoritos en phploc el que desgarra su código desde una perspectiva orientada a objetos y le da detalles de cómo muchas clases vs el número de funciones vs el número de pruebas vs loc promedio por función vs Ciclomática Complejidad .

  • Mi próximo favorito es phpcpd que es el "Detector de copiar y pegar PHP". Conmuta toda la base de código, busca firmas comunes y le proporciona una lista de archivos con números de línea.

  • Hay lotes de otras herramientas en esa página, elija las que le sean útiles.

Estamos activamente el uso de estas herramientas en web2project y en los dos años desde que fork de dotProject, hemos caído alrededor de un 35% de la base de código de refactorización, eliminando la duplicación (originalmente 12%, ahora alrededor de 2,5 %), y en general estructurar las cosas mejor. Y eso es contando nuestras 15k + líneas de Pruebas Unitarias. :)

+0

No se puede obtener la dirección de DNS de phpqatools.org. –

2

En cuanto a herramientas de perfilado, si usted decide ir de esa manera se pueden echar un vistazo a xhprofhttp://developers.facebook.com/xhprof/
Tiene menor tamaño de los archivos de salida y la interfaz web que se podría integrar en su aplicación para el seguimiento continuo. Es capaz de generar una representación visual del árbol de llamadas. Lo recomiendo sobre xdebug para ese propósito.

0

Creo que alguien ha implementado un sabor de Structure101g que usa datos xdebug - s101 detectará los clústeres no utilizados, es decir, los archivos que se usan pero están desconectados de la base de código principal.

2

Ver el SD PHP Test Coverage Tool. Usted ejercita su código de la forma que desee, incluso (o no) ejecutando suites de prueba de la forma que desee. Al final de la ejecución, puede ver una visualización de qué código se ejecutó (hay capturas de pantalla en el sitio web). Es posible que el código que no se ejecuta esté muerto y requiera un análisis más por su parte, pero si ejercita bien el sistema, el código no ejecutado es manejador de errores o material realmente muerto. La herramienta de cobertura de prueba PHP no requiere ningún cambio en su servidor PHP.

La herramienta SD CloneDR encuentra código duplicado en bases de código fuente muy grandes. Es sensible al lenguaje (que cubre C, C++, Java, C#, Ada, Fortran, así como PHP4 y PHP5) por lo que no se deja engañar por los cambios en el formato, el espacio en blanco o la presencia o ausencia de comentarios. Detectará clones de copias exactas y clones casi fallidos. El sitio web muestra ejemplos de informes de clonación para varios idiomas.

13

Es un poco tarde ahora, pero PHPDCD afirma hacer esto estáticamente, lo que debería darle un resultado mucho más informativo que tener que perfilar la ejecución del código real con xprof/xdebug.

+3

Funciona estáticamente, por lo que no funciona para cosas anónimas como métodos variables ($ object -> $ method) o call_user_func(). Ayuda pero está lejos de ser perfecto. –

+1

Sí, ninguna herramienta estática alguna vez podrá manejarlas de manera confiable, ya que el comportamiento real solo se determina en tiempo de ejecución. –

+1

'phpdcd.phar --exclude vendor --recursive .' funciona para mí. –

Cuestiones relacionadas