miércoles, marzo 19, 2014

Métrica C.R.A.P. con grails


Qué es el anti patrón de riezgo de cambio (Change Risk Anti-Patterns C.R.A.P)?
es un método para analizar y predecir la cantidad de esfuerzo, trabajo y tiempo requerido para mantener la base de código existente. La fórmula de C.R.A.P. es la siguiente:

C.R.A.P.(m) = comp(m)^2 * (1 – cov(m)/100)^3 + comp(m)

Donde comp(m) es la complejidad ciclomática del método m y cov(m) es la cobertura de pruebas del método m.

Más información  aqui:

Al intentar configurar CRAP para grails me topé con que no pude utilizar gmetrics, le di muchas vueltas hasta que lo abandoné, leyendo sobre métricas me topé con esta presentación y ahí me di cuenta de que codenarc ya contiene a CRAP entre sus reglas. He aquí como lo configuré:




buildconfig.groovy
 25 grails.project.dependency.resolution = {
 54 
 55   dependencies {
 66     compile 'org.gmetrics:GMetrics:0.6'
 69   }
 70 
 71   plugins {
 85     compile ':codenarc:0.20'
 99   }
100 }
101 
110 
111 codenarc.reports = {
116   MyHtmlReport('html') {
117     outputFile = 'target/CodeNarcReport.html'
118     title = 'Violations Report'
119   }
120 }
121 
122 codenarc.propertiesFile='grails-app/conf/codenarc.properties'
123 codenarc.ruleSetFiles = "rulesets/basic.xml,rulesets/exceptions.xml, rulesets/imports.xml,rulesets/grails.xml, rulesets/unused.xml, rulesets/size.xml, rulesets/concurrency.xml,rulesets/convention.xml,rulesets/design.xml,rulesets/groovyism.xml,rulesets/imports.xml,rulesets/logging.xml"
124 

codenarc.properties
 1 GrailsPublicControllerMethod.enabled=false
 2 CatchException.enabled=false
 3 CatchThrowable.enabled=false
 4 ThrowException.enabled=false
 5 ThrowRuntimeException.enabled=false
 6 GrailsStatelessService.enabled=false
 7 NestedBlockDepth.maxNestedBlockDepth=3
 8 CrapMetric.enabled=true
 9 CrapMetric.coberturaXmlFile=file:target/test-reports/cobertura/coverage.xml

Ahora solo basta ejecutar:
grails test-app -unit -coverage -xml
grails codenarc

Como resultado tendremos más violaciones a las reglas pero seguro ayuda a mejorar en algo.

➥ ItemGroupsController.groovy

Rule NamePriorityLine #Source Line / Message
CrapMetric276
[SRC]def update() {
[MSG]Violation in class com.winbits.api.catalog.controllers.ItemGroupsController. The CRAP score for method [update] is [90.0]


El límite está puesto a 30 como máximo, este método tiene un índice de 90 lo cual nos indica que esta muy crapy, para poder reducir el índice se puede hacer un refactor para reducir su complejidad o aumentar sus pruebas automatizadas, claro que si se hace un refactor primero se tienen que hacer las pruebas para que sea seguro hacerlo :-)





Publicar un comentario