Diferencias entre cobertura de línea y rama

94

Utilizo el complemento Cobertura Maven para uno de mis proyectos. Pero tengo una pregunta sobre el informe generado:

¿Cuál es la diferencia entre cobertura de línea y sucursal?

Gillespie59
fuente

Respuestas:

168

La cobertura de línea mide la cantidad de declaraciones que tomó (una declaración suele ser una línea de código, sin incluir comentarios, condicionales, etc.). Las coberturas de rama verifican si tomó la rama verdadero y falso para cada condicional (si, mientras, para). Tendrás el doble de ramas que condicionales.

¿Por qué te importa? Considere el ejemplo:

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John(); 
    }
    return user.getName().length(); 
}

Si llama a este método con isCoolUserestablecido en true, obtiene una cobertura del estado de cuenta del 100%. ¿Suena bien? NOPE, habrá un puntero nulo si llama con false. Sin embargo, tiene una cobertura de sucursales del 50% en el primer caso, por lo que puede ver que falta algo en sus pruebas (y, a menudo, en su código).

Kane
fuente
8
¡Gran respuesta! ¡Se muestra cuando la cobertura de línea da una falsa sensación de tener un buen código!
MAGx2
¿Cuáles son los posibles errores que puede tener debido a la cobertura de la línea o la cobertura de la sucursal?
Emna Ayadi
61

Tome este código como un ejemplo simplificado:

if(cond) {
    line1();
    line2();
    line3();
    line4();
} else {
    line5();
}

Si su prueba solo ejercita el condser verdadero y nunca ejecuta la elserama, tiene:

  • 4 de 5 líneas cubiertas
  • 1 de 2 ramas cubiertas

Además, el informe de Cobertura en sí mismo presenta algunas sugerencias interesantes de ayuda emergente cuando se hace clic en el encabezado de la columna:

Cobertura de línea : el porcentaje de líneas ejecutadas por esta ejecución de prueba.

Cobertura de sucursales : el porcentaje de sucursales ejecutadas por esta ejecución de prueba.

Tomasz Nurkiewicz
fuente
Esperaba escribir esta respuesta, pero me adelantaste (por muchos años). Respuesta clara. Gracias.
Soundararajan
3
if(cond){
    //branch 1
}else{  
    //branch 2
}

Debe abordar todas las líneas de la sucursal 1 y la sucursal 2 para obtener una cobertura del 100% tanto para LineCoverage como para BranchCoverage.

Si pierde algo en lo demás, obtendrá la mitad de la cobertura de la sucursal. Si ha omitido algo en el número de líneas tanto en el caso como en el resto, obtendrá una cobertura de sucursal del 100% pero no del 100% con la cobertura de la línea.

Espero que esto ayude.

Balaji Boggaram Ramanarayan
fuente