Vorlesung Softwaretest und - debugging

Werbung
Technische Fakultät
Universität Bielefeld
Vorlesung
Softwaretest und - debugging
Version 2012
Dr. Carsten Gnörlich
Rechnerbetriebsgruppe
Kap. 1 - Einführung
(≅Kap. 2 aus Riedemann und Kap. 1 aus Zeller)
Eine F-16
(nördliche Halbkugel)
Bildquelle: Zeller
Dr. Carsten Gnörlich: Softwaretestmethoden
2
Eine F-16
(südliche Halbkugel)
Bildquelle: Zeller
Dr. Carsten Gnörlich: Softwaretestmethoden
3
Heute haben wir folgendes vor
• Übersicht über den Vorlesungsinhalt
- Was sind Testen, Debugging, Optimierung?
- Was ist überhaupt ein Fehler?
- Warum ist Software fehlerhaft?
- Mentale Aspekte des Testens
- Ausblick über die weiteren Vorlesungen
• Formalitäten klären:
• Übungstermin, Leistungspunkte
Dr. Carsten Gnörlich: Softwaretestmethoden
4
Quellenhinweis zum Testen
Die Inhalte zum Testen basieren auf:
Eike Riedemann:
Testmethoden für sequentielle
und nebenläufige Software-Systeme
Teubner, Stuttgart, 1997
Momentan nur herunterladbar:
http://ls10-www.cs.uni-dortmund.de/~riedemann/
Dr. Carsten Gnörlich: Softwaretestmethoden
5
Quellenhinweis zum Debugging
Die Inhalte zum Debugging basieren auf:
Andreas Zeller:
Why Programs Fail
A GuideTo Systematic Debugging
dpunkt.verlag, Heidelberg, 2005
Dr. Carsten Gnörlich: Softwaretestmethoden
6
Was ist Testen und Debuggen?
Dr. Carsten Gnörlich: Softwaretestmethoden
7
Was ist Testen?
„Testen ist der Prozeß,
ein Programm mit der Intention auszuführen, Fehlfunktionen zu finden.“
→ destruktive Sichtweise
Erfolgreicher Testfall:
→ Eingabe t erzeugt falsches Verhalten
Nicht erfolgreicher Testfall:
→ Programm zeigt korrektes Verhalten
Dr. Carsten Gnörlich: Softwaretestmethoden
8
Nebeneffekt des destruktiven Ansatzes
Testen ist nicht nur:
• Bestätigen der Qualität der Software
sondern auch:
• Erzeugen der Qualität von Software
Dr. Carsten Gnörlich: Softwaretestmethoden
9
Ablauf des (dynamischen) Testens
1. Bestimme gültigen oder ungültigen Eingabewert
2. Bestimme das erwartete Verhalten
3. Führe das Programm aus und betrachte das Verhalten
4. Vergleiche tatsächliches Verhalten mit erwartetem Verhalten
Wenn irgendwie möglich: Automatisiere den Vergleich!
Dr. Carsten Gnörlich: Softwaretestmethoden
10
Begriffsverwirrung?
Testen
Debuggen
Dr. Carsten Gnörlich: Softwaretestmethoden
11
Das kommt auch noch hinzu...
Testen
Optimieren
Debuggen
Dr. Carsten Gnörlich: Softwaretestmethoden
12
Unterschiede zwischen Testen und Debuggen
Aufdecken von Fehlfunktionen
während der Entwicklung
beim Produktionsystem
Dr. Carsten Gnörlich: Softwaretestmethoden
13
Unterschiede zwischen Testen und Debuggen
Aufdecken von Fehlfunktionen
während der Entwicklung
beim Produktionsystem
Softwaretestmethoden
→ unbekannte Fehlfkt finden
Dr. Carsten Gnörlich: Softwaretestmethoden
14
Unterschiede zwischen Testen und Debuggen
Aufdecken von Fehlfunktionen
während der Entwicklung
beim Produktionsystem
Softwaretestmethoden
→ unbekannte Fehlfkt finden
Debuggen
→ bekannte Fehlfkt beheben
= zufällige Fehlfkt b. Kunden
Dr. Carsten Gnörlich: Softwaretestmethoden
15
Unterschiede zwischen Testen und Debuggen
Aufdecken von Fehlfunktionen
während der Entwicklung
beim Produktionsystem
Softwaretestmethoden
→ unbekannte Fehlfkt finden
Debuggen
→ bekannte Fehlfkt beheben
Finden der Fehlfunktion teuer
Fehlerlokalisation billig
→ „Nebenprodukt“;
ergibt sich aus den Testfällen
Finden der Fehlfunktion gratis
Fehlerlokalisation teuer
→Hauptaufwand!
Reproduktion, Lokalisierung
Dr. Carsten Gnörlich: Softwaretestmethoden
16
Abgrenzung zum Debuggen im Entwickl.-Zyklus
Testmanager
erste
Version
Fehlerbericht
Testen
Kunde
Testen
korr.
Version
Debuggen
Entwicklungsumgebung
Dr. Carsten Gnörlich: Softwaretestmethoden
Produktivumgebung
17
Testfälle immer in einer Datenbank aufheben!
Testmanager
erste
Version
Fehlerbericht
Testen
Kunde
Testen
neue
Version
Debuggen
Datenbank für Regressionstests
Dr. Carsten Gnörlich: Softwaretestmethoden
18
Warum Regressionstests?
Fehlfunktionen kommen manchmal wieder
• via Versionskontrolle: cvs, svn, mercurial
- mergen mit alten defekten Versionen
• via (de-)maskierung:
- Fehlfunktion A wird durch unkorrekte Programmänderung B „behoben“
→neuer Defekt B maskiert nun Fehlfunktion A
- Nachdem B gefixt ist tritt Fehlfunktion A wieder auf
→Fehlfunktion A schnell erkennen
→verhindere daß erneut der falsche Fix B angewandt wird
Dr. Carsten Gnörlich: Softwaretestmethoden
19
Testen und Optimieren
Programm V0.10
einfach, stabil, langsam
Programm V0.90
Programm V1.00
Anzahl
Testfälle
Optimierung
Programm V2.00
komplex, schnell, stabil!
Dr. Carsten Gnörlich: Softwaretestmethoden
20
Testen: Einordnung in die Softwaretechnologie
• Konstruktive Methoden (Erstellung)
- Anforderungsdefinition, Entwurf, Programmierung
• Analytische Methoden (Messen, Bewerten)
- Qualitätssicherung, Testen
Wichtig:
- nicht erst konstruieren, dann testen
- sondern begleitend zu allen Ebenen des Softwarezyklus
Dr. Carsten Gnörlich: Softwaretestmethoden
21
Kosten für Fehlerbehebung
Kodierfehler
Entwurfsfehler
Anforderungsfehler
50,0
37,5
25,0
12,5
0
Anforderung
Entwurf
Kodierung
Dr. Carsten Gnörlich: Softwaretestmethoden
Strukturtest
Funktionstest
22
an
W . In
alk sp
Si -th ekti
m ro on
st ula ugh
at tio
isc n
dy h
na e A
Ve m. na
rifi An lys
Re kat aly e
gr ion se
Te es
s s.
m
Testen im Software-Lebenszyklus
1. Anforderungsdefinition
• Korrektheit, Vollständigkeit, Konsistenz
• Testfälle vorbereiten
2. Entwurf
• Konsistenz, Vollständigkeit Systemstruktur
• fehlende Fälle, Schnittstellen, fehlerh. Logik
•Testfälle für interne Funktionen angeben
3. Realisierung / Kodierung
• Kode überprüfen und ausführen
4. Wartung = Beginn klass. Debugging
• Fehler beseitigen ohne neue zu erzeugen
Dr. Carsten Gnörlich: Softwaretestmethoden
23
Testen: Abgrenzung zu anderen Verfahren
Verifikation
• formaler Korrektheitsbeweis
+ theoretisch die ideale Methode
- automatisches Beweisen nicht möglich
- manuelles Beweisen stupide und fehleranfällig
Nachteile gegenüber Testen:
• Testen überprüft mehr als formale Korrektheit (Robustheit, Spezifikation)
• Testen überprüft auch die Programmumgebung
Dr. Carsten Gnörlich: Softwaretestmethoden
24
Testen: Abgrenzung zu anderen Verfahren
Simulation
• Modell der Software ausführen
+ früher Einsatz möglich
+ Systeme ohne reale Umgebung testbar
(eingebettete Systeme, Kernenergie)
- Übereinstimmung Simulation / Realität?
- Korrektheit des Simulators?
Dr. Carsten Gnörlich: Softwaretestmethoden
25
Wie generell sind die Methoden der Vorlesung?
• Paßt auf bash, awk, C/C++, Java, Lisp, Excel,...
• anwendbar auf so gut wie jedes Menschenwerk
(alles sollte man beizeiten testen!)
• unabhängig von
- bestimmten Softwarewerkzeugen
- anderen Vorlesungen
• Techniken des Testens sind zeitlos
- im Gegensatz zu Programmiertechniken, die „Modeerscheinungen“ sind
Dr. Carsten Gnörlich: Softwaretestmethoden
26
It‘s not a bug, it‘s a feature...
Dr. Carsten Gnörlich: Softwaretestmethoden
27
Der erste Bug (9. September 1947)
Bildquelle: Zeller
Dr. Carsten Gnörlich: Softwaretestmethoden
28
Software-Bugs entmystifiziert
Häufige Fehlwahrnehmungen:
• Fehler dringen von außen in das Programm ein
• Fehler entstehen zufällig / aus heiterem Himmel
➡ kompletter Unfug!
Stattdessen:
• Fehler sind von Anfang an im Programm
• oder durch spätere Koderevisionen erzeugt worden
➡ menschliche Fehlleistungen des Programmierers
Dr. Carsten Gnörlich: Softwaretestmethoden
29
Begriff des „Bugs“ ist zu breit gewählt
Defekt: Nicht korrekter Programmkode (ein Bug im Programmkode)
Infektion: Nicht korrekter Zustand
(ein Bug im Zustand)
Fehlfunkion: Nicht korrektes Verhalten (ein Bug im Verhalten/Ausgabe)
Abgrenzung: flaw (Entwurfsfehler) - der richtig böse Fall
Psychologie:
• „bug“ / „issue“ klingen dem Kunden gegenüber verniedlichend
• „error“ / „fault“ für den verantwortlichen Programmierer belastend
Dr. Carsten Gnörlich: Softwaretestmethoden
30
Vom Defekt zur Fehlfunktion
1. Der Programmierer erzeugt einen
Defekt (Fehler im Programmkode).
Variables
✘
2. Bei seiner Ausführung erzeugt der
Defekt eine Infektion - einen
Fehler im Programmzustand.
3. Die Infektion breitet sich aus.
4. Die Infektion erzeugt eine
Fehlfunktion.
t
Bildquelle: Zeller
31
Vom Defekt zur Fehlfunktion
1. Der Programmierer erzeugt einen
Defekt (Fehler im Programmkode).
Variables
✘
2. Bei seiner Ausführung erzeugt der
Defekt eine Infektion - einen
Fehler im Programmzustand.
✘
3. Die Infektion breitet sich aus.
4. Die Infektion erzeugt eine
Fehlfunktion.
t
Bildquelle: Zeller
31
Vom Defekt zur Fehlfunktion
1. Der Programmierer erzeugt einen
Defekt (Fehler im Programmkode).
Variables
✘
2. Bei seiner Ausführung erzeugt der
Defekt eine Infektion - einen
Fehler im Programmzustand.
3. Die Infektion breitet sich aus.
✘
✘
4. Die Infektion erzeugt eine
Fehlfunktion.
✘
t
Bildquelle: Zeller
31
Vom Defekt zur Fehlfunktion
1. Der Programmierer erzeugt einen
Defekt (Fehler im Programmkode).
Variables
✘
2. Bei seiner Ausführung erzeugt der
Defekt eine Infektion - einen
Fehler im Programmzustand.
✘
3. Die Infektion breitet sich aus.
✘
4. Die Infektion erzeugt eine
Fehlfunktion.
✘
Bildquelle: Zeller
31
✘
t
Vom Defekt zur Fehlfunktion
1. Der Programmierer erzeugt einen
Defekt (Fehler im Programmkode).
Variables
✘
2. Bei seiner Ausführung erzeugt der
Defekt eine Infektion - einen
Fehler im Programmzustand.
✘
3. Die Infektion breitet sich aus.
✘
4. Die Infektion erzeugt eine
Fehlfunktion.
✘
Bildquelle: Zeller
31
✘
t
Was ist überhaupt eine Fehlfunktion?
• Nichterfüllung einer festgelegten Forderung:
➞ Fehlfunktion
unser Metier !
• Nichterfüllung einer
- beabsichtigten Forderung
- angemessenen Erwartung
➞ Mangel
• Mithin gibt es also Grauzonen:
- Benutzerfreundlichkeit
- Programm zu langsam
- Schachprogramm spielt zu schlecht
Dr. Carsten Gnörlich: Softwaretestmethoden
32
Wodurch entsteht falsche Programmierung?
Kommunikationsprobleme:
• Unvollständiger Entwurf
• Ungenauer Entwurf
Raum für Murphys law
• falsch interpretierter Entwurf
➡ Beschreibe es genau oder es geht schief!
• Entwurf verstanden, aber falsch programmiert
Dr. Carsten Gnörlich: Softwaretestmethoden
typische „Bugs“
33
Fehlerklassen - wie sie der Entwickler sieht
1. Funktionsfehler
- Funktionalität falsch spezifiziert (→ neuer Entwurf!)
2. Schnittstellenfehler
- Programmkomponenten interagieren falsch (z.B. falsche Parameterlisten)
3. Algorithmusfehler
- Implementierung ist falsch oder uneffizient
4. Zuweisungsfehler
- Berechnungsfehler bei Startwerten oder Zuweisungen
5. Abfragefehler
- fehlerhafte oder fehlende Abfragen zerstören die Programmlogik
6. Synchronisations- / Zeitfehler
- Zugriff auf gemeinsam Ressourcen
7. Konfigurationsfehler
- Verwendung von Bibliotheken der falschen Version
- Probleme im Änderungsmanagement / Versionskontrolle
8. Dokumentationsfehler
- korrekt realisiert, aber falsch
dokumentiert
Dr. Carsten
Gnörlich: Softwaretestmethoden
34
Einstufung von Fehlern nach ihrer Schwere
- wie es der Projektmanager sieht
0. Katastrophal
- Weltuntergang
1. Kritisch
- Produktionsausfall; Aufgabe nicht mehr erfüllbar
2. Hoch
- Produktion / Leistung herabgesetzt
3. Mittel
- Verhinderung der vollen Ausnutzung der Programmöglichkeiten;
Workaround existieren
4.Niedrig
- kosmetische Probleme; Leistung bleibt erhalten
5. Unproblematisch
- nicht geforderte Softwareverbesserung
Dr. Carsten Gnörlich: Softwaretestmethoden
35
Küchenschaben-Theorie
➡ Eine Küchenschabe kommt selten allein
• Fehler treten gehäuft auf
- manche Module sind fehlerfrei
- andere sehr fehlerbehaftet
‣ in der Umgebung eines Fehlers nach weiteren suchen!
Dr. Carsten Gnörlich: Softwaretestmethoden
36
Warum ist Software so kaputt?
Dr. Carsten Gnörlich: Softwaretestmethoden
37
Ursachen fehlerhafter Software
Menschliche Fehlleistungen beim
• Austauschen
• Verarbeiten
• Speichern
von Informationen, die zur Software-Entwicklung benötigt werden.
Dr. Carsten Gnörlich: Softwaretestmethoden
38
3 Hauptformen der Kommunikation
1. Intrapersonale Kommunikation
• Denken und Wahrnehmen
(Informationsverarbeitung innerhalb des Menschen)
- Identitätsirrtum:
Wert an Variable brutto statt netto zuweisen
Dr. Carsten Gnörlich: Softwaretestmethoden
39
3 Hauptformen der Kommunikation
2. Interpersonale Kommunikation
• Informationsaustausch zwischen Gesprächspartnern
Sprecher
Kodier.
Übermittlung
Dekodier.
Hörer
- Erklärungsirrtum: A gesagt, aber B gemeint
- Übermittlungsirrtum:
Mitarbeiter gibt entgegengenommen Anruf falsch wieder
- Entschlüsselungsirrtum:
- Information falsch gelesen / gehört
- Unterschiedliche Sprache / Fachsprache
- Inhaltsirrtum: Mißverständnis über qualitative/quantitative Eigenschaften
Dr. Carsten Gnörlich: Softwaretestmethoden
40
3 Hauptformen der Kommunikation
3. Mediengebundene Kommunikation
• kleine Gruppe von Kommunikatoren (z.B. Journalisten)
• große Gruppe von Rezipienten (z.B. Zeitungsleser)
➝ gleiche Probleme wie bei interpersonaler Kommunikation
Typische Ausprägungen bei der Softwareentwicklung:
• große Projekte mit Projektleitern und Programmierern
• Online-Medien (Wikis, Foren, Online-Dokumentationen)
Dr. Carsten Gnörlich: Softwaretestmethoden
41
Kognitive Einschränkungen
Zu wenig RAM im Gehirn!
• zwar einige TB Langzeitgedächnis
• aber nur 5 - 9 Token / Worte Kurzzeitgedächtnis!
→ reicht maximal für 2 Schleifen inklusive Kontext!
→ erhebliches Handicap beim Nachvollziehen von Programmkode!
Genau wie ein Maurer das Haus Stein für Stein baut
• schreiben wir Programme Zeile für Zeile
• wir betrachten/manipulieren Programme durch ein
extrem kleines kognitives Fenster!
Dr. Carsten Gnörlich: Softwaretestmethoden
42
Nicht-kommunikative Fehlerquellen
• Komplexität der Systeme
- „Denken wie ein Computer“
(vorherige Folie: Alle beteiligten Variablen etc. im Kopf behalten)
- Verstehen von Nebenläufigkeiten
• mangelndes Problemverständnis
- algorithmische Lösung unzutreffend / unbekannt
• fehlende Information der Beteiligten
• Streß, Übermüdung, fehlende Motivation
Dr. Carsten Gnörlich: Softwaretestmethoden
43
Ein paar Statistiken
• Anzahl Defekte im Entwicklungszyklus:
30 - 100 pro 1000 Zeilen Programmkode
• Anzahl Defekte im fertigen Produkt:
1.5 bis 5 pro 1000 Zeilen Programmkode (95% der Defekte werden gefunden)
• Verteilung:
2/3 im Entwurf; 1/3 bei der Programmierung
15% aller Defekte sind schwerwiegend
Dr. Carsten Gnörlich: Softwaretestmethoden
44
Mentale Aspekte der
Softwareentwicklung
Dr. Carsten Gnörlich: Softwaretestmethoden
45
Psychologisches Problem
• Spezifikation, Entwurf, Programmierung: konstruktiver Prozeß
• Testen: destruktiver Prozeß (alles kaputtmachen)
Typischer Lernprozeß:
1. Optimismus: Mein Programm ist perfekt, Testen nicht nötig!
2. Bockigkeit: Oh, mein Programm ist falsch. Ich teste aber trotzdem nicht!
3. Resignation: Ich teste nur noch und gebe das Programm nie mehr frei.
4. Goldener Mittelweg: Ich weiß wann man mit dem Testen aufhören kann.
Dr. Carsten Gnörlich: Softwaretestmethoden
46
Folgerungen aus der Psychologie des Testens
• „Selbstloses“ (egoless) Programmieren
➡ nicht „mein“ Programm testen, sondern
➡ Produkt testen und verbessern
➡ jeder gefundene Fehler ist einer weniger
• Programm nicht durch die Entwickler testen lassen
- persönliche Distanz
- Mißverständnisse beim Interpretieren der Spezifikation
- Zielkonflikte wie z.B. Einhalten der Zeitvorgaben vermeiden
Dr. Carsten Gnörlich: Softwaretestmethoden
47
Täuschungen bei der Inspektion von Programmkode
• Trick- oder Ablauftäuschung
- Programmausdruck tut nicht das was man erwartet
- *c++ = *++a + b[*a]
• Erwartungstäuschung
- Kommentar sagt nicht das aus was das Programm tut
- /* Den Wert n-mal aufaddieren */
for (i=1; i<n; i++) ...
• Überdeckungstäuschung
- Nicht alle Software-Testmethodon finden subtile Fehler.
Dr. Carsten Gnörlich: Softwaretestmethoden
48
Täuschungen bei der Inspektion von Programmkode
• Hemmungstäuschung
- in einem vorherigen Kontext gelernte Zusammenhänge gelten nicht mehr:
- Morgenstern, Abendstern, Zwergelstern
• Wiederholungstäuschung
- scheinbar gleiche Vorgänge haben unterschiedliche Ergebnisse
- Kopierte und leicht veränderte Programmteile!
Dr. Carsten Gnörlich: Softwaretestmethoden
49
Was tun?
Dr. Carsten Gnörlich: Softwaretestmethoden
50
Vermeidung oder Behebung von Fehlern?
Erinnerung - Fehlerursachen sind:
• Kommunikative Fehler
• sonstige (Komplexität, mangendes Verständnis/Info/Motivation, Streß, etc.)
➡ Ausschluß dieser Ursachen praktisch unmöglich
➡ Defekte wird es immer geben
➡ Defekte durch analytische Prozesse finden und beheben
Dr. Carsten Gnörlich: Softwaretestmethoden
51
Ideale Möglichkeiten um Defekte zu finden
im Papierstadium:
• Review (gedankliches Durchspielen)
- auch wieder Kommunikationsprobleme
• Simulation
- teuer, keine umfassenden
Systematiken verfügbar
Dr. Carsten Gnörlich: Softwaretestmethoden
52
Ideale Möglichkeiten um Defekte zu finden
im Papierstadium:
im Programmstadium:
• Review (gedankliches Durchspielen) • Verifikation
- auch wieder Kommunikationsprobleme
- Korrektheit beweisen
• Simulation
- teuer, keine umfassenden
Systematiken verfügbar
• idealer Test
- für n Defekte reichen n Testfälle
• erschöpfender Test
- alle Eingabemöglichkeiten
durchprobieren
Dr. Carsten Gnörlich: Softwaretestmethoden
53
Ideale Möglichkeiten um Defekte zu finden
im Papierstadium:
im Programmstadium:
• Review (gedankliches Durchspielen) • Verifikation
- auch wieder Kommunikationsprobleme
- Korrektheit beweisen
• Simulation
- teuer, keine umfassenden
Systematiken verfügbar
• idealer Test
- für n Defekte reichen n Testfälle
• erschöpfender Test
- alle Eingabemöglichkeiten
durchprobieren
scheitert alles an Berechenbarkeit!
Dr. Carsten Gnörlich: Softwaretestmethoden
54
Ideale Möglichkeiten um Fehler zu finden
im Papierstadium:
im Programmstadium:
• Review (gedankliches Durchspielen) • Verifikation
- auch wieder Kommunikationsprobleme
- Korrektheit beweisen
• Simulation
- teuer, keine umfassenden
Systematiken verfügbar
• idealer Test
- für n Defekte reichen n Testfälle
• erschöpfender Test
- alle Eingabemöglichkeiten
durchprobieren
→ stichprobenhaftes Testen!
Dr. Carsten Gnörlich: Softwaretestmethoden
55
Stichprobenhaftes Testen
• statisch überprüfen oder
• dynamisch testen
Unser Thema!
➡ Anwesenheit bestimmter Fehler-/Defekttypen antizipieren und ausschließen
➡ hohe Kunst: an den „richtigen“ Stellen zu suchen / testen
Dr. Carsten Gnörlich: Softwaretestmethoden
56
Ausblick
• Statisches Testen (Quellkode analysieren)
➡ Defekte direkt aufdecken; Lernen „sicher“ zu programmieren
• Dynamisches Testen (Programm mit Testfällen ausführen)
➡ Lernen Testfälle zu generieren (= wonach man suchen muß)
• Techniken zum Debugging
➡ Lernen Defekte zu finden
• Methoden um Programme besser testbar / debugbar zu machen
➡ spezielle Entwurfs- und Programmiertechniken
Dr. Carsten Gnörlich: Softwaretestmethoden
57
Organisation
Dr. Carsten Gnörlich: Softwaretestmethoden
58
Umfang
• 2 V + 2Ü = 3 LP
• unbenoteter Schein, Kriterium ist Bearbeitung der Übungen
Dr. Carsten Gnörlich: Softwaretestmethoden
59
Wer hat Interesse an den Übungen?
• Inhalt der Übungen:
- Spielen mit einer Software 2D/3D-Engine
- 2 Aufgaben pro Woche, 1-2h Bearbeitungszeit
➡ Testen / Debuggen
➡ Interesse an C und Computergrafik auf niedrigem Abstraktionsniveau
• Wer hat Interesse an den Übungen?
• Termin: Freitag 12:30 (wegen Mittagessen ;-) im GZI, V2-222
Dr. Carsten Gnörlich: Softwaretestmethoden
60
Ende der heutigen Vorlesung
Danke fürs Zuhören!
Bis nächste Woche :-)
Dr. Carsten Gnörlich: Softwaretestmethoden
61
Herunterladen