wake-up-neo.com

Unterschiede zwischen Linien- und Zweigabdeckung

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

Was ist der Unterschied zwischen Linien- und Zweigabdeckung?

85
Gillespie59

Die Zeilenabdeckung misst, wie viele Anweisungen Sie verwendet haben (eine Anweisung ist normalerweise eine Codezeile, ohne Kommentare, Bedingungen usw.). Branch Coverages prüft, ob Sie für jede Bedingung den True- und den False-Zweig verwendet haben (if, while, for). 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 isCoolUser auf true aufrufen, erhalten Sie eine 100% ige Anweisungsabdeckung. Hört sich gut an? NOPE, es wird einen Nullzeiger geben, wenn Sie mit false aufrufen. Im ersten Fall haben Sie jedoch eine Zweigabdeckung von 50%, sodass Sie feststellen können, dass in Ihren Tests (und häufig auch in Ihrem Code) etwas fehlt.

137
Kane

Nehmen Sie diesen Code als vereinfachtes Beispiel:

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

Wenn Ihr Test nur ausübt, dass cond wahr ist, und niemals den Zweig else ausführt, den Sie haben:

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

Cobertura report führt beim Klicken auf die Spaltenüberschrift selbst einige QuickInfos zur Popup-Hilfe ein:

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

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

55
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 irgendetwas anderes verpassen, erhalten Sie die Hälfte der Filialabdeckung. Wenn Sie sowohl in if als auch sonst in # Zeilen etwas verpasst haben, erhalten Sie BranchCoverage von 100%, jedoch nicht 100% mit Zeilenabdeckung.

Hoffe das hilft.