230 likes | 377 Views
Geoinformation III. Vorlesung 9b. Korrektheit von Programmen – Testen. 1. 2. Kantenüberdeckung. für das im folgenden beschriebene Prinzip der Kantenüberdeckung wird das Konzept des Kontrollflussgraphen benötigt
E N D
Geoinformation III Vorlesung 9b Korrektheit von Programmen – Testen
1 2. Kantenüberdeckung • für das im folgenden beschriebene Prinzip der Kantenüberdeckung wird das Konzept des Kontrollflussgraphen benötigt • der Kontrollflussgraph eines Programms setzt sich aus denKontrollflussgraphen der einzelnen Anweisungen zusammen:
if (Bedingung) then S1; else S2; S1;S2; if (Bedingung) then S1; while (Bedingung) S1; S1 S1 S2 S1 S1 S2 Knoten des Graphen Knoten des Graphen A 2 Kontrollflussgraph: Definition Kanten des Graphen 6x
x = -x z = x 3 2. Kantenüberdeckung • wähle Testmenge so, dass jede Kante des Kontrollflussgraphenmindestens einmal durchlaufen wird • Beispiel: if (x < 0) then x = - x z = x; (x = - 3), (x = 3) erfüllt Kantenüberdeckung(x = - 3) erfüllt Anweisungsüberdeckung, aber nicht Kantenüberdeckung
nicht_gefunden true true false false zähler < anzahl true false true false A 4 3. Bedingungsüberdeckung • wähle Testmenge so, dass die Komponenten jeder Bedingung alle möglichen Kombinationen von wahr und falsch annehmen • Beispiel (Suchen im Array):nicht_gefunden = true; zähler = 0; while (nicht_gefunden and zähler < anzahl) { if (array[zähler] == gesucht) then nicht_gefunden = false; zähler = zähler + 1; } 1x
Kontrollflussgraph: x = 0 x 0 y=5 z=z-x z 1 z > 1 z=0 z=z/x A 5 4. Pfadüberdeckung • wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphenvom Anfangs-knoten bis zum Endknoten durchlaufen werden • Beispiel: • if (x 0) then y = 5;else y = 8;if (z > 1)then z = z/x;else z = 0; Division durch 0, falls x=0 9x
A 5 Testmenge: (x=0, z=1) links-rechts 4. Pfadüberdeckung • wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphenvom Anfangs-knoten bis zum Endknoten durchlaufen werden • Beispiel: • if (x 0) then y = 5;else y = 8;if (z > 1)then z = z/x;else z = 0; x = 0 x 0 y=5 z=z-x z 1 z > 1 z=0 z=z/x 9x
A 5 Testmenge: (x=0, z=1) links-rechts (x=3, z=8) rechts-links 4. Pfadüberdeckung • wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphenvom Anfangs-knoten bis zum Endknoten durchlaufen werden • Beispiel: • if (x 0) then y = 5;else y = 8;if (z > 1)then z = z/x;else z = 0; x = 0 x 0 y=5 z=z-x z 1 z > 1 z=0 z=z/x Testmenge erfüllt Kantenüberdeckung, findet aber Fehler nicht 9x
A 5 Testmenge: (x=0, z=1) links-rechts (x=3, z=8) rechts-links (x=3, z=1) rechts-rechts 4. Pfadüberdeckung • wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphenvom Anfangs-knoten bis zum Endknoten durchlaufen werden • Beispiel: • if (x 0) then y = 5;else y = 8;if (z > 1)then z = z/x;else z = 0; x = 0 x 0 y=5 z=z-x z 1 z > 1 z=0 z=z/x 9x
A 5 Testmenge: (x=0, z=1) links-rechts (x=3, z=8) rechts-links (x=3, z=1) rechts-rechts (x=0, z=2) links-links 4. Pfadüberdeckung • wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphenvom Anfangs-knoten bis zum Endknoten durchlaufen werden • Beispiel: • if (x 0) then y = 5;else y = 8;if (z > 1)then z = z/x;else z = 0; x = 0 x 0 y=5 z=z-x z 1 z > 1 z=0 z=z/x Pfadüberdeckung findet Fehler 9x
n Verzweigungen/Variablen 2n Pfade A 6 4. Pfadüberdeckung: Problem • Anzahl der Pfade steigt exponentiell mit Anzahl der Variablen/Verzweigungen • Beispiel:if(x1 > .. ) then ...; else ...;if(x2 > .. ) then ...; else ...;...................if(xn-1 > .. ) then ...; else ...;if(xn > .. ) then ...; else ...; 1x
? ? P(t) = S(t) P(t) = S(t) 7 White- vs. Black-Box Tests • White-Box Test • Kenntnis der inneren Programmstruktur • Beispiel: Überdeckungen • Black-Box Test • keine Kenntnis der Programmstruktur, nur In-/Output-Verhältnis bekannt • Beispiel: Randwerte, Extremwerte, untypische Werte t P(t) t P(t)
8 Klassifikation von White-Box-Tests
9 Testen: Vorgehen • Erkennen, dass Fehler vorliegt (bisher behandelt) • Lokalisierung des Fehlers, Bestimmung seiner Ursachen • Korrigieren des Fehlers • Testen des korrigierten Programms
10 Fehlerlokalisierung • erfordert ca. 90% des Aufwands für Fehlerbeseitigung • Problem: • Fortpflanzung: Fehler werden nicht an der Stelle sichtbar, wo sie entstehen
11 Fehlerlokalisierung: Methoden • Speicherabzug (Dump) • Kontrollausgabe • Debugging
12 Fehlerlokalisierung: "Speicherabzug" • "Momentaufnahme" des Speichers • statisch • Ausgabe aller Paare (Name der Variable / Wert der Variable) • Nachteil: gewaltige Datenmenge, Identifikation der relevanten Werte aufwendig
13 Fehlerlokalisierung: "Kontrollausgabe" • Ausgabeanweisung an Stellen, an denen Fehlerursache vermutet wird (z.B. Java: System.out.println(Variable)) • gezielte Ausgabe von relevanten Variablenwerten • dynamisch • Nachteil: große Datenmengen, z.B. bei Ausgabeanweisung in Schleifen • wichtig: Testcode aufbewahren • globale boolesche Variable ("Schalter") testmodus,true beim Testen, sonst falsch • Kontrollausgabe: if (testmodus) then Ausgabe;
14 Fehlerlokalisierung: "Debugging" • Funktionalität der Entwicklungsumgebung • Einfügen von Breakpoints an Stellen, an denen Fehlerursache vermutet wird • Debug-Modus: Programm hält bei Breakpoint an • dort gezielte Ausgabe von Variablenwerten • verschiedene Möglichkeiten, weiter zu machen, z.B. • zu nächstem Befehl • in Methode hinein springen • aus Methode hinaus springen
15 Bsp.: Debugging in Java-Umgebung Forte
16 Test: psychologische Komponente • Tester Programmierer • Erfolg des Testers = Misserfolg des Programmierers • Testen hat destruktive Züge, Programmieren konstruktive • (langfristige) Ziele gleich: korrekte Programme
17 Vielen Dank für die Aufmerksamkeit.Fragen?
18 Übungsaufgabe: Bestimmung der Testmenge Algorithmus ZweiSegmentSchnitt Input: Zwei Segmente, gegeben durch die Punkte p1, p2, p3, p4 Output: true, wenn sich beide Segmente schneiden, sonst false { if(p1 == p2 oder p3 == p4) then….. //Sonderfallbehandlung else{ Sei g1 die Gerade, die durch p1 und p2 geht; Sei g2 die Gerade, die durch p3 und p4 geht; if(p1 liegt auf g2 oder p2 liegt auf g2 oder p3 liegt auf g1 oder p4 liegt auf g1) then ...... //Sonderfallbehandlung else if(p1 und p2 liegen auf verschiedenen Seiten von g2) thenif(p3 und p4 liegen auf verschied. Seiten von g1) then return true; //Schnittpunkt gefunden elsereturn false; //kein Schnittpunkt elsereturn false; //kein Schnittpunkt } }