12.04.2013 Aufrufe

Software-Projekt ¨Uberblick I - Informatik - Universität Bremen

Software-Projekt ¨Uberblick I - Informatik - Universität Bremen

Software-Projekt ¨Uberblick I - Informatik - Universität Bremen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!