Verifikation und Testen
This commit is contained in:
		
							parent
							
								
									4505f885a6
								
							
						
					
					
						commit
						945cf237ba
					
				
							
								
								
									
										
											BIN
										
									
								
								Assets/Softwaretechnik1_Codegenerierung.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								Assets/Softwaretechnik1_Codegenerierung.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 109 KiB | 
| @ -1674,13 +1674,412 @@ Dokumentation des Feinentwurfs | |||||||
|   - Klassenschnittstellen |   - Klassenschnittstellen | ||||||
| 
 | 
 | ||||||
| # Implementierung | # Implementierung | ||||||
|  | Aufgaben der Implementierung | ||||||
|  | - Aus Spezifikationen Programm(code) erzeugen | ||||||
|  | - Aufbauend auf Ergebnissen des Feinentwurfs | ||||||
|  |   - Algorithmen konzipieren | ||||||
|  |   - Datenstrukturen realisieren | ||||||
|  |   - Umsetzen in konkreter Programmiersprache | ||||||
|  |   - Dokumentation | ||||||
|  |   - Untersuchung des Zeit- und Speicherbedarfs | ||||||
|  |   - Test und Verifikation | ||||||
|  | - „Programmieren im Kleinen“ | ||||||
|  | 
 | ||||||
| ## Konventionen und Werkzeuge | ## Konventionen und Werkzeuge | ||||||
|  | Konventionen beim Programmieren | ||||||
|  | - (Coding Rules, -conventions, -standards) | ||||||
|  | - Regeln für verständliche Programme | ||||||
|  |   - „wie“ sollte Quellcode formal und strukturell gestaltet sein | ||||||
|  |   - Bezeichner, Einrückungen, Dokumentation, Dateien, ... | ||||||
|  |   - Strukturierung: Block, Methode, Klasse, Package | ||||||
|  | - Firmenspezifische Regeln | ||||||
|  |   - Festlegung Entwurfsprinzipien (z.B. keine Mehrfachvererbung) | ||||||
|  | 
 | ||||||
