2016-05-11 13 views
3

Meine Organisation betont eine Zeilen- und Zweigabdeckung von 80%. Ich habe absolut kein Problem mit der Line-Coverage-Anforderung, aber die Filialabdeckung hat mir ein Problem gegeben.Ist die Filialabdeckung so nützlich wie die Leitungsabdeckung?

Lassen Sie uns das folgende Beispiel dafür nehmen:

if(decisionA && decisionB) 
{ 
    // path A - do some complex ninja code stuff 
} 
else 
{ 
    // path B - tell user i can't do anything 
} 

Jetzt habe ich zwei Fälle geschrieben, die erste, die Bahn A abdeckt und der zweite Pfad B Abdeckung Dies sollte mir 100% -Linie geben Abdeckung. Allerdings gibt dieser mir nur 50% Zweigüberdeckung, da ich nur (True & & True) + (False & & False) während ommitting (True & & False) + (False & & True) behandelt haben.

Aus meiner Sicht sind die Werte von DecisionA und DecisionB trivial und kaum zu testen. Jedoch bedeutet die allgemeine Anforderung in meiner Organisation, dass ich 4 Testfälle anstatt 2 schreiben muss. Bringe mehrere if's und verschachtelte if's mit, und das wird kompliziert.

Es scheint, dass es in der Entscheidung des Entwicklers sein sollte, ob er sich entscheidet, Zweigfälle zu decken, solange er glaubt, dass die wichtige Logik (im Falle des Ninja-Codes in Teil A) abgedeckt wird.

Was sind Ihre Gedanken dazu? Was denkst du wäre eine akzeptable Filialabdeckung? Ist meine Angst, eine hohe Filialabdeckung zu rechtfertigen, gerechtfertigt oder stelle ich die Codequalität nicht genug dar? Ich weiß, das ist ein bisschen eine subjektive Frage, aber sicherlich gibt es gute Muster, die diesbezüglich bereits etabliert sind.

Antwort

2

Erstens, Terminologie: Was Sie beschreiben, ist nicht Zweigabdeckung, das ist "multiple condition coverage" or "compound condition coverage".

Sie möchten auf keinen Fall einen Standard für die Abdeckung mehrerer Bedingungen festlegen; es ist zu viel Arbeit für zu wenig Gewinn. Zum Beispiel, wenn Ihre Bedingung a & b & c & d & e ist, wo die fünf Grundbedingungen boolesch sind, müssen Sie zweiunddreißig Tests schreiben, was einfach nicht sinnvoll ist. Es wäre vernünftiger, für die grundlegende Zustandsabdeckung zu schießen: schreibe einen Test mit allen fünf Bedingungen falsch, dann einen Test mit jeder Bedingung, wahr, für insgesamt sechs.

Zweigabdeckung bedeutet, dass Tests alle Pfade durch jeden Zweig, z. sowohl die if als auch die else in Ihrem Beispiel.In Ihrem Beispiel werden Zeilen- und Zweigabdeckung durch zwei Tests erreicht. Die Filialabdeckung ist unterschiedlich, wenn else nicht vorhanden ist oder mehr als eine Verzweigung in einer Zeile vorhanden ist. Eine Branchendeckung ist viel einfacher zu erreichen als eine mehrfache (oder grundlegende) Bedingungsabdeckung, einige Werkzeuge messen sie, und es wäre vernünftig, einen Standard für sie anstelle einer Linienabdeckung zu setzen. Raedwalds Standpunkt ist gut, obwohl ich es anspreche, indem ich Konstrukte verbiete, die Entscheidungen in Einzeilern verbergen.

+0

Eigentlich müsste ein Ausdruck wie "a & b & ..." nur eine große Anzahl von zu überprüfenden Tests benötigen, wenn der Code * logische * Nicht-Kurzschlußoperatoren statt * bedingten * Operatoren ('&&') verwendet welche kurzgeschlossen sind. In der Praxis verwenden Programmierer die Kurzschlüsse, die eine viel geringere Anzahl von Tests erfordern. Bei einem Test mit 'a == false' brauchen wir zum Beispiel keinen weiteren Test mit 'b == false', um einen Ausdruck, der 'a && b' enthält, vollständig abzudecken. Der wahre Grund, warum Condition Coverage nicht verwendet werden kann, ist einfach, dass die vorhandenen Code-Coverage-Tools dies nicht unterstützen. –

3

Die Branch-Abdeckung ist eine nützlichere Metrik als die Leitungsabdeckung, da Codeformatänderungen den Wert der Leitungsabdeckungsmetrik variieren können.

Betrachten Sie diese zwei Codefragmente, für den Fall, dass die Bedingung immer wahr ist:

If (condition) { 
    good(); 
} else { 
    bad(); 
} 

und

If (condition) {good();} else {bad();} 

Beide Fälle haben eine Zweigüberdeckung von 50%. Der zweite Fall hat eine Linienabdeckung von 100%, der erste Fall weniger.

Die Verwendung von Line Coverage als Metrik kann Entwickler dazu ermutigen, nutzlose Änderungen am Format ihres Codes vorzunehmen, anstatt die Qualität zu verbessern, indem komplexe Logik vereinfacht und die Qualitätssicherung durch Hinzufügen weiterer Testfälle verbessert wird.

+0

Ich dachte Profiler würde immer noch das als mehrere Zeilen intern behandeln. Interessant. – arviman