Unterschiede zwischen Leitungs- und Zweigabdeckung

93

Ich benutze das Cobertura Maven Plugin für eines meiner Projekte. Ich habe jedoch eine Frage zum generierten Bericht:

Was ist der Unterschied zwischen Leitungs- und Nebenstellenabdeckung?

Gillespie59
quelle

Antworten:

168

Die Zeilenabdeckung misst, wie viele Anweisungen Sie gemacht haben (eine Anweisung ist normalerweise eine Codezeile ohne Kommentare, Bedingungen usw.). Die Zweigabdeckung prüft, ob Sie für jede Bedingung den richtigen und den falschen Zweig genommen haben (wenn, während, für). Sie haben doppelt so viele Zweige wie Bedingungen.

Warum kümmert es dich? Betrachten Sie das Beispiel:

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

Wenn Sie diese Methode mit isCoolUserset to aufrufen true, erhalten Sie eine 100% ige Anweisungsabdeckung. Klingt gut? NOPE, es wird einen Nullzeiger geben, wenn Sie mit anrufen false. Im ersten Fall haben Sie jedoch eine Zweigstellenabdeckung von 50%, sodass Sie feststellen können, dass bei Ihren Tests (und häufig auch in Ihrem Code) etwas fehlt.

Kane
quelle
8
Gute Antwort! Es zeigt, wenn die Leitungsabdeckung ein falsches Gefühl für guten Code vermittelt!
MAGx2
Was sind die möglichen Fehler, die Sie aufgrund der Leitungsabdeckung oder der Zweigabdeckung erhalten können?
Emna Ayadi
61

Nehmen Sie diesen Code als vereinfachtes Beispiel:

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

Wenn Ihr Test nur das condWahre wahr macht und niemals den elseZweig ausführt, den Sie haben:

  • 4 von 5 Zeilen abgedeckt
  • 1 von 2 Zweigen abgedeckt

Außerdem enthält der Cobertura- Bericht selbst einige nette QuickInfos zur Popup-Hilfe, wenn auf die Spaltenüberschrift geklickt wird:

Linienabdeckung - Der Prozentsatz der Linien, die von diesem Testlauf ausgeführt werden.

Zweigabdeckung - Der Prozentsatz der von diesem Testlauf ausgeführten Zweige.

Tomasz Nurkiewicz
quelle
Ich hatte gehofft, diese Antwort schreiben zu können, aber Sie haben mich (um viele Jahre) vorweggenommen. Klare Antwort. Vielen Dank.
Soundararajan
3
if(cond){
    //branch 1
}else{  
    //branch 2
}

Sie müssen alle Leitungen in Zweig 1 und Zweig 2 adressieren, um eine 100% ige Abdeckung für LineCoverage und BranchCoverage zu erhalten.

Wenn Sie etwas anderes verpassen, erhalten Sie die Hälfte der Filialabdeckung. Wenn Sie in if und else in der Anzahl der Zeilen etwas verpasst haben, erhalten Sie eine BranchCoverage von 100%, jedoch nicht 100% mit Leitungsabdeckung.

Hoffe das hilft.

Balaji Boggaram Ramanarayan
quelle