|  | Namenskonventionen | ||||||
|  | - Klasse | ||||||
|  |   - (mit) Substantiv, „UpperCamelCase“ | ||||||
|  |   - Beispiele: Account, StandardTemplate | ||||||
|  | - Methode | ||||||
|  |   - (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“ | ||||||
|  |   - Beispiele: checkAvailability(), getDate() | ||||||
|  | - Attribut, Variable | ||||||
|  |   - (mit) Substantiv, „lowerCamelCase“ | ||||||
|  |   - Beispiele: anzahlAutos, fensterBreite | ||||||
|  | - Konstante | ||||||
|  |   - Nur Großbuchstaben, Worte mit "_" zusammengesetzt | ||||||
|  |   - Standardpräfixe: "MIN_", "MAX_", "DEFAULT_", ... | ||||||
|  |   - Beispiele: NORTH, BLUE, MIN_WIDTH, DEFAULT_SIZE | ||||||
|  | 
 | ||||||
|  | Formatierungs-Richtlinien | ||||||
|  | - Entsprechend Schachtelungstiefe einrücken, aber nicht zu weit | ||||||
|  | - Einheitliche Verwendung von Leerzeilen und Leerzeichen | ||||||
|  | - Einheitliche Dateistruktur verwenden | ||||||
|  |   - Eine .java-Datei pro Klasse | ||||||
|  |   - Ein Verzeichnis für jedes package | ||||||
|  | - Werkzeuge: source beautifier, oft in IDEs enthalten | ||||||
|  | - Editor: syntax highlighting | ||||||
|  | - Navigationswerkzeuge | ||||||
|  |   - Auf- und Zuklappen, Inhaltsverzeichnis, tagging | ||||||
|  |   - doxygen, Eclipse etc. | ||||||
|  | 
 | ||||||
|  | Änderungsfreundlicher Code | ||||||
|  | - Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung: | ||||||
|  |   - `typedef char name [NAME_LENGTH]` | ||||||
|  |   - `typedef char firstName [FIRST_NAME_LENGTH]` | ||||||
|  | - Symbolische Konstanten statt literaler Werte verwenden, wenn spätere Änderung denkbar | ||||||
|  | - Algorithmen, Formeln, Standardkonzepte in Methoden/Prozeduren kapseln | ||||||
|  | - Übersichtlichkeit: Zusammenhängende Einheit nicht größer als Editorfenster (40-60 Zeilen, 70 Zeichen breit) | ||||||
|  | - Strukturierte Programmierung (Regeln je nach Schärfe) | ||||||
|  |   - Kein goto verwenden (in anderen Sprachen als Java) | ||||||
|  |   - switch nur mit break-Anweisung nach jedem Fall | ||||||
|  |   - break nur in switch-Anweisungen verwenden | ||||||
|  |   - continue nicht verwenden (Effekt ähnlich goto) | ||||||
|  |   - return nur am Ende zur Rückgabe des Werts | ||||||
|  | - Übersichtliche Ausdrücke | ||||||
|  |   - Seiteneffektfreie Ausdrücke, schlecht: y += 12*x++; | ||||||
|  | - Variablen möglichst lokal und immer private deklarieren | ||||||
|  | - Wiederverwendung "äußerer" Namen vermeiden | ||||||
|  | 
 | ||||||
|  | Werkzeuge | ||||||
|  | - Integrated Development Environments (Eclipse, KDevelop) | ||||||
|  | - Compiler, Linker; Build / Make; Versionskontrolle (git, svn) | ||||||
|  | 
 | ||||||
| ## Code-Qualität | ## Code-Qualität | ||||||
|  | Portierbarer Code | ||||||
|  | - Code, den man ohne Änderungen in ein anderes System (Compiler, Betriebssystem, Rechner) übertragen kann | ||||||
|  |   - Kein implementierungsabhängiges Verhalten! | ||||||
|  | - ANSI C++ Standard ist nicht vollständig definiert | ||||||
|  | - Ist das Verhalten nicht festgelegt, unterscheidet der ANSI C++ Standard zwischen: | ||||||
|  |   - Implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten | ||||||
|  | - Code, welcher auf implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten basiert, ist | ||||||
|  |   - Nicht portabel und somit häufig verboten | ||||||
|  |   - Wird unter Umständen ungewollt wegoptimiert | ||||||
|  | 
 | ||||||
|  | Implementierungsabhängiges Verhalten | ||||||
|  | - Compiler übersetzen bestimmte Sprachkonstrukte unterschiedlich, Ergebnis unterscheidet sich  | ||||||
|  | - Voraussetzung | ||||||
|  |   - Verhalten ist konsistent festgelegt und dokumentiert | ||||||
|  |   - Kompilierung von standardkonformem Code ist erfolgreich | ||||||
|  | - Beispiel: Speichergröße von Integer-Typen | ||||||
|  |   - char kann signed oder unsigned sein: Nicht damit rechnen! | ||||||
|  |   - 32 Bit System ist wie erwartet | ||||||
|  |   - 16 Bit System: Multiplikation wird mit int durchgeführt -> Überlauf -> undefiniertes Verhalten | ||||||
|  | 
 | ||||||
|  | - Unspezifiziertes Verhalten | ||||||
|  |   - Wie implementierungsabhängiges Verhalten | ||||||
|  |   - Compiler muss sich für ein bestimmtes Verhalten entscheiden | ||||||
|  |   - Muss nicht dokumentiert sein | ||||||
|  |   - Beispiel: Evaluierungsreihenfolge von Funktionsargumenten `tuWas(zuerstDas(),oderDochLieberDas());` | ||||||
|  | - Undefiniertes Verhalten | ||||||
|  |   - Keinerlei Vorgaben | ||||||
|  |   - Compiler muss mögliches Problem nicht melden | ||||||
|  |   - Keine Voraussage welches Resultat eintritt | ||||||
|  |   - Bereits die Kompilierung kann fehlschlagen | ||||||
|  |   - Oder das laufende Programm kann falsche Resultate liefern. | ||||||
|  |   - Effekt: „Bei mir läuft es aber!?“ | ||||||
|  |   - „undefiniertes Verhalten nutzen grenzt an Sabotage!“ | ||||||
|  | 
 | ||||||
|  | Sicherer Code mit const | ||||||
|  | - Const Variable – Konstante | ||||||
|  |   - Stellt sicher, dass sich der Wert nicht verändert | ||||||
|  | - Const Parameter | ||||||
|  |   - Übergabeparameter ändert sich nicht innerhalb der Operation | ||||||
|  |   - Z.B. bei Übergabe komplexer Daten als Referenz bzw. Zeiger `long calcMeanValue(const image &i){...}` | ||||||
|  | - Const Operationen | ||||||
|  |   - Sicherstellen, dass Operation das Exemplar nicht ändert | ||||||
|  |   - Aufruf der const Operation bei const Variablen möglich | ||||||
|  | - Verwende const wenn möglich | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ## Dokumentation | ## Dokumentation | ||||||
|  | - Selbstdokumentierende Programme? | ||||||
|  |   - 2001 Int. Obfuscated C Code Contest Winner, Short Program | ||||||
|  | 
 | ||||||
|  | Integrierte Dokumentation | ||||||
|  | - Verständlichkeit, Wartbarkeit – auch für Programmierer! | ||||||
|  | - Code selbst sollte möglichst verständlich sein | ||||||
|  | - Dokumentation in Programm schreiben und aktualisieren | ||||||
|  | - Beschreibung der Bedeutung des Codes! | ||||||
|  | - Als Konventionen festschreiben | ||||||
|  | - Programmvorspann | ||||||
|  | - Kurzbeschreibung Datei / Klasse / Funktion ... | ||||||
|  | - Verwaltungsinformationen | ||||||
|  |   - Autor, Datum, Version, Projekt, ToDo, FixMe, ... | ||||||
|  |   - Zustand: geplant, in Bearbeitung, vorgelegt, akzeptiert | ||||||
|  | - Laufende Kommentare im Quellcode | ||||||
|  | 
 | ||||||
|  | Programmierer-Dokumentation | ||||||
|  | - Als eigenes Dokument elektronisch oder gedruckt | ||||||
|  | - Einstieg in Programmverständnis (z.B. Bachelor-Arbeit) | ||||||
|  | - Konsistenz mit Quelltext? Verweise? | ||||||
|  | - Technische Unterstützung: JavaDoc (Java), doxygen (C++) | ||||||
|  | - Ergänztes Java-Programm  Dokumentation HTML, PDF, | ||||||
|  |   ```js | ||||||
|  |   /** @author name Mustermann */ | ||||||
|  |   /** @param name description */ | ||||||
|  |   /** @return description */ | ||||||
|  |   ``` | ||||||
|  | 
 | ||||||
|  | Benutzerdokumentation | ||||||
|  | - Benutzer-Handbuch, Online-Dokumentation | ||||||
|  | - Unterstützung ohne Support? | ||||||
|  | - Vollständige und fehlerfreie Beschreibung der Benutzung | ||||||
|  |   - Beispiele, screen shots | ||||||
|  | - Arten: Tutorial, Beschreibung, Referenz | ||||||
|  | 
 | ||||||
|  | Benutzer-Unterstützungssysteme | ||||||
|  | - Integrierte Hilfe (Suchfunktion, balloon help / tool tips) | ||||||
|  | - Assistenz-System (Zustandsabhängige Anleitung) | ||||||
|  | - Tutor-System zum Erlernen | ||||||
|  | - Bug-Listen, Mailinglisten, Diskussionsforen | ||||||
|  | 
 | ||||||
| ## Codegenerierung | ## Codegenerierung | ||||||
|  | Bezug zwischen Modell und Programmcode | ||||||
|  | - Vorwärtsmodellierung: Modell - Code | ||||||
|  | - Rückwärtsmodellierung: Code - Modell | ||||||
|  |   - Außerdem: Modelltransformation, Refaktorisierung | ||||||
|  | - Idealfall: Automatische Übersetzung durch SW-Werkzeug (in beiden Richtungen) | ||||||
|  |   - „Modellbasierte Entwicklung“ | ||||||
|  | - Statisch: Beispiel Klassendiagramm - Quelltext der Klassen mit allen Vererbungsbeziehungen, Attributen und Methodensignaturen (Klassen-Stümpfe mit leeren Methodenrümpfen zum Ausfüllen) | ||||||
|  | - Dynamisch: Beispiel Zustandsdiagramm - Quelltext der Zustandssteuerung einer Klasse | ||||||
|  | 
 | ||||||
|  |  | ||||||
|  | 
 | ||||||
|  | Weitere statische Transformationen | ||||||
|  | - Abbildung von Assoziationen auf Sammlungen | ||||||
|  | - Abbildung von Verträgen auf Ausnahmen | ||||||
|  | - Abbildung von Objektmodellen auf Datenbankschemata | ||||||
|  | - Abbildung von Entwurfsmustern auf Codefragmente | ||||||
|  | 
 | ||||||
|  | Optimierung des Entwurfsmodells | ||||||
|  | - Grund: nichtfunktionale Eigenschaften | ||||||
|  | - Zugriffspfade | ||||||
|  | - Klassen in Attribute umwandeln | ||||||
|  | - Verzögerung von Berechnungen | ||||||
|  | - Zwischenspeicherung aufwändiger Ergebnisse | ||||||
|  | 
 | ||||||
|  | Codegenerierung aus StateCharts | ||||||
|  | - Einfachste Möglichkeit: Switch (Case) Statement | ||||||
|  | - Zustände werden durch Datenwerte repräsentiert | ||||||
|  |   - Aktueller Zustand: einzelne skalare Variable | ||||||
|  | - Jedes Ereignis wird durch Methode implementiert | ||||||
|  | - Ausgehend von aktivem Zustand wird bei Eintreffen eines Ereignisses der entsprechende Programmcode ausgeführt | ||||||
|  | - Abhängig von Zustandsvariable wird Aktion ausgeführt und der Folgezustand eingestellt | ||||||
|  | - Wird in einer Klasse realisiert | ||||||
|  | - Sinnvoll für einfache, “flache” Modelle | ||||||
|  |   - Sonst Logik für Hierarchie nötig | ||||||
|  | 
 | ||||||
|  | Anpassung der Generierung | ||||||
|  | - Verschiedene Zielsprachen (Java, C++, ...) | ||||||
|  | - Model2Text-Transformationen | ||||||
|  |   - Verschiedene Generatoren, z.B. Eclipse Modelling Project | ||||||
|  | - Generierung aus dem Modellierungswerkzeug | ||||||
|  |   - Parametrisierung der Codegenerierung | ||||||
|  |   - Generierungsvorlagen | ||||||
|  | 
 | ||||||
|  | Weitere Werkzeuge | ||||||
|  | - Compiler-Compiler: Syntaxbeschreibung wird in lexikalische Analyse (tokenizer) und Syntaxanalyse-Programm transformiert (lex & yacc / flex & bison / antlr) | ||||||
|  | - Codegenerierung für grafische Benutzungsoberflächen aus grafischer Beschreibung: GUI toolkits | ||||||
|  | - XML-Parser | ||||||
|  |   - XSLT, DOM, SAX, ... | ||||||
|  | 
 | ||||||
| ## Implementierung aktiver Objekte | ## Implementierung aktiver Objekte | ||||||
|  | Realisierung aktiver Entwurfsobjekte | ||||||
|  | - Reagieren nicht nur (Methodenaufruf), sondern implementieren eigenes Verhalten | ||||||
|  | - Aktive Klassen, z.B. Steuerobjekte | ||||||
|  | 
 | ||||||
|  | Arten von Programmabarbeitung | ||||||
|  | - Sequentiell: es gibt immer genau einen nächsten Schritt, alle Schritte werden nacheinander ausgeführt | ||||||
|  | - Parallel: Spezielle Hardware bzw. Mehrkernprozessor, mehrere Befehlsfolgen werden echt parallel bearbeitet | ||||||
|  | - Quasi-parallel: Ein Prozessor arbeitet mehrere Befehlsfolgen in freier Einteilung ab | ||||||
|  | - Nebenläufig: Oberbegriff für Parallel und Quasi-parallel | ||||||
|  |   - concurrent | ||||||
|  | 
 | ||||||
|  | Vorteile | ||||||
|  | - Höhere Geschwindigkeit | ||||||
|  | - Kein aktives Warten auf Ereignisse | ||||||
|  | - Getrennte Implementierung unabhängiger Aspekte | ||||||
|  | 
 | ||||||
|  | Ergebnisse eines Programms | ||||||
|  | - Ein Programm, dessen Ablauf eindeutig vorherbestimmt ist, nennt man deterministisch (deterministic) | ||||||
|  | - Ein Programm, das bei gleichen Eingaben gleiche Ausgaben produziert, heißt determiniert (determined) | ||||||
|  | - Programme in üblichen Programmiersprachen sind sequentiell, deterministisch und determiniert | ||||||
|  | - Grund: Herkömmliche Programmiersprachen sind durch das von-Neumann-Modell geprägt | ||||||
|  | - Determinismus nicht notwendig für Determiniertheit! | ||||||
|  |   - Determiniertheit nebenläufiger Programme: Synchronisation | ||||||
|  |   - Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten | ||||||
|  | 
 | ||||||
|  | Java Threads | ||||||
|  | - Verwaltung durch die Java Virtuelle Maschine (JVM) | ||||||
|  | - Realisierung der Threads ist je nach Implementierung der JVM unterschiedlich | ||||||
|  |   - Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet) | ||||||
|  |   - Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern) | ||||||
|  |   - Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich | ||||||
|  | - Threads arbeiten immer im Adressraum der JVM (eigener Prozess) und sind außerhalb dieser nicht sichtbar | ||||||
|  | 
 | ||||||
