grails cobertura

Informe Grails/Cobertura-cobertura condicional no tiene sentido



(3)

¿Qué podría causar algo como esto?

El def result línea de def result muestra solo 2/6 ramas cubiertas, a pesar de que NO TIENE SUCURSALES, mientras que la siguiente línea, que en realidad tiene un condicional, está bien.

¿Que esta pasando? cobertura.ser que el cobertura.ser se está limpiando entre compilaciones.


Me di cuenta de lo mismo en nuestros proyectos de Grails: creo que esto es causado por las ramas de "optimización" que crea el compilador groovy.

Por ejemplo, este código

def deleteSomething(params) { def result if(params.something && params.somethingelse) result = "something" else result = "something else" }

se ve así cuando se compila

public Object deleteSomething(Object params) { CallSite[] arrayOfCallSite = $getCallSiteArray(); Object result = null; if ((!BytecodeInterface8.isOrigZ()) || (__$stMC) || (BytecodeInterface8.disabledStandardMetaClass())) { if (((DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[2].callGetProperty(params))) && (DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[3].callGetProperty(params))) ? 1 : 0) != 0) { String str1 = "something"; result = str1; return str1; } else { String str2 = "something else"; result = str2; return str2; } } else if (((DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[4].callGetProperty(params))) && (DefaultTypeTransformation.booleanUnbox(arrayOfCallSite[5].callGetProperty(params))) ? 1 : 0) != 0) { String str3 = "something"; result = str3; return str3; } else { String str4 = "something else"; result = str4; return str4; } return null; }

Más discusión aquí .


La misma discusión también apareció en el foro oficial, consulte Problemas de cobertura de la sucursal .

@rgarcia brindó una excelente pequeña jarra de herramientas para deshabilitar la optimización de AST para que Cobertura pueda calcular la cobertura correctamente.

Para usar el jar, simplemente colócalo en tu carpeta myapp/lib y luego test-app -coverage :)


¿Alguna idea de dónde puedo obtener la fuente para ese JAR?

código jar y souce para disableOptimizationsTransformation

Además, ¿alguna idea de cómo incluir ese JAR en classpath SOLAMENTE para la fase de compilación de prueba-aplicación?

// Remove the jar before the war is bundled grails.war.resources = { stagingDir -> delete(file:"${stagingDir}/WEB-INF/lib/DisableOptimizationsTransformation-0.1-SNAPSHOT.jar") }

desde otro post aquí