Differenze tra copertura di linea e di filiale


93

Uso il plugin Cobertura Maven per uno dei miei progetti. Ma ho una domanda sul rapporto generato:

Qual è la differenza tra copertura di linea e di filiale?

Risposte:


168

La copertura della riga misura il numero di affermazioni che hai preso (un'istruzione è solitamente una riga di codice, esclusi commenti, condizionali, ecc.). Branch coverages controlla se hai preso il ramo vero e falso per ogni condizionale (if, while, for). Avrai il doppio dei rami dei condizionali.

Perché ti interessi? Considera l'esempio:

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

Se chiami questo metodo con isCoolUserimpostato su true, ottieni il 100% di copertura delle dichiarazioni. Suona bene? NOPE, ci sarà un puntatore nullo se chiami con false. Tuttavia, nel primo caso hai una copertura del ramo del 50%, quindi puoi vedere che manca qualcosa nei tuoi test (e spesso, nel tuo codice).


8
Bella risposta! Mostra quando la copertura della linea dà la falsa sensazione di avere un buon codice!
MAGx2

quali sono i possibili bug che puoi ottenere a causa della copertura della linea o della copertura delle filiali?
Emna Ayadi

61

Prendi questo codice come esempio semplificato:

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

Se il tuo test esercita solo l' condessere vero e non esegue mai il elseramo hai:

  • 4 linee su 5 coperte
  • 1 su 2 rami coperti

Anche lo stesso rapporto Cobertura introduce alcuni simpatici suggerimenti di aiuto a comparsa quando si fa clic sull'intestazione di colonna:

Copertura linea : la percentuale di linee eseguite da questa esecuzione di test.

Copertura delle filiali: la percentuale di filiali eseguite da questa esecuzione di test.


Speravo di scrivere questa risposta, ma mi hai anticipato (di molti anni). Risposta chiara. Grazie.
Soundararajan

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

Devi indirizzare tutte le linee del ramo 1 e del ramo 2 per ottenere una copertura del 100% sia per LineCoverage che per BranchCoverage.

Se perdi qualcos'altro, riceverai metà della copertura della filiale. Se hai perso qualcosa in # di righe sia in if che in else, otterrai BranchCoverage del 100% ma non del 100% con la copertura della linea.

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.