|  | Erzeugung eines Threads | ||||||
|  | - Unterklasse der Basisklasse „Thread“ bilden `class MyThread extends Thread` | ||||||
|  | - Problem: keine Mehrfachvererbung, daher Alternative nötig (Beispiel: Applet): | ||||||
|  |   - Schnittstelle „Runnable“ implementieren | ||||||
|  |   - `class MyThread implements Runnable` | ||||||
|  | - Die vordefinierte Schnittstelle Runnable ist definiert als | ||||||
|  |   ```java | ||||||
|  |   public interface Runnable | ||||||
|  |   { public abstract void run(); } | ||||||
|  |   ``` | ||||||
|  | 
 | ||||||
|  | Starten eines Threads | ||||||
|  | - Eine Klasse, die Runnable implementiert, muss wie Unterklassen von Thread immer eine run()-Methode definieren | ||||||
|  | - Seiteneffekt der Runnable-Schnittstelle | ||||||
|  |   - Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt | ||||||
|  |   - Ausführung beginnt mit der Methode run () | ||||||
|  | - Ablauf | ||||||
|  |   - Thread-Objekt erzeugen | ||||||
|  |   - Thread starten mit t.start() | ||||||
|  |   - start() ruft implizit run() auf | ||||||
|  | 
 | ||||||
