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?
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:
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 isCoolUser
impostato 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).
Prendi questo codice come esempio semplificato:
if(cond) {
line1();
line2();
line3();
line4();
} else {
line5();
}
Se il tuo test esercita solo l' cond
essere vero e non esegue mai il else
ramo hai:
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.
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.