Różnice między zasięgiem linii i gałęzi

94

Używam wtyczki Cobertura Maven do jednego z moich projektów. Ale mam pytanie odnośnie wygenerowanego raportu:

Jaka jest różnica między zasięgiem linii i oddziałów?

Gillespie59
źródło

Odpowiedzi:

170

Pokrycie linii mierzy liczbę wykonanych instrukcji (instrukcja jest zwykle linią kodu, bez komentarzy, warunków itp.). Pokrycia gałęzi sprawdza, czy dla każdego warunku (if, while, for) została wybrana gałąź true i false. Będziesz mieć dwa razy więcej gałęzi niż warunkowe.

Dlaczego się przejmujesz? Rozważmy przykład:

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

Jeśli wywołasz tę metodę z isCoolUserustawieniem na true, uzyskasz 100% pokrycie instrukcji. Brzmi dobrze? NIE, będzie pusty wskaźnik, jeśli zadzwonisz z false. Jednak w pierwszym przypadku masz 50% pokrycia gałęzi, więc możesz zobaczyć, że czegoś brakuje w twoich testach (i często w twoim kodzie).

Kane
źródło
8
Świetna odpowiedź! Pokazuje, kiedy pokrycie linii daje fałszywe poczucie posiadania dobrego kodu!
MAGx2
jakie są możliwe błędy, które możesz uzyskać z powodu zasięgu linii lub zasięgu oddziałów?
Emna Ayadi
61

Weź ten kod jako uproszczony przykład:

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

Jeśli twój test sprawdza tylko condbycie prawdą i nigdy nie uruchamia elsegałęzi, to:

  • Uwzględniono 4 z 5 linii
  • 1 z 2 gałęzi objętych

Również sam raport Cobertury wprowadza kilka fajnych wyskakujących podpowiedzi po kliknięciu nagłówka kolumny:

Pokrycie linii - procent linii wykonanych w tym przebiegu testowym.

Pokrycie gałęzi - procent gałęzi wykonanych w tym przebiegu testowym.

Tomasz Nurkiewicz
źródło
Miałem nadzieję napisać tę odpowiedź, ale mnie wyprzedziłeś (o wiele lat). Jasna odpowiedź. Dzięki.
Soundararajan
3
if(cond){
    //branch 1
}else{  
    //branch 2
}

Musisz zaadresować wszystkie linie to gałąź 1 i gałąź 2, aby uzyskać 100% pokrycia zarówno dla LineCoverage, jak i BranchCoverage.

Jeśli w ogóle przegapisz cokolwiek innego, otrzymasz połowę zasięgu oddziału. Jeśli przegapiłeś cokolwiek w # linii w obu przypadkach, otrzymasz BranchCoverage w wysokości 100%, ale nie 100% z pokryciem linii.

Mam nadzieję że to pomoże.

Balaji Boggaram Ramanarayan
źródło