|  | Synchronisation von Threads | ||||||
|  | - Gezielte Einschränkung der Nebenläufigkeit | ||||||
|  | - Gründe | ||||||
|  |   - Zugriffsbeschränkung, gegenseitiger Ausschluss | ||||||
|  |   - Abhängigkeiten, einseitige Synchronisation | ||||||
|  | - Methoden: Semaphore, Monitore, Schlossvariablen, ... | ||||||
|  | 
 | ||||||
|  | Java: Monitore | ||||||
|  | - Zugriffsoperationen werden in Klassen zusammengefasst | ||||||
|  | - Gegenseitiger Ausschluss: Spezifikation der betroffenen Zugriffsoperation als synchronized | ||||||
|  | 
 | ||||||
| ## Verifikation und Testen | ## Verifikation und Testen | ||||||
|  | Wie erreicht man qualitativ hochwertige Software? | ||||||
|  | - Wissen, Erfahrung und Methodenkompetenz der Programmierer | ||||||
|  | - Projektstruktur, klare Verantwortlichkeiten | ||||||
|  | - Kosten- und Zeitdruck? Änderungen? | ||||||
|  | - Programmier- und Testmethoden | ||||||
|  |   - pair programming, code reading etc. | ||||||
|  |   - Qualitätsverantwortlicher, automatisiertes Testen | ||||||
|  | - Technische Unterstützung | ||||||
|  |   - Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung | ||||||
|  | 
 | ||||||
