java - plugin - junit eclemma
Eclemma dice que 1 de 4 ramas no están cubiertas, pero ¿qué rama es? (5)
¿Qué pueden ser x
y y
?
-
true || true
true || true
es verdadero (no está cubierto debido a la optimización de JVM: si la primera condición estrue
, el segundo no se evaluará debido a la evaluación del cortocircuito) -
false || true
false || true
es verdad -
true || false
true || false
es verdad -
false || false
false || false
es falso
¿Hay una manera simple de decir qué rama me estoy perdiendo? Es decir, tengo un código como este:
if (x || y) {
// do stuff
}
En el resaltado de cobertura hay un punto amarillo en Eclipse que dice:
1 de 4 ramas perdidas
Pero me gustaría saber qué rama falta.
Es probable que haya ramificaciones implícitas de sentencias anidadas dentro del bloque if
o de que las declaraciones expandan sus predicados x
o y
.
Lea esto: http://emma.sourceforge.net/faq.html#q.fractional.examples
Hay una solución muy sencilla: simplemente coloque cada predicado lógico en una línea separada , como esto:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
Ahora, cuando ejecute el análisis, el marcador debe apuntar directamente a la rama que se pierde. Después de que lo cubras, puedes reformatear tu código de la manera correcta.
HTH
La respuesta es true|| true
true|| true
no estaba cubierta.
Esto se debe a que una vez que la JVM encuentra que la primera condición es verdadera, entonces no ejecutará la segunda condición (está optimizada), lo que significa que esa parte del código nunca se ejecutará.
Como dijo Maroun, 3 de cada 4 ramas permitirán que pase el condicional. Si aún está preocupado por la cobertura del código, puede refactorizar el condicional para ser un &&
lugar de un ||
.
(x || y)
es lo mismo que (!(!x && !y))
y esto le permitirá probar todas las condiciones ya que ahora solo hay tres sucursales.
La forma original del condicional se ve a menudo en las declaraciones de guardia:
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
Esto nunca le permitirá verificar si obj
es null
Y tiene un error porque arrojará una excepción de puntero nulo.
Si la cobertura del código es importante, simplemente use este formulario:
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
Un problema abierto en el repositorio de github para el padre de jacoco , jacoco , sugiere que tal característica sería realmente un poco difícil de incluir.
Sin embargo, incluso sin una función de Eclemma, si el objetivo es simplemente averiguar las ramas perdidas en un caso específico, podría instrumentar su código para realizar un seguimiento. El ejemplo más simple son las declaraciones impresas pasadas de moda:
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
Luego mire la salida y vea qué ramas realmente golpeó (por ejemplo, java ... | grep "BRANCH:" | sort | uniq
). (No es terriblemente satisfactorio, lo sé.)