Différences entre la couverture de ligne et de branche


94

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?

Réponses:


168

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

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 la valeur isCoolUserdéfinie sur true, vous obtenez une couverture de relevé 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 branche de 50% dans le premier cas, vous pouvez donc voir qu'il manque quelque chose dans vos tests (et souvent, dans votre code).


8
Très bonne réponse! Cela montre quand la couverture de ligne donne une fausse impression d'avoir un bon code!
MAGx2

Quels sont les éventuels bugs que vous pouvez rencontrer en raison de la couverture de ligne ou de la couverture de succursale?
Emna Ayadi

61

Prenez ce code comme un exemple simplifié:

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

Si votre test n'exerce que le fait d' condêtre vrai et n'exécute jamais la elsebranche que vous avez:

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

Le rapport Cobertura lui-même présente également de belles info-bulles d'aide contextuelle lorsque vous cliquez sur l'en-tête de colonne:

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

Couverture des succursales - Le pourcentage de succursales exécutées par ce test.


J'espérais écrire cette réponse, mais vous m'avez devancé (de nombreuses années). Réponse claire. Merci.
Soundararajan

3
if(cond){
    //branch 1
}else{  
    //branch 2
}

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

Si vous manquez quoi que ce soit ailleurs, vous obtiendrez la moitié de la couverture de la succursale. Si vous avez manqué quelque chose dans le nombre de lignes à la fois dans if et else, vous obtiendrez BranchCoverage de 100% mais pas de 100% avec une couverture de ligne.

J'espère que cela t'aides.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.