web-dev-qa-db-fra.com

Différences entre la couverture des lignes et des succursales

J'utilise le plugin Cobertura Maven pour l'un de mes projets. Mais j'ai une question sur le rapport généré:

Quelle est la différence entre la couverture des lignes et des succursales?

85
Gillespie59

La couverture de ligne mesure le nombre d'instructions que vous avez prises (une instruction est généralement une ligne de code, sans les commentaires, les conditions, etc.). La couverture des succursales vérifie si vous avez pris la branche vraie et fausse pour chaque condition (si, pendant, pour). Vous aurez deux fois plus de branches que les conditionnelles.

Qu'est-ce que tu en as à faire? Prenons l'exemple:

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John(); 
    }
    return user.getName().length(); 
}

Si vous appelez cette méthode avec isCoolUser défini sur true, vous obtenez une couverture d'instruction de 100%. Ça m'a l'air bien? NOPE, il y aura un pointeur nul si vous appelez avec false. Cependant, vous avez une couverture de 50% dans le premier cas, vous pouvez donc voir qu'il manque quelque chose dans vos tests (et souvent, dans votre code).

137
Kane

Prenez ce code comme exemple simplifié:

if(cond) {
    line1();
    line2();
    line3();
    line4();
} else {
    line5();
}

Si votre test n'exerce que le cond étant vrai et n'exécute jamais la branche else que vous avez:

  • 4 lignes sur 5 couvertes
  • 1 succursale sur 2 couverte

Cobertura report lui-même présente également quelques info-bulles d'aide contextuelle Nice lorsque l'en-tête de colonne est cliqué:

Couverture de ligne - Pourcentage de lignes exécutées par ce test.

Couverture des branches - Pourcentage de branches exécutées par ce test.

55
Tomasz Nurkiewicz
if(cond){
    //branch 1
}else{  
    //branch 2
}

Vous devez traiter toutes les lignes de la branche 1 et de la branche 2 pour obtenir une couverture à 100% pour LineCoverage et BranchCoverage.

Si vous manquez quoi que ce soit d'autre, vous obtiendrez la moitié de la couverture de la succursale. Si vous avez manqué quelque chose dans # de lignes à la fois si et sinon, vous obtiendrez BranchCoverage de 100% mais pas 100% avec une couverture de ligne.

J'espère que cela t'aides.