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?

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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.