|  | Begriffe | ||||||
|  | - Zuverlässigkeit: Maß für Übereinstimmung des Systemverhaltens mit Spezifikation | ||||||
|  | - Grund für Unzuverlässigkeit: | ||||||
|  |   - Fehler (bug, fault): fehlerhafter Programmcode o.ä. | ||||||
|  |     - Der Begriff „Bug“:  | ||||||
|  |       - Schon vor Computern als Begriff für Fehler benutzt  | ||||||
|  |       - Motte im Relais des Computers Mark II Aiken (1947) | ||||||
|  |   - Fehlerhafter Zustand (error): Fehler hat zur Laufzeit zu einem internen fehlerhaften Zustand geführt, der möglicherweise zu einem Ausfall führt | ||||||
|  |   - Störfall, Ausfall (failure): Abweichung vom spezifizierten Verhalten, meist mit negativen Folgen | ||||||
|  | 
 | ||||||
|  | Vergleich System / Systemmodell | ||||||
|  | - Anspruch guter Software: System entspricht Systemmodell (Korrektheit) | ||||||
|  | - Problem: System nicht vollständig automatisch erzeugbar! | ||||||
|  | - Auswege | ||||||
|  |   - Fehlervermeidung (Inspektion, pair programming, ...) | ||||||
|  |   - Nachweis, dass System dem Modell entspricht - Verifikation | ||||||
|  |   - Überprüfen, ob System dem Modell entspricht - Testen | ||||||
|  |   - Fehlertoleranz (durch Redundanz) | ||||||
|  | 
 | ||||||
