320 likes | 733 Views
Alexander Steinhöfer Christian Grafe. Kontrollflussorientierte Testverfahren. Gliederung. Was sind Kontrollflussorientierten Testverfahren? Einsatzzweck Arten von Verfahren / Beispiele Fazit / Abschluß. Definition. Gehören zur Gruppe der Strukturorientierten Testverfahren
E N D
Alexander Steinhöfer Christian Grafe Kontrollflussorientierte Testverfahren
Gliederung • Was sind Kontrollflussorientierten Testverfahren? • Einsatzzweck • Arten von Verfahren / Beispiele • Fazit / Abschluß
Definition • Gehören zur Gruppe der Strukturorientierten Testverfahren • Geben Keine Regel zur Erzeugung von Testfällen an • Betrachten die Struktur und Implementierung der Anweisungen des Quellcodes
Einsatzzweck Bei sog. White-Box-Tests handelt es sich um verschiedene Methoden von Software-Tests, bei der die Tests mit Kenntnissen über die innere Funktionsweise des zu testenden Systems entwickelt werden. Im Gegensatz zum Black-Box-Test ist für diesen Test also ein Blick in den Quellcode gestattet, d.h. es wird direkt am Code geprüft wo mögliche Fehler liegen. Bei allen gleich vorgestellten Testarten wird der Quellcode benötigt und zu überprüfen ob die Spezifikation eingehalten wurde.
Arten von Testverfahren Generell unterscheidet man zwischen vier Testverfahren, welche allerdings noch verfeinert werden. • Anweisungsüberdeckungstest (C0) • Zweigüberdeckungstest (C1) • Pfadüberdeckungstest (C2) • Bedingungsüberdeckungstest (C3)
Anweisungsüberdeckungstest (C0 Test)Statement Coverage • Ziel • Mindestens einmalige Ausführung aller Anweisungen (Knoten) des zu testenden Programms • Sicherstellung das kein „toter Code“ existiert. • Metrik
Beispiel C0 /*z wird das doppelte des größeren Werts von x oder y zugewiesen */ z = x; if(y > x) { z = y; } z *= 2; Testfall: y = 2, x = 0 Ergebnis: z = 4, Anweisungsüberdeckung: 100%
Anweisungsüberdeckungstest (C0 Test)Statement Coverage • Schwächen des C0-Verfahrens: • Nur 18% Fehlererkennungsrate • es müssen nicht alle Wege, die zu einer Anweisung führen überprüft werden: einer genügt • unzureichend für den Test von Schleifen • Bewertung • Notwendiges, aber nicht hinreichendes Testkriterium. • Nicht ausführbarer Code kann gefunden werden. • Als eigenständiges Testverfahren nicht geeignet, ist aber Bestandteil anderer Testverfahren, z.B. der Zweigüberdeckung.
Zweigüberdeckungstest (C1-Test)Branch Coverage bzw. Decision Coverage • Ziel: • Ausführung aller Zweige (Kanten) des zu testenden Programms • Eigenschaften • Durch eine 100 prozentige Zweigüberdeckung wird sichergestellt, daß im Prüfling keine Zweige existieren, die niemals ausgeführt wurden. • Die Anweisungsüberdeckung ist in der Zweigüberdeckung vollständig enthalten
Zweigüberdeckungstest (C1-Test)Branch Coverage bzw. Decision Coverage • Metrik
Beispiel C1 /*z wird das doppelte des größeren Werts von x oder y zugewiesen */ z = x; if(y > x) { z = y; } z *= 2; Testfall1: y = 2, x = 0 Testfall2: y = 0, x= 2 Ergebnis 1+2: z = 4, Zweigüberdeckung: 100%
Zweigüberdeckungstest (C1-Test)Branch Coverage bzw. Decision Coverage • Leistungsfähigkeit des C1-Tests • Die Fehleridentifikationsquote ist mit 34% um 16% besser als ein Anweisungs- überdeckungstest • Es werden 79% der Kontrollflußfehler und 20% der Berechnungsfehler gefunden
Zweigüberdeckungstest (C1-Test)Branch Coverage bzw. Decision Coverage • Schwächen des C1-Tests • Weder die Kombination von Zweigen noch komplexe Bedingungen werden berücksichtigt • Schleifen werden nicht ausreichend getestet, da ein einzelner Durchlauf durch den Schleifenkörper für die Zweigüberdeckung hinreichend ist • Fehlende Zweige können nicht direkt entdeckt werden.
Problemroutine für C0 + C1 Test Statement & Branch Coverage if (a < b) { x = b; z = 1; } else { x = a; z = 0; } if (a + b < 10) { y = x + b/z; } else { y = x + a; }
Beispiel einer fehlerhaften Routine C0- Überdeckung bei Testfällen T1: (a < b und a + b < 10) und T2: (a >= b und a + b >= 10 ) Fehler im Pfad 0; 1; 2; 4; 6 wird dabei nicht entdeckt
Pfadüberdeckungstest - Übersicht Vollständig - C2a • Alle möglichen Pfade werden durchlaufen • unmöglich bei Schleifen Boundary-Interior - C2b • wie C2a, Schleifen werden jedoch nach speziellen Regeln durchlaufen • aufwändig Strukturiert - C2c • wie C2b, Schleifen werden jedoch genau n-mal durchlaufen • aufwändig
Pfadüberdeckungstest C2a • Beim vollständige Pfadüberdeckungstest werden alle möglichen Pfade durch den Kontrollflussgraphen mindestens einmal ausgeführt. • Anzahl der Pfade steigt mit der Länge des Graphen exponentiell an. • Nicht anwendbar auf Programme, die bei Laufzeit die Schleifendurchläufe ermitteln, da die Test da die Testlaufzeit dann unendlich lang wird. • Somit wäre dieser Test sehr gut geeignet möglichst viele Fehler zu finden! Aber in Praxis nicht umsetzbar!
Formel Pfadüberdeckungstest C2a Die Formel zur Ermittlung des vollständigen Pfadüberdeckung lautet:
Pfadüberdeckungstest C2b Der Boundary-Interior Pfadüberdeckungstest versucht die Nachteile von C2a mit Schleifen zu vermeiden. Hierfür werden Testfälle erstellt, die alle Pfade abdecken, welche aber die Schleifen nicht betreten. Im Anschluss werden die Pfade betrachtet, welche die Schleife genau einmal ausführen. Für diese Fälle werden alle möglichen Pfade innerhalb der Schleife durchgetestet (Boundary Test). Als Letztes werden die Pfade, welche die Schleife mehr als einmal durchlaufen getestet, indem sie zwei mal durchlaufen werden. Alle weiteren Durchläufe werden ignoriert (Interior Test)
Formel Pfadüberdeckungstest C2b Die Formel zur Ermittlung der Überdeckung lautet:
Pfadüberdeckungstest C2c Beim Strukturierten Pfadüberdeckungstest handelt es sich um eine allgemeinere Form des C2a Tests. Hier wird bei den Pfaden, welche die Schleife mehr als einmal durchlaufen nicht schon nach dem zweiten Durchlauf abgebrochen, sondern nach dem k-ten Durchlauf, wobei k die Anzahl der Schleifeniterationen ist. je größer k gewählt wird um so größer wird der Aufwand!
PfadüberdeckungstestWiederholung Vollständig - C2a • Alle möglichen Pfade werden durchlaufen • unmöglich bei Schleifen Boundary-Interior - C2b • wie C2a, Schleifen werden jedoch nach speziellen Regeln durchlaufen • aufwändig Strukturiert - C2c • wie C2b, Schleifen werden jedoch genau n-mal durchlaufen • aufwändig
Bedingungsüberdeckungstest - Übersicht Einfachbedingung - C3a • jede atomare Bedingung wird einmal mit true und false getestet Mehrfachbedingung - C3b • jede true/false Kombination der atomaren Bedingungen wird getestet Minimale Mehrfachbedinung - C3c • jede atomare Bedingung und die Gesamtbedingung wird auf beide Bedingungen getestet
Bedingungsüberdeckungstest C3a • Einfachster aller C3 – Test • Er testet True / False Bedingungen auch bei Verzweigungen. Vorteil: Man bekommt auch Fehler die im Zusammenhang entstehen aus mehreren atomaren Bedingungen. • Jede atomare (a, b) Bedingung der Gesamtbedingung wird mindestens einmal mit dem Wert true und false belegt. • Dadurch ist jedoch nicht sichergestellt, dass die Gesamtbedingung auch einmal true und false wird ( a && b ) Deswegen ist der C3a ein sehr schlechter Test der nicht einmal den C0-Test enthält.
Bedingungsüberdeckungstest C3a • Beispiel für die Anfälligkeit! if (a && b) { cout << „FALL 1“; } else { cout << „FALL 2“; } Da a und b jeweils 1 mal auf true und false gesetzt werden, kann es sein das Fall 2 nicht getroffen wird!
Bedingungsüberdeckungstest C3b • Beim Mehrfachbedingungsüberdeckungstest wird jede atomare Bedingung nicht nur einmal auf alle möglichen Kombinationen getestet. Sondern alle möglichen Kombinationen • Sehr hoher Aufwand, da expotenzieller Anstieg der Laufzeit! Anzahl Kombinationen = 2^n wobei n = Anzahl der atomaren Bedingungen • In der Praxis oft nicht möglich wegen Laufzeit und Aufwand.
Bedingungsüberdeckungstest C3b • Beispiel für Unterschied if (a && b) { cout << „FALL 1“; } else { cout << „FALL 2“; } Bei C3a gibt es 2 Gesamtfälle – hier gibt es 4
Bedingungsüberdeckungstest C3c • Der Minimale Mehrfachbedingungsüberdeckungstest ist ein Kompromiss zwischen C3a (findet zu wenig) und C3b (dauert zu lang) • Auch der Minimale Mehrfachbedingungsüberdeckungstest enthält ausserdem den C0-, C1- und Einfachbedingungsüberdeckungstest vollständig. • Um dies zu erreichen wird zunächst wie beim C3a Test jede atomare Bedingung true und false, anschließend allerdings auch noch die Gesamtbedingung in beide Fälle gesetzt.
Bedingungsüberdeckungstest C3c • Vorteile des Kompromisses anhand Beispiel if(a == 0 XOR b == 0) { cout << “Fall 1”; } else { Cout << „Fall 2“; } Bei C3a gibt es 2 Gesamtfälle Bei C3b gibt es 4 Gesamtfälle Bei C3c gibt es 3 Gesamtfälle in akzeptabler Durchschnittszeit
Fazit • Die Qualität eines Tests hängt entscheidend vom gewählten Test ab: Wurde nur nach C0 mit Überdeckungsgrad 100% getestet so ist dies trotzdem kein verlässlicher Indikator für eine fehlerfreie Software. • Wurde hingegen mit C2a auf 100% getestet würde dies ein gutes Kriterium für eine fehlerfreie bzw. -arme Software darstellen. Leider ist dieser Test in der Praxis kaum durchzuführen. • Die zweite wichtige Größe ist natürlich der Überdeckungsgrad. Dieser ist aber nur bei Verwendung des gleichen Tests untereinander vergleichbar. • Bei einem hohen Überdeckungsgrad werden mehr Fehler gefunden als bei einem niedrigen.