tutorial plugin manually coverage code java eclipse code-coverage eclemma

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 es true , 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.



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é.)