Branches manquantes lors de l'utilisation de assertTrue au lieu de assertNull
En Java/Junit, j'ai besoin de tester la valeur null avec un objet. Il existe une variété de façons que je peux tester une condition, mais j'ai été en utilisant assertTrue pour la plupart de mes tests. Quand je vérifie pour les valeurs null dans une assertTrue, EclEmma déclare que c'est seulement de tester une branche.
Quand je résoudre l'énoncé dans une variable manuellement (comme le paramètre le résultat booléen et le passage dans assertTrue) la couverture de code est réputé complet sur l'affirmer, mais pas sur la variable d'initialisation de la ligne.
Pourquoi est-ce arrivé? Est-ce lié à l'extra byte code Java apparemment ajoute comme mentionné sur http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions? Toutes les solutions (en plus de l'utilisation d'autres affirment consolidés).
assertTrue:
assertTrue( myObject == null ); //1 of 2 branches
assertTrue:
boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); //complete
assertNull:
assertNull( myObject ) //complete;
source d'informationauteur Dalin Seivewright
Vous devez vous connecter pour publier un commentaire.
Pour la plupart des expressions Booléennes, le compilateur Java génère extra branches dans le byte code.
JaCoCo produit "direction générale de couverture", basé sur le byte code, ne reposant pas sur l'original du code Java, et donc montre branche supplémentaire de la couverture de l'information pour presque n'importe quelle expression Booléenne que vous utiliseriez.
Dans votre code, l'expression Booléenne que vous utilisez est
myObject == null
.Pour calculer cette valeur, le Java, le compilateur génère du code de pousser les deux arguments sur la pile, et ensuite de faire un saut conditionnel dans le but de pousser 1 (vrai) ou 0 (faux) dans la pile. JaCoCo rapports de la direction générale de la couverture de ce saut conditionnel.
Ainsi, le fait que vous utilisez
myObject == null
déclenche le comportement que vous décrivez.Que quelques autres exemples, essayez ceci:
Cela peut être utile si l'expression Booléenne est, par exemple, qui est retourné par une fonction, qui est utilisé comme condition d'un if-then-else quelque part d'autre. Bien que principalement une conséquence de la façon dont le compilateur Java fonctionne, il aide à évaluer condition couverture (au lieu de la simple branche couverture) de l'original du code Java.
Cette fonctionnalité n'est pas trop bien documentés, mais voici quelques conseils:
a = !a
Il est, en effet, liée à l'extra byte code est généré, mais pas pour les exemples de synthèse de l'octet compilateur constructions pour lesquelles les options de filtrage sont destinés.
NOTA: les grands MODIFIER depuis la première réponse était trop deviner. Grâce à @ira-baxter pour de bon & discussion critique.
Le fait que Emma traite une expression conditionnelle comme "quelque chose avec une branche" (succursale) la couverture de comptage à mon humble avis semble tout simplement cassé. Ce n'est pas une branche conditionnelle.
On peut dire plus sur l'Affirmer; si elle a été définie comme "throws exception d'affirmer l'échec", puis il a vraiment une conditionnels de la branche; si elle est définie [comme je le pense je ne, je ne suis pas un expert Java] "résilier mon programme d'affirmer l'échec", alors il n'est pas vraiment une branche. Aussi évident, ce sont les appels de méthode; ces sont branches conditionnelles dans le sens que, si la méthode lève une exception, le contrôle de flux de ne pas continuer à le "reste de l'énoncé".
Notre Java De La Couverture De Test outil est l' (branche) de l'analyse de couverture sur ces conditions "droit".
Pour obtenir 100% de couverture de code sur boolean méthodes, procédez de la manière suivante