Software-Projekt ¨Uberblick I - Informatik - Universität Bremen
Software-Projekt ¨Uberblick I - Informatik - Universität Bremen
Software-Projekt ¨Uberblick I - Informatik - Universität Bremen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Überblick I<br />
1 <strong>Software</strong>-Test<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
Prof. Dr. Rainer Koschke<br />
Fachbereich Mathematik und <strong>Informatik</strong><br />
Arbeitsgruppe <strong>Software</strong>technik<br />
<strong>Universität</strong> <strong>Bremen</strong><br />
Wintersemester 2008/09
<strong>Software</strong>-Test<br />
<strong>Software</strong>-Test<br />
1 <strong>Software</strong>-Test<br />
Begriffe des Testens<br />
Soziologie des Testens<br />
Testaktivitäten<br />
Testfall<br />
Teststümpfe und -treiber<br />
Komponententests<br />
Äquivalenztest<br />
Komponententest mit JUnit<br />
Grenztest<br />
Pfadtest<br />
Maße der Testabdeckung<br />
Zustandsbasiertes Testen<br />
Integrationstest<br />
Leistungstests<br />
Zusammenfassung der Testarten<br />
Testmanagement<br />
Testplan<br />
<strong>Software</strong>-Test<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 3 / 55<br />
Lernziele<br />
Testfallspezifikation<br />
Testschadensbericht<br />
Wiederholungsfragen<br />
Notwendigkeit und Grenzen des Tests verstehen<br />
Arten und Varianten des <strong>Software</strong>-Tests kennen<br />
eine geeignete Test-Strategie auswählen können<br />
Testpläne erstellen können<br />
Tests durchführen können<br />
N.B.: Diese Darstellung folgt in weiten Teilen Kapitel 11 des Buchs von<br />
Brügge und Dutoit (2004).<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 4 / 55
<strong>Software</strong>-Test<br />
Ein korrektes Programm?<br />
c l a s s K a l e n d e r {<br />
p u b l i c s t a t i c c l a s s MonatUngueltig e x t e n d s E x c e p t i o n { } ;<br />
p u b l i c s t a t i c c l a s s J a h r U n g u e l t i g e x t e n d s E x c e p t i o n { } ;<br />
p u b l i c s t a t i c b o o l e a n i s t S c h a l t J a h r ( i n t j a h r )<br />
{ r e t u r n ( j a h r % 4) == 0 ; }<br />
p u b l i c s t a t i c i n t TageProMonat ( i n t monat , i n t j a h r )<br />
throws MonatUngueltig , J a h r U n g u e l t i g {<br />
i n t anzTage ;<br />
i f ( j a h r < 1) { throw new J a h r U n g u e l t i g ( ) ; }<br />
i f ( monat i n {1 , 3 , 5 , 7 , 10 , 12}) { anzTage = 3 2 ; }<br />
e l s e i f ( monat i n {4 , 6 , 9 , 11}) { anzTage = 3 0 ; }<br />
e l s e i f ( monat == 2) {<br />
i f ( i s t S c h a l t J a h r ( j a h r ) ) anzTage = 2 9 ;<br />
e l s e anzTage = 2 8 ;<br />
} e l s e throw new MonatUngueltig ( ) ;<br />
r e t u r n anzTage ;<br />
}<br />
}<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 5 / 55<br />
<strong>Software</strong>-Test<br />
Testen und seine Begriffe<br />
Definition<br />
Zuverlässigkeit: Maß für den Erfolg, inwieweit das beobachtete Verhalten<br />
mit dem spezifizierten übereinstimmt.<br />
<strong>Software</strong>-Zuverlässigkeit: Wahrscheinlichkeit, dass ein <strong>Software</strong>-System<br />
während einer festgelegten Zeit unter festgelegten Bedingungen keinen<br />
Systemausfall verursachen wird (IEEE Std. 982-1989 1989).<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 6 / 55
<strong>Software</strong>-Test<br />
Definition<br />
Fehlerbegriff<br />
Störfall (Ausfall, Failure): jegliche Abweichung des beobachteten<br />
Verhaltens vom spezifizierten.<br />
Im Nicht-Schaltjahr 200 wird für den Monat Februar 29 ausgegeben.<br />
Fehlerhafter Zustand (Error): Zustand, in dem ein Weiterlaufen des<br />
Systems zu einem Störfall führen würde.<br />
Die Funktion istSchaltjahr(200) liefert true.<br />
Fehler (Defekt, Fault): mechanische oder algorithmische Ursache eines<br />
fehlerhaften Zustands.<br />
2009-01-13<br />
Die Prüfung in istSchaltjahr ist falsch.<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 8 / 55<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Begriffe des Testens<br />
Fehlerbegriff<br />
Fehlerbegriff<br />
Definition<br />
Störfall (Ausfall, Failure): jegliche Abweichung des beobachteten<br />
Verhaltens vom spezifizierten.<br />
Im Nicht-Schaltjahr 200 wird für den Monat Februar 29 ausgegeben.<br />
Fehlerhafter Zustand (Error): Zustand, in dem ein Weiterlaufen des<br />
Systems zu einem Störfall führen würde.<br />
Die Funktion istSchaltjahr(200) liefert true.<br />
Fehler (Defekt, Fault): mechanische oder algorithmische Ursache eines<br />
fehlerhaften Zustands.<br />
Die Prüfung in istSchaltjahr ist falsch.<br />
Mechanische Ursache: Fehler in der virtuellen Maschine (Plattform); z.B. Bug in Java-Virtual-Machine, Compiler<br />
oder Hardwaredefekt.<br />
Algorithmische Ursache: Fehler im Algorithmus, z.B. Off-by-One-Fehler, uninitialisierte Variable,<br />
Performanzengpässe aufgrund eines schlechten Entwurfs.
<strong>Software</strong>-Test<br />
Testen und seine Begriffe<br />
Definition<br />
Test: systematischer Versuch, in der implementierten <strong>Software</strong> Defekte zu<br />
finden.<br />
Erfolgreicher (positiver) Test: Test, der Defekt aufgedeckt hat.<br />
Erfolgloser (negativer) Test: Test, der keinen Defekt aufgedeckt hat.<br />
→ Tests sind Experimente zur Falsifikation der Hypothese “System ist<br />
korrekt”.<br />
→ Aus negativem Test folgt noch lange nicht, dass kein Defekt<br />
vorhanden ist.<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 9 / 55<br />
<strong>Software</strong>-Test<br />
Der Test und seine Verwandten<br />
Tests sind nur ein Mittel, die Zuverlässigkeit zu steigern:<br />
Fehlervermeidung (z.B. Entwicklungsmethoden, Verifikation, statische<br />
Analyse)<br />
Fehlerentdeckung (z.B. Tests, assert, “Quality-Feedback-Agent”,<br />
Flugschreiber)<br />
Fehlertoleranz: Behandlung von Fehlern zur Laufzeit, um Programm<br />
fortzusetzen<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 10 / 55
<strong>Software</strong>-Test<br />
Soziologie des Testens<br />
Testen wird häufig (aber zu unrecht) als niedere Arbeit angesehen<br />
→ Frischlinge werden zu Testern<br />
Tester brauchen jedoch ein umfassendes Systemverständnis<br />
(Anforderungen, Entwurf, Implementierung)<br />
Tester brauchen darüber hinaus, Wissen über Prüftechniken<br />
Autoren haben eine Lesart der Spezifikation verinnerlicht<br />
Denkfehler in der Implementierung werden sich bei Erstellung von<br />
Testfällen wiederholen<br />
→ Tester sollten nicht gleichzeitig Autoren sein<br />
Tester versuchen, Fehler zu finden<br />
das Produkt wird kritisiert, dann fühlen sich Autoren selbst kritisiert<br />
→ Egoless-Programming (eine schöne Illusion)<br />
<strong>Software</strong>-Test<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 11 / 55<br />
Managementplan<br />
Klassenentwurf<br />
Integrationsstrategie<br />
Subsystemzerlegung<br />
Funktionale<br />
Anforderungen<br />
Nichtfunktionale<br />
Anforderungen<br />
Entwickler Kunde Benutzer<br />
Testplan<br />
Komponententest<br />
Integrationstest<br />
Strukturtest<br />
Funktionstest<br />
Leistungstest<br />
Benutzungsschnittstellenentwurf<br />
Akzeptanztest<br />
Installationstest<br />
Benutzbarkeitstest<br />
Benutzungshandbuch<br />
Feldtest<br />
<strong>Projekt</strong>vereinbarung<br />
Normalbetrieb<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 12 / 55
2009-01-13<br />
<strong>Software</strong>-Test<br />
Testfall<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Testaktivitäten<br />
Quelle: Brügge und Dutoit (2004)<br />
• Testplanung: Betriebsmittelzuteilung und Zeitplan<br />
Managementplan<br />
Klassenentwurf<br />
Integrationsstrategie<br />
Subsystemzerlegung<br />
Funktionale<br />
Anforderungen<br />
Nichtfunktionale<br />
Anforderungen<br />
• Benutzbarkeitstest: Fehler im Benutzerschnittstellenentwurf aufdecken; siehe (Papier-)Prototypen<br />
• Komponententest: Fehler in einzelner Komponente (Klasse, Paket o.Ä.) aufdecken<br />
• Integrationstest: Fehler im Zusammenspiel von Komponenten aufdecken<br />
Entwickler Kunde Benutzer<br />
• Strukturtest: Integrationstest mit allen Komponenten (abschließender und vollständiger Integrationstest)<br />
• Systemtest: Test aller in einem System zusammengefasster Subsysteme mit dem Ziel, Fehler bezüglich der Szenarien aus<br />
der problemstellung sowie der Anforderungen und Entwurfsziele, die in der Analyse bzw. im Systementwurf identifiziert<br />
wurden, zu finden<br />
• Funktionstest: testet die Anforderungen aus dem Lastenheft und die Beschreibung des Benutzerhandbuchs<br />
• Leistungstest: Test der Leistungsanforderungen (Performanz und Speicherbedarf)<br />
• Installationstest: Test der Installation beim Kunden (evtl. mit der Hilfe der Entwickler)<br />
• Akzeptanztest: Prüfung bzgl. <strong>Projekt</strong>vereinbarung durch den Kunden (evtl. mit der Hilfe der Entwickler)<br />
Ein Testfall besteht aus:<br />
Name<br />
Ort: vollständiger Pfadname des<br />
lauffähigen Testprogramms<br />
Eingabe: Eingabedaten oder<br />
Befehle<br />
Orakel: erwartete<br />
Testergebnisse, die mit den<br />
aktuellen Testergebnissen des<br />
Testlaufs verglichen werden<br />
Protokoll: gesamte Ausgabe, die<br />
durch Test erzeugt wird<br />
Testplan<br />
Komponententest<br />
Integrationstest<br />
Strukturtest<br />
Funktionstest<br />
Leistungstest<br />
Eingabe Prüfling Ist-Ergebnis<br />
Benutzungsschnittstellenentwurf<br />
Akzeptanztest<br />
Installationstest<br />
Benutzbarkeitstest<br />
Benutzungshandbuch<br />
Feldtest<br />
<strong>Projekt</strong>vereinbarung<br />
Normalbetrieb<br />
Vergleich Protokoll<br />
Soll-Ergebnis<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 13 / 55
<strong>Software</strong>-Test<br />
Komponententest: Teststümpfe und -treiber<br />
2009-01-13<br />
spätere Umgebung Testumgebung<br />
Benutzerklasse Y<br />
Prüfling C<br />
Benutzerklasse X<br />
Benutzte Klasse A Benutzte Klasse B<br />
Testtreiber<br />
Prüfling C<br />
Benutzte Klasse A Teststumpf für benutzte Klasse B<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 14 / 55<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Teststümpfe und -treiber<br />
Komponententest: Teststümpfe und -treiber<br />
Komponententest: Teststümpfe und -treiber<br />
spätere Umgebung Testumgebung<br />
Benutzerklasse Y<br />
Prüfling C<br />
Benutzerklasse X<br />
Benutzte Klasse A Benutzte Klasse B<br />
Bestreben: Komponenten so früh wie möglich testen.<br />
Problem: die benutzenden Komponenten und die benutzten Komponenten existieren möglicherweise noch nicht.<br />
Lösung: Testtreiber und -stümpfe<br />
• Prüfling/Testkomponente: die zu testende Klasse/Komponente<br />
• Testtreiber: simuliert den Teil des Systems, der die Testkomponente benutzt<br />
• Teststumpf: simuliert die Komponenten, die die Testkomponente benutzt<br />
In vielen Fällen: Aufwand für Teststumpf entspricht Aufwand für die eigentliche Komponente →<br />
Bottom-Up-Entwicklung der Komponenten<br />
Testtreiber<br />
Prüfling C<br />
Benutzte Klasse A Teststumpf für benutzte Klasse B
<strong>Software</strong>-Test<br />
Typen von Komponententests<br />
Definition<br />
Black-Box-Tests: Komponente wird nur mit Kenntnis der<br />
Schnittstellenbeschreibung entworfen (Implementierung unbekannt).<br />
Techniken:<br />
Äquivalenztest<br />
Grenztest<br />
(zustandsbasierter Test)<br />
. . .<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 15 / 55<br />
<strong>Software</strong>-Test<br />
Typen von Komponententests<br />
Definition<br />
White-/Glass-Box-Tests: Testfall wird mit Kenntnis der Implementierung<br />
entworfen.<br />
Techniken:<br />
Pfadtest<br />
(zustandsbasierter Test)<br />
. . .<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 16 / 55
<strong>Software</strong>-Test<br />
Äquivalenztest I<br />
Ziel: Testfälle minimieren.<br />
Idee:<br />
Kriterien:<br />
Äquivalente Testfälle werden zusammengefasst.<br />
Ein Testfall wird als Repräsentant der Äquivalenzklasse aufgestellt.<br />
Abdeckung: Jede mögliche Eingabe gehört zu einer der<br />
Äquivalenzklassen<br />
Disjunktion: Keine Eingabe gehört zu mehr als einer einzigen<br />
Äquivalenzklasse<br />
Repräsentation (die Hoffnung): Falls Ausführung einen fehlerhaften<br />
Zustand anzeigt, sobald ein bestimmtes Mitglied einer<br />
Äquivalenzklasse als Eingabe benutzt wird, dann kann derselbe<br />
fehlerhafte Zustand entdeckt werden, wenn irgendein anderes Mitglied<br />
dieser Äquivalenzklasse als Eingabe verwendet wird<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 17 / 55<br />
<strong>Software</strong>-Test<br />
Äquivalenztest II<br />
Für jede Äquivalenzklasse werden mindestens zwei Testeingaben<br />
ausgewählt:<br />
typische Eingabe, die den allgemeinen Fall abprüft<br />
unvollständige Eingabe, die auf korrektes Verhalten im Fehlerfall prüft<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 18 / 55
<strong>Software</strong>-Test<br />
Ein korrektes Programm?<br />
c l a s s K a l e n d e r {<br />
p u b l i c s t a t i c c l a s s MonatUngueltig e x t e n d s E x c e p t i o n { } ;<br />
p u b l i c s t a t i c c l a s s J a h r U n g u e l t i g e x t e n d s E x c e p t i o n { } ;<br />
p u b l i c s t a t i c b o o l e a n i s t S c h a l t J a h r ( i n t j a h r )<br />
{ r e t u r n ( j a h r % 4) == 0 ; }<br />
p u b l i c s t a t i c i n t TageProMonat ( i n t monat , i n t j a h r )<br />
throws MonatUngueltig , J a h r U n g u e l t i g {<br />
i n t anzTage ;<br />
i f ( j a h r < 1) { throw new J a h r U n g u e l t i g ( ) ; }<br />
i f ( monat i n {1 , 3 , 5 , 7 , 10 , 12}) { anzTage = 3 2 ; }<br />
e l s e i f ( monat i n {4 , 6 , 9 , 11}) { anzTage = 3 0 ; }<br />
e l s e i f ( monat == 2) {<br />
i f ( i s t S c h a l t J a h r ( j a h r ) ) anzTage = 2 9 ;<br />
e l s e anzTage = 2 8 ;<br />
} e l s e throw new MonatUngueltig ( ) ;<br />
r e t u r n anzTage ;<br />
}<br />
}<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 19 / 55<br />
<strong>Software</strong>-Test<br />
Beispielspezifikation<br />
Kalender.TageProMonat(monat,jahr) liefere die Tage eines Monats<br />
wie folgt:<br />
Fehlerfall<br />
monat ∈ {1, 3, 5, 7, 8, 10, 12} ⇒ 31<br />
monat ∈ {4, 6, 9, 11} ⇒ 30<br />
jahr ist ein Schaltjahr ∧ monat = 2 ⇒ 29<br />
jahr ist kein Schaltjahr ∧ monat = 2 ⇒ 28<br />
monat < 1 ∨ monat > 12 ⇒ throw MonatUngueltig<br />
jahr < 0 ⇒ throw JahrUngueltig<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 20 / 55
<strong>Software</strong>-Test<br />
Beispieläquivalenzklassen<br />
Äquivalenzklassen:<br />
für Monate:<br />
Monate mit 31 Tagen<br />
Monate mit 30 Tagen<br />
Monate mit 28 oder 29 Tagen<br />
monat außerhalb gültigen Bereichs<br />
für Jahre:<br />
Schaltjahre<br />
Jahre, die keine Schaltjahre sind<br />
jahr außerhalb gültigen Bereichs<br />
→ Kombination der Äquivalenzklassen für alle Eingabeparameter ergibt<br />
Äquivalenzklassen für TageProMonat<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 21 / 55<br />
<strong>Software</strong>-Test<br />
Beispieltestfälle<br />
Test der Interaktion von monat und jahr durch Kombination:<br />
Äquivalenzklasse monat jahr Soll<br />
31-Tage-Monat, Nicht-Schaltjahre 7 1901 31<br />
31-Tage-Monat, Schaltjahre 7 1904 31<br />
30 Tage-Monat, Nicht-Schaltjahre 6 1901 30<br />
30 Tage-Monat, Schaltjahre 6 1904 30<br />
Februar, Nicht-Schaltjahre 2 1901 28<br />
Februar, Schaltjahre 2 1904 29<br />
monat inkorrekt, jahr korrekt 17 1901 MonatUngueltig<br />
monat korrekt, jahr inkorrekt 7 -1901 JahrUngueltig<br />
monat inkorrekt, jahr inkorrekt 17 -1901 MonatUngueltig<br />
∨JahrUngueltig<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 22 / 55
<strong>Software</strong>-Test<br />
Komponententest mit JUnit<br />
import j u n i t . framework . ∗ ;<br />
p u b l i c c l a s s K a l e n d e r T e s t e x t e n d s TestCase {<br />
}<br />
p u b l i c K a l e n d e r T e s t ( S t r i n g name ) {<br />
s u p e r ( name ) ;<br />
}<br />
. . .<br />
// Test−Methoden<br />
. . .<br />
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {<br />
j u n i t . s w i n g u i . TestRunner . run ( K a l e n d e r T e s t . c l a s s ) ;<br />
}<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 23 / 55<br />
<strong>Software</strong>-Test<br />
Komponententest mit JUnit<br />
p u b l i c v o i d testTageProMonat1 ( ) {<br />
// 31−Tage−Monat , Nicht−S c h a l t j a h r e<br />
a s s e r t E q u a l s ( 3 1 , K a l e n d e r . TageProMonat ( 7 , 1 9 0 1 ) ) ;<br />
}<br />
p u b l i c v o i d testTageProMonat9 ( ) {<br />
// monat i n k o r r e k t , j a h r i n k o r r e k t<br />
t r y { i n t t = K a l e n d e r . TageProMonat ( 1 3 , −1901);<br />
a s s e r t T r u e ( f a l s e ) ; }<br />
c a t c h ( K a l e n d e r . J a h r U n g u e l t i g j e ) {} // e x p e c t e d<br />
c a t c h ( K a l e n d e r . MonatUngueltig me) {} // e x p e c t e d<br />
c a t c h ( E x c e p t i o n e ) { f a i l ( ” E x c e p t i o n e x p e c t e d ” ) ; }<br />
}<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 24 / 55
<strong>Software</strong>-Test<br />
Komponententest mit JUnit<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 25 / 55<br />
<strong>Software</strong>-Test<br />
Grenztest<br />
Beobachtung: “Off-by-one”-Fehler kommen häufig vor.<br />
Idee: Grenzen (Randbereiche) von<br />
Äquivalenzklassen testen.<br />
Schaltjahrregel: Ein Jahr ist ein Schaltjahr, wenn<br />
es durch 4 teilbar ist,<br />
es sei denn, es ist durch 100 teilbar,<br />
es sei denn, es ist durch 400 teilbar<br />
2000 ist ein Schaltjahr, 1900 ist kein Schaltjahr.<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 26 / 55
<strong>Software</strong>-Test<br />
Grenztest<br />
Äquivalenzklasse monat jahr Soll<br />
Schaltjahre teilbar durch 400 2 2000 29<br />
Nicht-Schaltjahre teilbar durch 100 2 1900 28<br />
gültige Monate 1 2000 31<br />
gültige Monate 12 2000 31<br />
Nichtpositive ungültige Monate 0 1234 MonatUngueltig<br />
Positive ungültige Monate 13 1234 MonatUngueltig<br />
gültiges Jahr 2 0 29<br />
gültiges Jahr 3 Max-Int 31<br />
ungültiges Jahr 2 -1 JahrUngueltig<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 27 / 55<br />
<strong>Software</strong>-Test<br />
Pfadtest<br />
Ziel: Testfälle sollten alle Code-Teile testen.<br />
Idee: Konstruiere Testfälle, die jeden möglichen Pfad mindestens einmal<br />
ausführen.<br />
Ausgangspunkt: Kontrollflussgraph (KFG) pro Methode.<br />
Knoten: Anweisungen und Prädikate<br />
zwei weitere Knoten: eindeutiger Anfang und Ende einer Methode<br />
Kanten: Kontrollfluss zwischen Anweisungen (unbedingt) und<br />
Prädikaten (bedingt)<br />
Pfad: Menge von Kanten, die vom Anfang zum Ende des KFGs führen<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 28 / 55
<strong>Software</strong>-Test<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 29 / 55<br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
C0, Anweisungsüberdeckung (Befehlsabdeckung/Statement-Coverage):<br />
Verhältnis von Anzahl der mit Testdaten durchlaufenen<br />
Anweisungen zur Gesamtanzahl der Anweisungen.<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 30 / 55
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
C0, Anweisungsüberdeckung (Befehlsabdeckung/Statement-Coverage):<br />
Verhältnis von Anzahl der mit Testdaten durchlaufenen<br />
Anweisungen zur Gesamtanzahl der Anweisungen.<br />
Befehlsabdeckung / statement coverage / C0-Abdeckung: Gesucht ist eine Menge von Testfällen, die jeden Befehl<br />
in dem zu testenden Code mindestens einmal ausführen. Dieses Kriterium ist sehr schwach, denn es werden in der<br />
Regel nur sehr wenige Fehler (20%) gefunden. Fehler entstehen meist dadurch, dass Befehle in bestimmten<br />
Zuständen ausgeführt werden und nicht nur in irgendeinem.<br />
Ein Code-Coverage-Tool kann helfen, um zu sehen, welche Befehle nicht oder selten ausgeführt werden. Denn ein<br />
notwendiges Kriterium ist die Befehlsabdeckung allemal.<br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
C1, Zweig-/Entscheidungsüberdeckung Verhältnis von Anzahl der mit<br />
Testdaten durchlaufenen Zweige zur Gesamtanzahl der<br />
Zweige.<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
n = 29 n = 28<br />
return n<br />
Aktivität<br />
[istSchaltJahr(jahr)]<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 31 / 55<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
C1, Zweig-/Entscheidungsüberdeckung Verhältnis von Anzahl der mit<br />
Testdaten durchlaufenen Zweige zur Gesamtanzahl der<br />
Zweige.<br />
Jedes Prädikat muss im Code mindestens einmal wahr und einmal falsch sein. Schließt die Befehlabdeckung mit ein<br />
(es sei denn, es gibt unerreichbare Befehle) und ist äquivalent zur Befehlsabdeckung, wenn jeder wahr/falsch-Fall<br />
auch mindestens einen Befehl beinhaltet. Dieses Kriterium ist weiterhin relativ schwach. Erfahrungsgemäß 25%<br />
Fehlerfindung.<br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
C2, Bedingungsabdeckung Verhältnis von Anzahl der mit Testdaten<br />
durchlaufenen Terme innerhalb von Entscheidungen zur<br />
Gesamtanzahl der Terme.<br />
i := 1 ;<br />
l o o p<br />
found := a ( i ) = key ;<br />
e x i t when found or i = M a x E n t r i e s ;<br />
i := i + 1 ;<br />
end l o o p ;<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 32 / 55<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
C2, Bedingungsabdeckung Verhältnis von Anzahl der mit Testdaten<br />
durchlaufenen Terme innerhalb von Entscheidungen zur<br />
Gesamtanzahl der Terme.<br />
i := 1 ;<br />
l o o p<br />
found := a ( i ) = key ;<br />
e x i t when found or i = M a x E n t r i e s ;<br />
i := i + 1 ;<br />
end l o o p ;<br />
Nur verschieden von C1, wenn logische Operatoren keine Short-Circuit-Operatoren sind (d.h. es werden<br />
grundsätzlich alle Operanden eines logischen Operators ausgewertet).<br />
In jedem Prädikat wird jeder Bedingungsteil (Konjunktions- oder Alternationsglied) mindestens einmal wahr und<br />
einmal falsch gesetzt.<br />
N.B.: Das umfasst nicht die Entscheidungsfallabdeckung:<br />
true and false → false-Kante<br />
false and true → false-Kante<br />
(sofern der Operator and kein Short-Circuit-Operator ist).<br />
Man sollte beide kombinieren.<br />
Man bedenke, dass false and x → false ist wenn x keine Seiteneffekte hat.<br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
C3, Abdeckung aller Bedingungskombinationen Verhältnis von Anzahl der<br />
mit Testdaten durchlaufenen Bedingungskombinationen zur<br />
Gesamtanzahl der Bedingungskombinationen.<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 33 / 55
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
C3, Abdeckung aller Bedingungskombinationen Verhältnis von Anzahl der<br />
mit Testdaten durchlaufenen Bedingungskombinationen zur<br />
Gesamtanzahl der Bedingungskombinationen.<br />
Bedingungenkombinationsabdeckung / multiple condition coverage: Hier werden Prädikate gemäß einer<br />
Wahrheitstabelle alle Bedingungskombinationen aller in allen Kombinationen mal wahr und mal falsch gesetzt.<br />
Interessanterweise bringt dies nicht viel mehr an Erfolg, aber viel mehr an Aufwand. ·<br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
C4, Pfadabdeckung Verhältnis von Anzahl der mit Testdaten<br />
durchlaufenen Pfade zur Gesamtanzahl der Pfade.<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
n = 29 n = 28<br />
return n<br />
Aktivität<br />
[istSchaltJahr(jahr)]<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 34 / 55<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
Maße der Testabdeckung<br />
C4, Pfadabdeckung Verhältnis von Anzahl der mit Testdaten<br />
durchlaufenen Pfade zur Gesamtanzahl der Pfade.<br />
(Eingeschränkte) Pfadabdeckung: Hier werden auch bei Schleifen mehrere Durchläufe gemacht (keinmal, einmal,<br />
zweimal, typische Anzahl, maximale Anzahl). In aller Regel wird nicht auf diese Weise getestet, da der Aufwand<br />
sehr groß ist.<br />
<strong>Software</strong>-Test<br />
Probleme beim Pfadtest<br />
Unrealisierbare Pfade:<br />
f o r ( i = 0 ; i < o . f o o ( ) ; i ++) // immer o . f o o ( ) == 0 ?<br />
{<br />
x = . . .<br />
}<br />
. . .x. . . // hat x d e f i n i e r t e n Wert ?<br />
i f ( p ) {. . .}<br />
i f ( q ) { // p => not q ??<br />
. . .<br />
}<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 35 / 55<br />
Verzweigung<br />
[jahr < 1]<br />
[monat in {1,3,5,7,10,12}]<br />
[monat in {4,6,9,11}]<br />
[monat == 2]<br />
throw new MonatUngueltig<br />
Ende<br />
Anfang<br />
throw new JahrUngueltig<br />
Bedingung<br />
n = 30<br />
n = 32<br />
[istSchaltJahr(jahr)]<br />
n = 29 n = 28<br />
return n<br />
Aktivität
<strong>Software</strong>-Test<br />
Polymorphismustest<br />
2009-01-13<br />
c l a s s T { p u b l i c i n t f o o ( ) ; }<br />
c l a s s NT e x t e n d s T { p u b l i c i n t f o o ( ) ; }<br />
c l a s s F a c t o r y { T c r e a t e ( i n t i ) ; }<br />
c l a s s UnderTest {<br />
v o i d bar ( i n t i )<br />
{ T t = ( new F a c t o r y ) . c r e a t e ( i ) ;<br />
}<br />
}<br />
i f ( t . f o o ( ) > 0)<br />
doSomething ( ) ;<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 36 / 55<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Maße der Testabdeckung<br />
Polymorphismustest<br />
Polymorphismustest<br />
c l a s s T { p u b l i c i n t f o o ( ) ; }<br />
c l a s s NT e x t e n d s T { p u b l i c i n t f o o ( ) ; }<br />
c l a s s F a c t o r y { T c r e a t e ( i n t i ) ; }<br />
c l a s s UnderTest {<br />
v o i d bar ( i n t i )<br />
{ T t = ( new F a c t o r y ) . c r e a t e ( i ) ;<br />
}<br />
}<br />
i f ( t . f o o ( ) > 0)<br />
doSomething ( ) ;<br />
Methode bar kann nicht in Isolation getestet werden. Welches foo im Beispiel ausgeführt wird, hängt vom<br />
dynamischen Typ von t ab. Davon hängen wiederum die weiteren Pfade ab.
<strong>Software</strong>-Test<br />
Zustandsbasiertes Testen<br />
Verhalten von Komponente hängt ab von<br />
der Eingabe<br />
ihrem Zustand<br />
c l a s s Stack {<br />
p u b l i c s t a t i c c l a s s EmptyStack e x t e n d s E x c e p t i o n { } ;<br />
p u b l i c s t a t i c c l a s s F u l l S t a c k e x t e n d s E x c e p t i o n { } ;<br />
}<br />
p u b l i c Stack ( i n t maxSize ) {. . . } ;<br />
p u b l i c b o o l e a n isEmpty ( ) {. . . } ;<br />
p u b l i c i n t s i z e ( ) {. . . } ;<br />
p u b l i c Object top ( ) throws EmptyStack {. . . } ;<br />
p u b l i c v o i d push ( Object o ) throws F u l l S t a c k {. . . } ;<br />
p u b l i c v o i d pop ( ) throws EmptyStack {. . . } ;<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 37 / 55<br />
<strong>Software</strong>-Test<br />
Zustände eines Stacks<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 38 / 55
<strong>Software</strong>-Test<br />
Zustandsbasiertes Testen<br />
Für alle Zustände einer Komponente:<br />
Komponente wird in zu testenden Zustand gebracht<br />
Test für alle möglichen Stimuli:<br />
korrekte Eingaben,<br />
fehlerhafte Eingaben<br />
und Aktionen, die Zustandsübergänge bewirken<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 39 / 55<br />
<strong>Software</strong>-Test<br />
Zustandsbasiertes Testen I<br />
p u b l i c v o i d t e s t S t a t e F u l l ( ) {<br />
// t e s t o f S t a t e f u l l<br />
f i n a l i n t max = 1 0 0 ;<br />
Stack s = new Stack ( max ) ;<br />
Object l a s t = new Object ( ) ;<br />
// put Stack i n t o s t a t e f u l l<br />
f o r ( i n t i = 1 ; i
<strong>Software</strong>-Test<br />
Zustandsbasiertes Testen II<br />
}<br />
// t e s t l e g a l a c t i o n ’ isEmpty ’ ; no t r a n s i t i o n<br />
a s s e r t E q u a l s ( f a l s e , s . isEmpty ( ) ) ;<br />
// t e s t i l l e g a l a c t i o n ’ push ’<br />
t r y { s . push ( new Object ( ) ) ; f a i l ( ” e x c e p t i o n e x p e c t e d ” ) ; }<br />
c a t c h ( Stack . F u l l S t a c k e ) {} // OK<br />
// t e s t l e g a l a c t i o n / t r a n s i t i o n ’ pop ’<br />
s . pop ( ) ;<br />
// r e v e r s e t r a n s i t i o n<br />
s . push ( new Object ( ) ) ;<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 41 / 55<br />
<strong>Software</strong>-Test<br />
Vergleich von White- und Black-Box-Tests<br />
Black-Box-Tests (Funktionstests) betrachten den Prüfling als schwarze<br />
Box. Sie setzen keine Kenntnisse über die Interna voraus.<br />
White-Box-Tests (Strukturtests, Glass-Box-Tests) betrachten Interna des<br />
Prüflings, um Testfälle zu entwickeln.<br />
Eigenschaft Black-Box-Test White-Box-Test<br />
Test auf Basis von Schnittstellen- Lösung<br />
spezifikation<br />
Wiederverwendung bei ja eingeschränkt<br />
Änderung der Struktur<br />
Geeignet für Testart alle Komponententest<br />
Finden Fehler aufgrund von Abweichung von Spez. eher Kodierfehler<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 42 / 55
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Zustandsbasiertes Testen<br />
Vergleich von White- und Black-Box-Tests<br />
Vergleich von White- und Black-Box-Tests<br />
Black-Box-Tests (Funktionstests) betrachten den Prüfling als schwarze<br />
Box. Sie setzen keine Kenntnisse über die Interna voraus.<br />
White-Box-Tests (Strukturtests, Glass-Box-Tests) betrachten Interna des<br />
Prüflings, um Testfälle zu entwickeln.<br />
Eigenschaft Black-Box-Test White-Box-Test<br />
Test auf Basis von Schnittstellen- Lösung<br />
spezifikation<br />
Wiederverwendung bei ja eingeschränkt<br />
Änderung der Struktur<br />
Geeignet für Testart alle Komponententest<br />
Finden Fehler aufgrund von Abweichung von Spez. eher Kodierfehler<br />
White-Box Methoden eignen sich lediglich für den Modultest, allenfalls noch für den Integrationstest. Die Idee ist<br />
es, die Testfälle anhand der inneren Programmstruktur zu finden.<br />
Achtung: White-Box-Testing testet keine fehlenden Pfade oder Anweisungen. Das ist eine echte Schwäche, denn es<br />
wird nur das getestet, woran der Programmierer auch wirklich (wenn auch evtl. fehlerhaft) gedacht hat!<br />
Black-Box-Tests können wiederverwendet werden, wenn sie die Struktur, aber nicht das Verhalten ändert.<br />
<strong>Software</strong>-Test<br />
Black- versus White-Box-Tests<br />
Nicht entweder-oder, sondern sowohl-als-auch!<br />
Komplementäre Verwendung:<br />
1 Erstelle Funktionstest<br />
2 Messe Abdeckung<br />
3 Wenn Abdeckung nicht ausreichend; ergänze durch Strukturtest;<br />
zurück zu 2.<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 43 / 55
<strong>Software</strong>-Test<br />
Strategien des Integrationstests I<br />
Urknalltest: alle Komponenten werden einzeln entwickelt und dann in<br />
einem Schritt integriert<br />
→ erschwert Fehlersuche<br />
Bottom-Up: Integration erfolgt inkrementell in umgekehrter Richtung<br />
zur Benutzt-Beziehung<br />
→ keine Testrümpfe notwendig (aber Testtreiber)<br />
→ Fehler in der obersten Schicht werden sehr spät entdeckt; die enthalten<br />
jedoch die Applikationslogik<br />
Top-Down: Integration erfolgt in Richtung der Benutzt-Beziehung<br />
→ Fehler in der obersten Schicht werden sehr früh entdeckt<br />
→ Testrümpfe notwendig<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 44 / 55<br />
<strong>Software</strong>-Test<br />
Strategien des Integrationstests II<br />
Sandwich-Test-Strategie: Kombination von Top-Down und<br />
Bottom-Up<br />
Identifikation der zu testenden Schicht: Zielschicht<br />
zuerst: individuelle Komponententests<br />
dann: kombinierte Schichttests:<br />
- Oberschichttest mit Zielschicht<br />
- Zielschicht mit Unterschicht<br />
- alle Schichten zusammen<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 45 / 55
<strong>Software</strong>-Test<br />
Leistungstests<br />
Härtetest: viele gleichzeitige Anfragen<br />
Volumentest: große Datenmengen<br />
Sicherheitstests: Sicherheitslücken aufspüren<br />
Zeitvorgabentests: werden spezifizierte Antwortzeiten eingehalten?<br />
Erholungstests: Tests auf Erholung von fehlerhaften Zuständen<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 46 / 55<br />
<strong>Software</strong>-Test<br />
Zusammenfassung der Testarten<br />
Komponententest<br />
Black−Box−Test<br />
Grenztest zustands−<br />
basierter Test<br />
Äquivalenztest<br />
White−Box−Test<br />
Pfadtest<br />
Integrationstest<br />
Strategie:<br />
− Urknall<br />
− Top−Down<br />
− Bottom−Up<br />
− Sandwich<br />
Härtetest<br />
Leistungstest<br />
Systemtest<br />
Funktionstest Feldtest Installationstest<br />
Volumentest<br />
Sicherheitstest<br />
Akzeptanztest<br />
Erholungstest<br />
Zeitvorgabentest<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 47 / 55
<strong>Software</strong>-Test<br />
Testdokumentation: Aufzeichnung der Testaktivitäten<br />
Testplan: <strong>Projekt</strong>plan fürs Testen<br />
Testfallspezifikation: Dokumentation eines jeden Testfalls<br />
Testvorfallbericht (Testprotokoll): Ergebnisse des Tests und<br />
Unterschiede zu erwarteten Ergebnissen<br />
Testübersicht: Auflistung aller Fehler (entdeckt und noch zu<br />
untersuchen)<br />
→ Analyse und Priorisierung aller Fehler und deren Korrekturen<br />
Testplan und Testfallspezifikation können sehr früh schon erstellt werden.<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 48 / 55<br />
<strong>Software</strong>-Test<br />
Testplan (IEEE Std. 829-1998 1998)<br />
1. Einführung<br />
2. Beziehung zu anderen Dokumenten<br />
3. Systemüberblick<br />
4. Merkmale, die getestet/nicht getestet werden müssen<br />
5. Abnahmekriterien<br />
6. Vorgehensweise<br />
7. Aufhebung und Wiederaufnahme<br />
8. Zu prüfendes Material (Hardware-/<strong>Software</strong>anforderungen)<br />
9. Testfälle<br />
10. Testzeitplan: Verantwortlichkeiten, Personalausstattung und<br />
Weiterbildungsbelange, Risiken und Schadensmöglichkeiten, Zeitplan<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 49 / 55
2009-01-13<br />
<strong>Software</strong>-<strong>Projekt</strong><br />
<strong>Software</strong>-Test<br />
Testplan<br />
Testplan (IEEE Std. 829-1998 1998)<br />
Testplan (IEEE Std. 829-1998 1998)<br />
1. Einführung<br />
2. Beziehung zu anderen Dokumenten<br />
3. Systemüberblick<br />
4. Merkmale, die getestet/nicht getestet werden müssen<br />
5. Abnahmekriterien<br />
6. Vorgehensweise<br />
7. Aufhebung und Wiederaufnahme<br />
8. Zu prüfendes Material (Hardware-/<strong>Software</strong>anforderungen)<br />
9. Testfälle<br />
10. Testzeitplan: Verantwortlichkeiten, Personalausstattung und<br />
Weiterbildungsbelange, Risiken und Schadensmöglichkeiten, Zeitplan<br />
(Entspricht einer vereinfachten Variante von IEEE Std. 829-1998 (1998).)<br />
2.: Beziehung zu Anforderungsspezifikation und Architekturbeschreibung; Einführung von Namenskonventionen, um<br />
Tests und Anforderungen/Architektur in Beziehung zu setzen.<br />
3.: Überblick über System hinsichtlich jener Komponenten, die durch Komponententests geprüft werden sollen.<br />
Granularität der Komponenten und ihre Abhängigkeiten.<br />
4.: Konzentration auf funktionale Gesichtspunkte beim Testen; identifiziert alle merkmale und Kombinationen von<br />
Merkmalen, die getestet werden müssen. Beschreibt auch diejenigen Merkmale, die nicht getestet werden und gibt<br />
Gründe dafür an.<br />
5.: Spezifiziert Abnahmekriterien für die Tests (z.B. Testabdeckung).<br />
6.: Allgemeine Vorgehensweisen beim Testablauf; Integrationsstrategien.<br />
7.: Kriterien, wann Testaktivitäten ausgesetzt werden. Testaktivitäten, die wiederholt werden müssen, wenn das<br />
Testen wieder aufgenommen wird.<br />
8.: Notwendige Betriebsmittel: physikalische Eigenarten der Umgebung sowie Anforderungen an <strong>Software</strong>,<br />
Hardware, Testwerkzeuge und andere Betriebsmittel (z.B. Arbeitsraum).<br />
9.: (das Herzstück des Testplans) Auflistung aller Testfälle anhand individueller Testfallspezifikationen.<br />
<strong>Software</strong>-Test<br />
Testfallspezifikation<br />
Testfallbezeichner: eindeutiger Name des Testfalls; am Besten<br />
Namenskonventionen benutzen<br />
Testobjekte: Komponenten (und deren Merkmale), die getestet<br />
werden sollen<br />
Eingabespezifikationen: erwartete Eingaben<br />
Ausgabespezifikationen: erwartete Ausgaben<br />
Umgebungserfordernisse: notwendige <strong>Software</strong>- und<br />
Hardware-Plattform sowie Testrümpfe und -stümpfe<br />
Besondere prozedurale Anforderungen: Einschränkungen wie<br />
Zeitvorgaben, Belastung oder Eingreifen durch den Operateur<br />
Abhängigkeiten zwischen Testfällen<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 50 / 55
<strong>Software</strong>-Test<br />
Testschadensbericht<br />
welche Merkmale wurden getestet?<br />
wurden sie erfüllt?<br />
bei Störfällen: wie können sie reproduziert werden?<br />
→ Sammlung und Priorisierung in der Testübersicht<br />
→ Test = Fehlersuche bzw. -korrektur!<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 51 / 55<br />
<strong>Software</strong>-Test<br />
Wiederholungsfragen I<br />
Erläutern Sie die Unterschiede in den Fehlerbegriffen Störfall,<br />
fehlerhafter Zustand und Fehler.<br />
Was ist ein positiver, was ein negativer Testfall?<br />
Wer sollte testen?<br />
Welche Arten von Tests gibt es?<br />
Was ist ein Testfall?<br />
Welche Aufgabe erfüllen Teststümpfe und -treiber für den<br />
Komponententest?<br />
Was ist der Unterschied von Black- und Glass-Box-Tests?<br />
Welche Techniken des Komponententests gibt es?<br />
Erläutern Sie die Idee von<br />
Äquivalenztests am konkreten Beispiel.<br />
Erläutern Sie die Idee von Grenztests am konkreten Beispiel.<br />
Erläutern Sie die Idee von Pfadtests am konkreten Beispiel.<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 52 / 55
<strong>Software</strong>-Test<br />
Wiederholungsfragen II<br />
<strong>Software</strong>-Test<br />
Wie benutzt man JUnit für den Komponententest?<br />
Wozu benötigt man Polymorphismustests?<br />
Erläutern Sie die Idee von zustandsbasierten Tests am konkreten<br />
Beispiel.<br />
Welche Testabdeckungsmaße gibt es?<br />
Nennen Sie Strategien für Integrationstests und diskutieren Sie sie.<br />
Erläutern Sie Leistungstests.<br />
Was ist ein Testplan?<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 53 / 55<br />
1 Brügge und Dutoit 2004 Brügge, Bernd ; Dutoit, Allen H.:<br />
Objektorientierte <strong>Software</strong>technik. Prentice Hall, 2004<br />
2 IEEE Std. 829-1998 1998 : IEEE Standard for <strong>Software</strong> Test<br />
Documentation. IEEE Standards Board, IEEE Std. 829-1998. 1998<br />
3 IEEE Std. 982-1989 1989 : IEEE Standard Guide for the Use of IEEE<br />
Standard Dictionary of Measures to Produce Reliable <strong>Software</strong>. IEEE<br />
Standards Board, IEEE Std. 982-1989. Juli 1989<br />
Rainer Koschke (Uni <strong>Bremen</strong>) <strong>Software</strong>-<strong>Projekt</strong> Wintersemester 2008/09 54 / 55