Me pregunto si medir la cobertura de código condicional mediante las herramientas actuales para Java no es obsoleto desde que surgió Java 8. Con Java 8 Optional
y a Stream
menudo podemos evitar ramas / bucles de código, lo que facilita obtener una cobertura condicional muy alta sin probar todas las rutas de ejecución posibles. Comparemos el antiguo código Java con el código Java 8:
Antes de Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Hay 3 posibles rutas de ejecución en el método anterior. Para obtener el 100% de la cobertura condicional, necesitamos crear 3 pruebas unitarias.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
En este caso, las ramas están ocultas y solo necesitamos 1 prueba para obtener una cobertura del 100% y no importa en qué caso probaremos. Aunque todavía hay las mismas 3 ramas lógicas que deberían cubrirse, creo. Creo que hace que las estadísticas de cobertura condicional sean completamente desconfiadas en estos días.
¿Tiene sentido medir la cobertura condicional para el código Java 8? ¿Hay alguna otra herramienta para detectar código no eliminado?
getName
? Parece ser que si user
es nulo, debería devolver "desconocido". Si user
no es nulo y user.getName()
es nulo, debería devolver "desconocido". Si user
no es nulo y user.getName()
no lo es, debería devolverlo. Por lo tanto, haría una prueba unitaria de esos tres casos porque de eso se trata el contrato getName
. Parece que lo estás haciendo al revés. No desea ver las ramas y escribir las pruebas de acuerdo con ellas, desea escribir sus pruebas de acuerdo con su contrato y asegurarse de que el contrato se cumpla. Ahí es cuando tienes una buena cobertura.