Existe-t-il un moyen simple de savoir quelle branche me manque? C'est à dire. J'ai un code comme celui-ci:
if (x || y) {
// do stuff
}
Dans la couverture en surbrillance, un point jaune dans Eclipse indique:
1 des 4 branches manquées
mais j'aimerais savoir quelle branche est manquante.
Un problème open sur le dépôt github pour le parent d'Eclemma, jacoco , suggère qu'une telle fonctionnalité serait en réalité un peu difficile à inclure.
Cependant, même en l'absence d'une fonctionnalité Eclemma, si l'objectif est simplement de déterminer les branches manquantes dans un cas spécifique, vous pouvez instrumenter votre code pour en assurer le suivi. L’exemple le plus simple est celui des déclarations d’impression à l’ancienne:
if (x || y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
Regardez ensuite le résultat et voyez quelles branches vous avez réellement touchées (par exemple, Java ... | grep "BRANCH:" | sort | uniq
). (pas très satisfaisant, je sais.)
Que peuvent être x
et y
?
true || true
est true (non couvert en raison de l'optimisation de la machine virtuelle: si la première condition est true
, la seconde ne sera pas évaluée en raison de l'évaluation du court-circuit) false || true
est vrai true || false
est vrai false || false
est false La réponse est que true|| true
n'était pas couvert.
En effet, une fois que la machine virtuelle Java a constaté que la première condition est vraie, elle n'exécutera pas la deuxième condition (optimisée), ce qui signifie que cette partie du code n'est jamais exécutée.
Comme Maroun l'a dit, 3 branches sur 4 permettront au conditionnel de passer. Si la couverture de code vous inquiète toujours, vous pouvez modifier le conditionnel pour qu'il soit un &&
au lieu d'un ||
.
(x || y)
est identique à (!(!x && !y))
et cela vous permettra de tester toutes les conditions puisqu'il n'y a plus que trois branches.
La forme originale du conditionnel est souvent vue dans les déclarations de garde:
if (obj == null || obj.hasError())
{
throw new RuntimeException();
}
Cela ne vous permettra jamais de vérifier si obj
est null
AND a une erreur, car une exception Null Pointer sera déclenchée.
Si la couverture de code est importante, utilisez simplement ce formulaire:
if (!(obj != null && !obj.hasError()))
{
throw new RuntimeException();
}
Il y a un woarkaround assez facile - juste mettez chaque prédicat logique dans une ligne séparée , comme ceci:
if (x
|| y) {
System.out.println("BRANCH: " + x + ", " + y);
// Do stuff
}
Maintenant, lorsque vous exécuterez des analyses, le marqueur devrait pointer directement sur la branche manquante. Une fois que vous aurez dissimulé le problème, vous pouvez reformater votre code correctement.
HTH
Il existe probablement des branches implicites provenant d'instructions imbriquées dans le bloc if
ou d'instructions développant vos prédicats x
ou y
.
Lisez ceci: http://emma.sourceforge.net/faq.html#q.fractional.examples