|  | Verifikation | ||||||
|  | - Mathematisch formaler Beweis, dass ein Programm einer Spezifikation genügt | ||||||
|  | - Vorteil: wenn anwendbar, dann vollständiger Beweis | ||||||
|  | - Problem: für viele (realistisch große) Fälle nicht anwendbar | ||||||
|  |   - Zu aufwändig | ||||||
|  |   - Umgebung muss ebenfalls verifiziert werden | ||||||
|  |   - Auch in der Theorie nicht immer entscheidbar: Halteproblem, Gödelscher Unvollständigkeitssatz | ||||||
|  | - Theoretische Informatik: Berechenbarkeitstheorie, formale Semantik; aktives Forschungsgebiet | ||||||
|  |   - model checking | ||||||
|  | 
 | ||||||
|  | Testen | ||||||
|  | - Systematischer Versuch, Defekte in der Software zu finden | ||||||
|  | - Ingenieurtechnik zur Erhöhung des Vertrauens in Softwaresysteme, aber: unvollständig! | ||||||
|  |   - Kann nur die Anwesenheit von Fehlern nachweisen, aber nicht Korrektheit (Abwesenheit von Fehlern)! | ||||||
|  | - Aufgabe: Unterschiede zwischen Modell und System finden | ||||||
|  | - Destruktiv im Gegensatz zu sonstigen SWE-Aufgaben | ||||||
|  |   - Daher sollten nicht (nur) Entwickler selbst testen | ||||||
|  | 
 | ||||||
|  | Testplanung | ||||||
|  | - Testen ist aufwändig, deshalb ist gute Planung nötig! | ||||||
|  | - Testplanung sollte bereits mit der Anforderungsanalyse beginnen und im Entwurf verfeinert werden (V-Modell, Test-First-Ansatz)! | ||||||
|  | - Typische Bestandteile einer Test-Spezifikation (Testdrehbuch) | ||||||
|  |   - Phasenmodell des Testprozesses | ||||||
|  |   - Zusammenhang zur Anforderungsspezifikation, z.B. dort festgelegte Qualitätsziele | ||||||
|  |   - Zu testende Produkte | ||||||
|  |   - Zeitplan für die Tests | ||||||
|  |   - Abhängigkeiten der Testphasen | ||||||
|  |   - Aufzeichnung der Testergebnisse | ||||||
|  |   - Hardware- und Softwareanforderungen | ||||||
|  | 
 | ||||||
|  | Arten von Tests | ||||||
|  | - Komponententest: Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System | ||||||
|  |   - Umgebung muss nachgebildet werden | ||||||
|  | - Integrationstest: Zusammenspiel von Komponenten | ||||||
|  |   - Vollständiges System: Systemtest; Szenarios | ||||||
|  | - Strukturtest: innere Zustände, Interaktionen | ||||||
|  | - Funktionstest: Anforderungen aus Lastenheft | ||||||
|  | - Leistungstest: nichtfunktionale Anforderungen | ||||||
|  | - Benutzbarkeitstest: Fehler in der Benutzungsschnittstelle, Verständlichkeit, Akzeptanz bei Anwendern | ||||||
|  |   - Prototypen | ||||||
|  | - Akzeptanztest, Installationstest: Kunde, Abnahme | ||||||
|  | 
 | ||||||
