viernes, 10 de agosto de 2012

Análisis estático de código con PMD

PMD
Si seguimos las buenas prácticas de las metodologías ágiles en los proyectos que desarrollemos realizaremos pruebas unitarias y de integración a la vez que desarrollamos nuestro código. Ello nos permitirá no tener que realizar pruebas manualmente y asegurarnos de que las cosas siguen funcionando cuando hacemos cambios, si además disponemos de en servidor de integración continua las pruebas se podrán lanzar para cada cambio detectado en la herramienta de control de versiones que usemos.

Las pruebas unitarias y de integración son una cosa deseable y para algunos imprescindible, sin embargo, solo nos dicen que las partes probadas funcionan como se espera, no analiza nuestro código fuente. Analizar el código fuente puede proporcionarnos información para encontrar posibles errores, código muerto y que no se usa, código ineficiente, código demasiado complejo y código duplicado, ... que pasado el tiempo y con las diversas modificaciones seguramente tendremos. Siguiendo las indiciones de una herramienta de análisis de código podemos detectar esos posibles problemas de forma automatizada. Además, es seguro que en un equipo que desarrollan varias personas cada una codifique de una forma diferente, con una herramienta de estas como Checkstyle podemos establecer reglas de estilo de tal forma que consigamos un código más homogeneo y de nuevo más mantenible para todos.

Una de las herramientas más conocidas en la plataforma Java es PMD. Se puede integrar con la mayoría de IDEs y herramientas como Ant y Maven. Si queremos automatizar las pruebas lo integraremos con Ant, Maven o Gradle para no depender de un IDE y realizar las pruebas en la construcción de nuestro proyecto asi como poder ejecutarlas en el servidor de integración continua. Estos serían los trozos necesarios para integrar PMD con Gradle.

...
configurations {
    pmd
}

dependencies {
 ...
 pmd 'net.sourceforge.pmd:pmd:5.0.0'
 ...
}
...
task pmd << {
 ant.mkdir(dir:'build/pmd')
 ant.taskdef(name: 'pmd', classname: 'net.sourceforge.pmd.ant.PMDTask', classpath: project.configurations.pmd.asPath)
 ant.pmd {
  ruleset('java-basic,java-braces,java-codesize,java-naming,java-optimizations,java-unusedcode')
  formatter(type: 'html', toFile: 'build/pmd/pmd.html')
  fileset(dir: 'src/main/java') {
   include(name: '**/*.java')
  }
 }
}
...

Este es el informe que genera PMD para la aplicación Hola mundo con Tapestry 5.


En el siguiente enlace podemos ver las reglas ya predefinidas y que podemos aplicar a nuestro código. Si queremos analizar código groovy tenemos la herramienta CodeNarc.

Referencia:
http://pmd.sourceforge.net/
http://pmd.sourceforge.net/ant-task.html
http://pmd.sourceforge.net/rules/index.html
http://checkstyle.sourceforge.net/
http://www.gradle.org/
Elegir herramientas para un proyecto Java