it-swarm.com.de

Ein Unterschied zwischen Aussage und Entscheidung

Anweisungsüberdeckung soll sicherstellen, dass jede Anweisung im Code mindestens einmal ausgeführt wird.
Entscheidung/Verzweigungsabdeckung wird gesagt, um zu testen, dass jede Verzweigung/Ausgabe einer Entscheidung getestet wird, d. H. Alle Anweisungen in beiden falschen/wahren Zweigen werden ausgeführt.
Aber ist es nicht dasselbe? In Statement-Coverage muss ich alle Anweisungen ausführen, sodass ich denke, dass dies nur möglich ist, indem alle möglichen Wege ausgeführt werden. Ich weiß, dass mir hier etwas fehlt.

19
John V

Wenn die Tests vollständige Zweigabdeckung) haben, können wir sagen, dass sie auch vollständige Anweisungsabdeckung hat, nicht jedoch umgekehrt.

100% Branch Coverage => 100% Statement Coverage

100% -Bescheinigung von Anweisungen bedeutet nicht 100% ige Zweigabdeckung

der Grund liegt in der Verzweigungsabdeckung. Abgesehen von der Ausführung aller Anweisungen sollten wir auch überprüfen, ob die Tests alle Verzweigungen ausführen, was als alle Kanten im Kontrollflusszweig abdeckend interpretiert werden kann

if(a){
   if(b){
     bool statement1 = true;
   }
}

a = wahr, b = wahr ergibt 100% Anweisungsabdeckung, nicht jedoch Zweigabdeckung

 enter image description here

Im Zweig-Coverage müssen wir alle Kanten abdecken abdecken, was wir im Anweisungs-Coverage vermisst haben, das in der obigen Abbildung als rote Linien angezeigt wird

8
murali krish

Die Antwort von Paul ist nicht ganz richtig, zumindest glaube ich (gemäß den Definitionen von ISTQB). Es gibt einen erheblichen Unterschied zwischen Aussage-, Entscheidungs-/Verzweigungs- und Bedingungsüberdeckung ... Ich werde das Beispiel aus der anderen Antwort verwenden, jedoch etwas modifiziert, sodass ich alle drei Beispiele für die Testüberdeckung zeigen kann. Hier geschriebene Tests geben für jeden Typ eine Testabdeckung von 100%.

if(a || b)) {
    test1 = true;
}
else {
    if(c) {
      test2 = true
    }
}

Wir haben hier zwei Aussagen - if (a || b) und if (c), um diese Abdeckungsunterschiede vollständig zu erklären:

  1. Anweisung Abdeckung Jede Anweisung muss mindestens einmal getestet werden, so dass wir nur zwei Tests benötigen:
    • a = wahr b = falsch - das gibt uns den Pfad, wenn (a || b) wahr -> test1 = wahr ist
    • a = falsch, b = falsch und c = wahr - das gibt uns den Pfad: if (a || b) falsch -> sonst -> wenn (c) -> test2 = wahr.

Auf diese Weise haben wir jede Anweisung ausgeführt.

  1. Branche/Entscheidungsschutz benötigt einen weiteren Test:

    • a = falsch, b = falsch, c = falsch - das führt uns zu dieser Sekunde, wenn jedoch falsche Verzweigung von dieser Anweisung ausgeführt werden, die nicht in der Anweisungsüberdeckung ausgeführt wurde 

    Auf diese Weise haben wir alle Zweige getestet, was bedeutet, dass wir alle Pfade durchlaufen haben.

  2. Bedingungsdeckung benötigt einen weiteren Test:

    • a = falsch, b = wahr - führt durch denselben Pfad wie beim ersten Test, führt jedoch die andere Entscheidung in OR Anweisung (a || b) durch, um den Test durchzuführen.

Auf diese Weise haben wir alle Bedingungen getestet, was bedeutet, dass wir alle Pfade (Verzweigungen) durchlaufen haben und diese mit jeder Bedingung ausgelöst haben, die wir könnten - zuerst war 'if' im ersten Test wahr, weil a = true ausgelöst hat, und im letzten Test, weil b = true hat es ausgelöst. Natürlich kann jemand argumentieren, dass der Fall mit a = true und b = true ebenfalls getestet werden sollte, aber wenn wir prüfen, wie 'oder' funktioniert, können wir sehen, dass es nicht benötigt wird, und auch die Variable c kann einen beliebigen Wert haben In diesen Tests wird es nicht bewertet.

Zumindest habe ich es so interpretiert. Wenn noch jemand interessiert ist :)

BEARBEITEN: In den meisten Quellen habe ich kürzlich festgestellt, dass die Bedingungen für die Entscheidung/Zweigabdeckung äquivalent sind. Der Begriff, den ich als Entscheidungsabdeckung bezeichnet habe, ist in der Tat eine Zustandsabdeckung, daher diese Aktualisierung der Antwort.

32
Faflok

Möglicherweise haben Sie eine Aussage wie:

if(a || b || (c && d && !e)) {
    test1 = true;
} else {
    test2 = false;
}

Wenn Ihre Codeabdeckung sagt, dass sowohl die Zeilen test1 als auch test2 betroffen sind, dann haben Sie eine Anweisungsabdeckung. Um jedoch eine vollständige Zweigabdeckung zu erhalten, müssen Sie prüfen, ob a wahr ist, wenn a falsch ist, b aber wahr ist und a und b falsch sind aber c und d sind wahr und e ist falsch usw.

Die Filialabdeckung deckt jede mögliche Kombination von Filialentscheidungen ab und ist daher schwieriger, eine 100% ige Abdeckung zu erreichen. 

3
Paul Rutland

Gute Frage. Die häufig verwendete Erklärung ist, dass eine if-Anweisung ohne else-Zweig noch eine unsichtbare "leere" else-Anweisung hat:

  • Die einfache Erklärung der Anweisungen besteht lediglich darauf, dass alle Anweisungen, die tatsächlich vorhanden sind, wirklich ausgeführt werden.

  • Zweigabdeckung besteht darauf, dass sogar unsichtbare andere Zweige ausgeführt werden.

Ähnliche Situationen treten bei switch-Anweisungen ohne Standardfall und Wiederholungsschleifen auf. Für die Zweigabdeckung ist es erforderlich, dass ein Standardfall ausgeführt wird und mindestens zweimal eine Wiederholung bis ausgeführt wird.

Ein Codebeispiel:

if (passwordEnteredOK()) {
    enterSystem();
} 
/* Invisible else part 
else {
  // do nothing
}
*/

Mit der Anweisungsüberdeckung prüfen Sie einfach, ob Sie das System mit einem korrekten Kennwort verwenden können. Mit Branch-Coverage testen Sie auch, dass Sie mit einem falschen Passwort nicht in das System gelangen.

1
avandeursen