Je me demande si la mesure de la couverture du code conditionnel par les outils actuels pour Java n'est pas obsolète depuis l'arrivée de Java 8. Avec Java 8 de Optional
et Stream
on peut souvent éviter les branches / boucles code, ce qui le rend facile d'obtenir une couverture très élevée conditionnelle sans tester tous les chemins d'exécution possibles. Comparons l'ancien code Java avec le code Java 8:
Avant Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Il existe 3 chemins d'exécution possibles dans la méthode ci-dessus. Afin d'obtenir 100% de couverture conditionnelle, nous devons créer 3 tests unitaires.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
Dans ce cas, les branches sont cachées et nous n'avons besoin que d'un test pour obtenir une couverture à 100% et peu importe le cas que nous testerons. Bien qu'il y ait toujours les mêmes 3 branches logiques qui devraient être couvertes je crois. Je pense que cela rend les statistiques de couverture conditionnelle totalement non fiables de nos jours.
Est-il judicieux de mesurer la couverture conditionnelle du code Java 8? Existe-t-il d'autres outils pour repérer le code sous-testé?
getName
? Il semble que si user
est nul, il devrait retourner "inconnu". Si user
n'est pas nul et user.getName()
est nul, il doit retourner "inconnu". Si user
n'est pas nul et user.getName()
n'est pas nul, il doit le renvoyer. Vous testeriez donc ces trois cas à l'unité, car c'est de cela qu'il getName
s'agit. Vous semblez le faire à l'envers. Vous ne voulez pas voir les succursales et écrire les tests en fonction de celles-ci, vous voulez écrire vos tests en fonction de votre contrat et vous assurer que le contrat est rempli. C'est alors que vous avez une bonne couverture.