|  | Komponententests | ||||||
|  | - Überprüft Verhalten einer Systemkomponenten im Vergleich zur Spezifikation | ||||||
|  | - Da Tests bereits frühzeitig stattfinden sollten, ist Umgebung meist nicht vollständig implementiert | ||||||
|  |   - Teststumpf (stub, dummy) simuliert aufgerufene Komponenten | ||||||
|  |   - Testtreiber simuliert aufrufende Komponenten | ||||||
|  | - Vorgehensweisen | ||||||
|  |   - Bottom-up | ||||||
|  |   - Top-down | ||||||
|  |   - Sandwich | ||||||
|  |   - Schichtenweises Testen | ||||||
|  | 
 | ||||||
|  | Systematisches Testen | ||||||
|  | - Testfall | ||||||
|  |   - Beschreibung, Name | ||||||
|  |   - Zu testende Komponente, Testgegenstand (Pfad, Aufrufart) | ||||||
|  |   - Eingabedaten (Testdaten) | ||||||
|  |   - Erwartete Ergebnisse („Orakel“) | ||||||
|  |   - Protokoll (erzeugte Ausgaben) | ||||||
|  |   - Bewertung des Ergebnisses | ||||||
|  | - Weitere Begriffe | ||||||
|  |   - Regressionstest: erneute Durchführung eines Tests anhand einer geänderten Version des Testgegenstands | ||||||
|  |   - Alphatest: Test eines Prototypen durch Benutzer | ||||||
|  |   - Betatest: Test der vollständigen Software durch Benutzer | ||||||
|  | 
 | ||||||
|  | Funktionaler Test (black box test) | ||||||
|  | - Testfallauswahl beruht auf Spezifikation | ||||||
|  | - Ohne Wissen über inneren Aufbau | ||||||
|  | - E/A-Zusammenhang | ||||||
|  | 
 | ||||||
|  | Äquivalenzklassen im funktionalen Test | ||||||
|  | - Problem: alle Kombinationsmöglichkeiten der Eingangsdaten sind zu umfangreich für vollständigen Test | ||||||
|  | - Mögliche Einschränkung: Bildung von Äquivalenzklassen der Eingangsdaten, für die ähnliches Verhalten erwartet wird | ||||||
|  | - Basierend auf Anwendungsdomäne | ||||||
|  | - Äquivalenzklasse = Teilmenge der möglichen Datenwerte der Eingabeparameter | ||||||
|  | - Test je eines Repräsentanten jeder Äquivalenzklasse | ||||||
|  | - Finden von Äquivalenzklassen | ||||||
|  |   - Zulässige / unzulässige Teilbereiche der Datenwerte | ||||||
|  |   - Unterteilung der Bereiche nach erwarteten Ausgabewerten | ||||||
|  | 
 | ||||||
|  | Grenztests | ||||||
|  | - Ergänzung von Äquivalenztests: Spezialfälle | ||||||
|  | - Rand der Äquivalenzklasse | ||||||
|  | - Außerdem: Sonderfälle, erwartete Problemfälle (technisch) | ||||||
|  | 
 | ||||||
|  | Strukturtest (white box test, glass box test) | ||||||
|  | - Testfallauswahl beruht auf Programmstruktur | ||||||
|  | - Wie erreicht man möglichst vollständige Abdeckung? | ||||||
|  | - Kontrollflussorientiert | ||||||
|  |   - Anweisungsüberdeckung anhand Quellcode | ||||||
|  |   - Zweigüberdeckung und | ||||||
|  |   - Pfadüberdeckung anhand des Flussgraphen reduzierte Variante: bounded interior Pfadtest | ||||||
|  | - Datenflussorientiert | ||||||
|  |   - defines / uses-Verfahren: Abarbeitungspfade von Definition zu jeder Verwendung von Variable oder Objekt durchlaufen | ||||||
|  | - Zustandsorientiert | ||||||
|  | 
 | ||||||
| ## Testaktivitäten und Werkzeuge | ## Testaktivitäten und Werkzeuge | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ## Softwareverteilung | ## Softwareverteilung | ||||||
| 
 | 
 | ||||||
| # Vorgehensweise | # Vorgehensweise | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user