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?
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í