12345 Geoinformation3 6789101112131415161718 Geoinformation III Korrektheit von Programmen –...
-
Upload
gesche-beutel -
Category
Documents
-
view
218 -
download
2
Transcript of 12345 Geoinformation3 6789101112131415161718 Geoinformation III Korrektheit von Programmen –...
1 2 3 4 5Geoinformation3
6 7 8 9 10 11 12 13 14 15 16 17 18
Geoinformation III
Korrektheit von Programmen –Testen
Vorlesung 9b
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
1
• für das im folgenden beschriebene Prinzip der Kantenüberdeckung wird das Konzept des Kontrollflussgraphen benötigt
• der Kontrollflussgraph eines Programms setzt sich aus den Kontrollflussgraphen der einzelnen Anweisungen zusammen:
2. Kantenüberdeckung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
2
A 6x
Kontrollflussgraph: Definition
if (Bedingung) then S1; else S2;
S1 S2
if (Bedingung)then S1;
S1
while (Bedingung) S1;
S1
S1;S2;
S1
S2
Kanten des Graphen
Knoten des Graphen
Knoten des Graphen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
3
2. Kantenüberdeckung
• wähle Testmenge so, dass jede Kante des Kontrollflussgraphen mindestens 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
x = -x
z = x
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
4
• 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; }
A 1x
3. Bedingungsüberdeckung
zähler < anzahltruefalsetruefalse
nicht_gefundentruetruefalsefalse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
5
4. Pfadüberdeckung
A 9x
• wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphen vom 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;
y=5 z=z-x
z=z/x z=0
x = 0
z > 1
x 0
z 1
Kontrollflussgraph:
Division durch 0, falls x=0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
5
4. Pfadüberdeckung
A 9x
• wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphen vom 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;
y=5 z=z-x
z=z/x z=0
x = 0
z > 1
x 0
z 1
Testmenge: (x=0, z=1) links-rechts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
5
4. Pfadüberdeckung
A 9x
• wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphen vom 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;
y=5 z=z-x
z=z/x z=0
x = 0
z > 1
x 0
z 1
Testmenge: (x=0, z=1) links-rechts(x=3, z=8) rechts-links
Testmenge erfüllt Kantenüberdeckung, findet aber Fehler nicht
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
5
4. Pfadüberdeckung
A 9x
• wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphen vom 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;
y=5 z=z-x
z=z/x z=0
x = 0
z > 1
x 0
z 1
Testmenge: (x=0, z=1) links-rechts(x=3, z=8) rechts-links(x=3, z=1) rechts-rechts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
5
4. Pfadüberdeckung
A 9x
• wähle Testmenge so, dass alle Pfade des Kontroll-flussgraphen vom 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;
y=5 z=z-x
z=z/x z=0
x = 0
z > 1
x 0
z 1
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
Pfadüberdeckung findet Fehler
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
6
4. Pfadüberdeckung: Problem
A 1x
• 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 ...;
n Verzweigungen/Variablen 2n Pfade
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
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)
P(t) = S(t)?
P(t) = S(t)?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
8
Klassifikation von White-Box-Tests
Klassifikation Umfang des TestsC0 AnweisungsüberdeckungC1 KantenüberdeckungC1+ Kantenüberdeckung und Ausführung von Schleifen mit
ExtremwertenC1p Kantenüberdeckung und jede Bedingung wird einmal wahr
und einmal falsch ausgeführtC2 Kantenüberdeckung und jede Schleife wird
1. nicht ausgeführt2. mit einem niederen Zählwert ausgeführt3. mit einem hohen Zählwert ausgeführt
Cik Kantenüberdeckung und alle Schleifen werden für alle Zählwerte i bis k ausgeführt (i < k)
Ct Pfadüberdeckung
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
Testen: Vorgehen
9
1. Erkennen, dass Fehler vorliegt (bisher behandelt) 2. Lokalisierung des Fehlers, Bestimmung seiner Ursachen3. Korrigieren des Fehlers4. Testen des korrigierten Programms
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
10
Fehlerlokalisierung
• erfordert ca. 90% des Aufwands für Fehlerbeseitigung• Problem:
– Fortpflanzung: Fehler werden nicht an der Stelle sichtbar, wo sie entstehen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
11
Fehlerlokalisierung: Methoden
1. Speicherabzug (Dump)2. Kontrollausgabe3. Debugging
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
12
Fehlerlokalisierung: "Speicherabzug"
• "Momentaufnahme" des Speichers• statisch• Ausgabe aller Paare
(Name der Variable / Wert der Variable)• Nachteil: gewaltige Datenmenge, Identifikation der relevanten Werte
aufwendig
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
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;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
15
Bsp.: Debugging in Java-Umgebung Forte
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
16
Test: psychologische Komponente
• Tester Programmierer• Erfolg des Testers = Misserfolg des Programmierers• Testen hat destruktive Züge, Programmieren konstruktive• (langfristige) Ziele gleich: korrekte Programme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
17
Vielen Dank für die Aufmerksamkeit.
Fragen?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18Geoinformation3
18
Übungsaufgabe: Bestimmung der Testmenge
Algorithmus ZweiSegmentSchnittInput: Zwei Segmente, gegeben durch die Punkte p1, p2, p3, p4Output: true, wenn sich beide Segmente schneiden, sonst false{
if(p1 == p2 oder p3 == p4) then ….. //Sonderfallbehandlungelse{ 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 ...... //Sonderfallbehandlungelse if(p1 und p2 liegen auf verschiedenen Seiten von g2)
then if(p3 und p4 liegen auf verschied. Seiten von g1)
then return true; //Schnittpunkt gefunden
else return false; //kein Schnittpunktelse return false; //kein Schnittpunkt
}}