web-dev-qa-db-fra.com

Eclemma dit qu'une des quatre branches n'est pas couverte, mais de quelle branche s'agit-il?

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.

21
tor

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

9
user3780389

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
15
Maroun

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();
}
4
Brett Pyke

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

4
Bolesław Denk

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

0
Tim Bender