Implementierung hydrated

This commit is contained in:
WieErWill 2021-03-16 10:18:34 +01:00
parent 0469d41760
commit cd79c0f4bd
2 changed files with 136 additions and 535 deletions

Binary file not shown.

View File

@ -914,17 +914,17 @@
Objektorientierter Feinentwurf
\begin{itemize*}
\item Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen)
\item OO-Modell für jedes Subsystem der Architektur
\item OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien
\item Spezifikationen der Klassen
\item Spezifikationen von externen Schnittstellen
\end{itemize*}
\item Grobdefinition der Architektur, Zerlegung in Subsysteme (evtl. unter Verwendung von Standardarchitekturen)
\item OO-Modell für jedes Subsystem der Architektur
\item OO-Modell für unterstützende Subsysteme unter Berücksichtigung gewählter Technologien
\item Spezifikationen der Klassen
\item Spezifikationen von externen Schnittstellen
\end{itemize*}
\subsection{Klassen- und Objektentwurf}
\begin{itemize*}
\item Klassen der Lösungsdomäne
\item Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen
\item Klassen, die nicht durch objektorientierte Analyse der Anwendungsdomäne entstehen
\item Entstehungsgründe
\begin{itemize*}
\item Architektur von Software und System
@ -1002,7 +1002,7 @@
\item Polymorphie
\begin{itemize*}
\item Reaktion auf eine Nachricht abhängig vom Typ des Objektes
\item Variablen können Objekte verschiedener Klassen aufnehmen
\item Variablen können Objekte verschiedener Klassen aufnehmen
\item Überladen von Operationen
\item gleicher Operationsname, unterschiedliche Signatur
\item abstrakte Operationen: Virtuelle Operationen ohne Implementierung
@ -1160,7 +1160,7 @@
\item Ohne Sicht auf innere Implementierung
\item Protokoll = Kollaboration von Protokollrollen
\item Modell: Zustandsautomat
\item Beschreibung der Synchronisation von Objekten
\item Beschreibung der Synchronisation von Objekten
\end{itemize*}
\subsection{Entwurfsmuster}
@ -1240,7 +1240,7 @@
\item Numerische Routinen, Simulation, ...
\end{itemize*}
\item Wird in Anwendung eingebunden (importiert), API
\item Objekte instanziieren oder Klassen ableiten
\item Objekte instanziieren oder Klassen ableiten
\item Meist passiv: Kontrollfluss wird von Anwendung gesteuert
\end{itemize*}
@ -1316,78 +1316,31 @@
\item Untersuchung des Zeit- und Speicherbedarfs
\item Test und Verifikation
\end{itemize*}
\item „Programmieren im Kleinen“
\end{itemize*}
\subsection{Konventionen und Werkzeuge}
Konventionen beim Programmieren
\begin{itemize*}
\item (Coding Rules, -conventions, -standards)
\item Regeln für verständliche Programme
\begin{itemize*}
\item „wie“ sollte Quellcode formal und strukturell gestaltet sein
\item Bezeichner, Einrückungen, Dokumentation, Dateien, ...
\item Strukturierung: Block, Methode, Klasse, Package
\end{itemize*}
\item Firmenspezifische Regeln
\begin{itemize*}
\item Festlegung Entwurfsprinzipien (z.B. keine Mehrfachvererbung)
\end{itemize*}
\end{itemize*}
Namenskonventionen
\begin{itemize*}
\item Klasse
\begin{itemize*}
\item (mit) Substantiv, „UpperCamelCase“
\item Beispiele: Account, StandardTemplate
\end{itemize*}
\item Methode
\begin{itemize*}
\item (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“
\item Beispiele: checkAvailability(), getDate()
\end{itemize*}
\item Attribut, Variable
\begin{itemize*}
\item (mit) Substantiv, „lowerCamelCase“
\item Beispiele: anzahlAutos, fensterBreite
\end{itemize*}
\item Konstante
\begin{itemize*}
\item Nur Großbuchstaben, Worte mit "\_" zusammengesetzt
\item Standardpräfixe: "MIN\_", "MAX\_", "DEFAULT\_", ...
\item Beispiele: NORTH, BLUE, MIN\_WIDTH, DEFAULT\_SIZE
\end{itemize*}
\end{itemize*}
\begin{description*}
\item[Klasse] (mit) Substantiv, „UpperCamelCase“
\item[Methode] (mit) Verb, Imperativ (Aufforderung), „lowerCamelCase“
\item[Attribut, Variable] (mit) Substantiv, „lowerCamelCase“
\item[Konstante] Nur Großbuchstaben, Worte mit "\_" zusammengesetzt
\end{description*}
Formatierungs-Richtlinien
\begin{itemize*}
\item Entsprechend Schachtelungstiefe einrücken, aber nicht zu weit
\item Einheitliche Verwendung von Leerzeilen und Leerzeichen
\item Einheitliche Dateistruktur verwenden
\begin{itemize*}
\item Eine .java-Datei pro Klasse
\item Ein Verzeichnis für jedes package
\end{itemize*}
\item Werkzeuge: source beautifier, oft in IDEs enthalten
\item Editor: syntax highlighting
\item Navigationswerkzeuge
\begin{itemize*}
\item Auf- und Zuklappen, Inhaltsverzeichnis, tagging
\item doxygen, Eclipse etc.
\end{itemize*}
\end{itemize*}
Änderungsfreundlicher Code
\begin{itemize*}
\item Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung:
\begin{itemize*}
\item `typedef char name [NAME\_LENGTH]`
\item `typedef char firstName [FIRST\_NAME\_LENGTH]`
\end{itemize*}
\item Wahl von Variablen, Konstanten und Typen orientiert an der fachlichen Aufgabe, nicht an der Implementierung
\item Symbolische Konstanten statt literaler Werte verwenden, wenn spätere Änderung denkbar
\item Algorithmen, Formeln, Standardkonzepte in Methoden/Prozeduren kapseln
\item Übersichtlichkeit: Zusammenhängende Einheit nicht größer als Editorfenster (40-60 Zeilen, 70 Zeichen breit)
\item Übersichtlichkeit: Zusammenhängende Einheit nicht größer als Editorfenster
\item Strukturierte Programmierung (Regeln je nach Schärfe)
\begin{itemize*}
\item Kein goto verwenden (in anderen Sprachen als Java)
@ -1397,171 +1350,71 @@
\item return nur am Ende zur Rückgabe des Werts
\end{itemize*}
\item Übersichtliche Ausdrücke
\begin{itemize*}
\item Seiteneffektfreie Ausdrücke, schlecht: y += 12*x++;
\end{itemize*}
\item Variablen möglichst lokal und immer private deklarieren
\item Wiederverwendung "äußerer" Namen vermeiden
\end{itemize*}
Werkzeuge
\begin{itemize*}
\item Integrated Development Environments (Eclipse, KDevelop)
\item Compiler, Linker; Build / Make; Versionskontrolle (git, svn)
\end{itemize*}
\subsection{Code-Qualität}
Portierbarer Code
\begin{itemize*}
\item Code, den man ohne Änderungen in ein anderes System (Compiler, Betriebssystem, Rechner) übertragen kann
\item Portierbarer Code: ohne Änderungen in anderes System (Compiler, Betriebssystem, Rechner) übertragen kann
\item Implementierungsabhängiges Verhalten
\begin{itemize*}
\item Kein implementierungsabhängiges Verhalten!
\end{itemize*}
\item ANSI C++ Standard ist nicht vollständig definiert
\begin{itemize*}
\item Ist das Verhalten nicht festgelegt, unterscheidet der ANSI C++ Standard zwischen:
\item Implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten
\item Code, welcher auf implementierungsabhängigem, unspezifiziertem oder undefiniertem Verhalten basiert, ist
\item Nicht portabel und somit häufig verboten
\item Wird unter Umständen ungewollt wegoptimiert
\item Compiler übersetzen Sprachkonstrukte unterschiedlich
\item Verhalten ist konsistent festgelegt und dokumentiert
\item Kompilierung von standardkonformem Code ist erfolgreich
\item char kann signed oder unsigned sein: Nicht damit rechnen!
\end{itemize*}
\item Sicherer Code mit const
\begin{description*}
\item[Const Variable] Stellt sicher, dass sich der Wert nicht verändert
\item[Const Parameter] Übergabeparameter ändert sich nicht
\item[Const Operationen] Sicherstellen, dass Operation das Exemplar nicht ändert
\end{description*}
\end{itemize*}
Implementierungsabhängiges Verhalten
\begin{itemize*}
\item Compiler übersetzen bestimmte Sprachkonstrukte unterschiedlich, Ergebnis unterscheidet sich
\item Voraussetzung:
\item Verhalten ist konsistent festgelegt und dokumentiert
\item Kompilierung von standardkonformem Code ist erfolgreich
\item Beispiel: Speichergröße von Integer-Typen
\item char kann signed oder unsigned sein: Nicht damit rechnen!
\item 32 Bit System ist wie erwartet
\item 16 Bit System: Multiplikation wird mit int durchgeführt $\rightarrow$ Überlauf $\rightarrow$ undefiniertes Verhalten
\end{itemize*}
\begin{itemize*}
\item Unspezifiziertes Verhalten:
\item Wie implementierungsabhängiges Verhalten
\item Compiler muss sich für ein bestimmtes Verhalten entscheiden
\item Muss nicht dokumentiert sein
\item Beispiel: Evaluierungsreihenfolge von Funktionsargumenten `tuWas(zuerstDas(),oderDochLieberDas());`
\item Undefiniertes Verhalten:
\item Keinerlei Vorgaben
\item Compiler muss mögliches Problem nicht melden
\item Keine Voraussage welches Resultat eintritt
\item Bereits die Kompilierung kann fehlschlagen
\item Oder das laufende Programm kann falsche Resultate liefern.
\item Effekt: „Bei mir läuft es aber!?“
\item „undefiniertes Verhalten nutzen grenzt an Sabotage!“
\end{itemize*}
Sicherer Code mit const
\begin{itemize*}
\item Const Variable - Konstante
\begin{itemize*}
\item Stellt sicher, dass sich der Wert nicht verändert
\end{itemize*}
\item Const Parameter
\begin{itemize*}
\item Übergabeparameter ändert sich nicht innerhalb der Operation
\item Z.B. bei Übergabe komplexer Daten als Referenz bzw. Zeiger `long calcMeanValue(const image \&i){...}`
\end{itemize*}
\item Const Operationen
\begin{itemize*}
\item Sicherstellen, dass Operation das Exemplar nicht ändert
\item Aufruf der const Operation bei const Variablen möglich
\end{itemize*}
\item Verwende const wenn möglich
\end{itemize*}
\subsection{Dokumentation}
\begin{itemize*}
\item Selbstdokumentierende Programme?
\begin{description*}
\item[Integrierte] Dokumentation
\begin{itemize*}
\item 2001 Int. Obfuscated C Code Contest Winner, Short Program
\item Verständlichkeit, Wartbarkeit - auch für Programmierer!
\item Code selbst sollte möglichst verständlich sein
\item Dokumentation in Programm schreiben und aktualisieren
\item Beschreibung der Bedeutung des Codes!
\item Als Konventionen festschreiben
\item Programmvorspann
\item Kurzbeschreibung Datei / Klasse / Funktion ...
\item Verwaltungsinformationen
\item Laufende Kommentare im Quellcode
\end{itemize*}
\end{itemize*}
Integrierte Dokumentation
\begin{itemize*}
\item Verständlichkeit, Wartbarkeit - auch für Programmierer!
\item Code selbst sollte möglichst verständlich sein
\item Dokumentation in Programm schreiben und aktualisieren
\item Beschreibung der Bedeutung des Codes!
\item Als Konventionen festschreiben
\item Programmvorspann
\item Kurzbeschreibung Datei / Klasse / Funktion ...
\item Verwaltungsinformationen
\item[Programmierer] Dokumentation
\begin{itemize*}
\item Autor, Datum, Version, Projekt, ToDo, FixMe, ...
\item Zustand: geplant, in Bearbeitung, vorgelegt, akzeptiert
\item Als eigenes Dokument elektronisch oder gedruckt
\item Einstieg in Programmverständnis (z.B. Bachelor-Arbeit)
\item Konsistenz mit Quelltext? Verweise?
\item Technische Unterstützung: JavaDoc (Java), doxygen (C++)
\item Ergänztes Java-Programm: Dokumentation HTML, PDF,
\end{itemize*}
\item Laufende Kommentare im Quellcode
\end{itemize*}
Programmierer-Dokumentation
\begin{itemize*}
\item Als eigenes Dokument elektronisch oder gedruckt
\item Einstieg in Programmverständnis (z.B. Bachelor-Arbeit)
\item Konsistenz mit Quelltext? Verweise?
\item Technische Unterstützung: JavaDoc (Java), doxygen (C++)
\item Ergänztes Java-Programm: Dokumentation HTML, PDF,
\end{itemize*}
% ```js
% /** @author name Mustermann */
% /** @param name description */
% /** @return description */
% ```
Benutzerdokumentation
\begin{itemize*}
\item Benutzer-Handbuch, Online-Dokumentation
\item Unterstützung ohne Support?
\item Vollständige und fehlerfreie Beschreibung der Benutzung
\item[Benutzer] Dokumentation
\begin{itemize*}
\item Beispiele, screen shots
\item Benutzer-Handbuch, Online-Dokumentation
\item Unterstützung ohne Support?
\item Vollständige und fehlerfreie Beschreibung der Benutzung
\item Arten: Tutorial, Beschreibung
\end{itemize*}
\item Arten: Tutorial, Beschreibung,
\end{itemize*}
Benutzer-Unterstützungssysteme
\begin{itemize*}
\item Integrierte Hilfe (Suchfunktion, balloon help / tool tips)
\item Assistenz-System (Zustandsabhängige Anleitung)
\item Tutor-System zum Erlernen
\item Bug-Listen, Mailinglisten, Diskussionsforen
\end{itemize*}
\end{description*}
\subsection{Codegenerierung}
Bezug zwischen Modell und Programmcode
\begin{itemize*}
\item Vorwärtsmodellierung: Modell - Code
\item Rückwärtsmodellierung: Code - Modell
\begin{itemize*}
\item Außerdem: Modelltransformation, Refaktorisierung
\end{itemize*}
\item Idealfall: Automatische Übersetzung durch SW-Werkzeug (in beiden Richtungen)
\begin{itemize*}
\item „Modellbasierte Entwicklung“
\end{itemize*}
\item Statisch: Beispiel Klassendiagramm - Quelltext der Klassen mit allen Vererbungsbeziehungen, Attributen und Methodensignaturen (Klassen-Stümpfe mit leeren Methodenrümpfen zum Ausfüllen)
\item Dynamisch: Beispiel Zustandsdiagramm - Quelltext der Zustandssteuerung einer Klasse
\end{itemize*}
%![Codegenerierung](Assets/Softwaretechnik1_Codegenerierung.png)
Weitere statische Transformationen
\begin{itemize*}
\item Abbildung von Assoziationen auf Sammlungen
\item Abbildung von Verträgen auf Ausnahmen
\item Abbildung von Objektmodellen auf Datenbankschemata
\item Abbildung von Entwurfsmustern auf Codefragmente
\item Modelltransformation, Refaktorisierung
\item Idealfall: Automatische Übersetzung durch SW-Werkzeug
\item Statisch: Quelltext der Klassen mit Beziehungen, Attributen...
\item Dynamisch: Quelltext der Zustandssteuerung einer Klasse
\end{itemize*}
Optimierung des Entwurfsmodells
\begin{itemize*}
\item Grund: nichtfunktionale Eigenschaften
\item Zugriffspfade
\item Klassen in Attribute umwandeln
\item Verzögerung von Berechnungen
@ -1572,41 +1425,18 @@
\begin{itemize*}
\item Einfachste Möglichkeit: Switch (Case) Statement
\item Zustände werden durch Datenwerte repräsentiert
\begin{itemize*}
\item Aktueller Zustand: einzelne skalare Variable
\end{itemize*}
\item Jedes Ereignis wird durch Methode implementiert
\item Ausgehend von aktivem Zustand wird bei Eintreffen eines Ereignisses der entsprechende Programmcode ausgeführt
\item Abhängig von Zustandsvariable wird Aktion ausgeführt und der Folgezustand eingestellt
\item Wird in einer Klasse realisiert
\item Sinnvoll für einfache, “flache” Modelle
\begin{itemize*}
\item Sonst Logik für Hierarchie nötig
\end{itemize*}
\end{itemize*}
Anpassung der Generierung
\begin{itemize*}
\item Verschiedene Zielsprachen (Java, C++, ...)
\item Model2Text-Transformationen
\begin{itemize*}
\item Verschiedene Generatoren, z.B. Eclipse Modelling Project
\end{itemize*}
\item Generierung aus dem Modellierungswerkzeug
\begin{itemize*}
\item Parametrisierung der Codegenerierung
\item Generierungsvorlagen
\end{itemize*}
\end{itemize*}
Weitere Werkzeuge
\begin{itemize*}
\item Compiler-Compiler: Syntaxbeschreibung wird in lexikalische Analyse (tokenizer) und Syntaxanalyse-Programm transformiert (lex \& yacc / flex \& bison / antlr)
\item Codegenerierung für grafische Benutzungsoberflächen aus grafischer Beschreibung: GUI toolkits
\item XML-Parser
\begin{itemize*}
\item XSLT, DOM, SAX, ...
\end{itemize*}
\end{itemize*}
\subsection{Implementierung aktiver Objekte}
@ -1617,15 +1447,12 @@
\end{itemize*}
Arten von Programmabarbeitung
\begin{itemize*}
\item Sequentiell: es gibt immer genau einen nächsten Schritt, alle Schritte werden nacheinander ausgeführt
\item Parallel: Spezielle Hardware bzw. Mehrkernprozessor, mehrere Befehlsfolgen werden echt parallel bearbeitet
\item Quasi-parallel: Ein Prozessor arbeitet mehrere Befehlsfolgen in freier Einteilung ab
\item Nebenläufig: Oberbegriff für Parallel und Quasi-parallel
\begin{itemize*}
\item concurrent
\end{itemize*}
\end{itemize*}
\begin{description*}
\item[Sequentiell] es gibt immer genau einen nächsten Schritt, alle Schritte werden nacheinander ausgeführt
\item[Parallel] Spezielle Hardware bzw. Mehrkernprozessor, mehrere Befehlsfolgen werden echt parallel bearbeitet
\item[Quasi-parallel] Ein Prozessor arbeitet mehrere Befehlsfolgen in freier Einteilung ab
\item[Nebenläufig] Oberbegriff für Parallel und Quasi-parallel (concurrent)
\end{description*}
Vorteile
\begin{itemize*}
@ -1640,71 +1467,7 @@
\item Ein Programm, das bei gleichen Eingaben gleiche Ausgaben produziert, heißt determiniert (determined)
\item Programme in üblichen Programmiersprachen sind sequentiell, deterministisch und determiniert
\item Grund: Herkömmliche Programmiersprachen sind durch das von-Neumann-Modell geprägt
\item Determinismus nicht notwendig für Determiniertheit!
\begin{itemize*}
\item Determiniertheit nebenläufiger Programme: Synchronisation
\item Vermeidung von Schreib/Schreib und Schreib/Lese-Konflikten
\end{itemize*}
\end{itemize*}
Java Threads
\begin{itemize*}
\item Verwaltung durch die Java Virtuelle Maschine (JVM)
\item Realisierung der Threads ist je nach Implementierung der JVM unterschiedlich
\begin{itemize*}
\item Abbildung auf Betriebssystem-Threads (z.B. unter Windows weitverbreitet)
\item Realisierung durch die JVM (z.B. unter Unix und in Java-fähigen Browsern)
\item Nachteile: Keine Ausnutzung von Multiprozessorsystemen durch die VM; Zuteilungsstrategie für Threads ist in derzeitigen Implementierungen unterschiedlich
\end{itemize*}
\item Threads arbeiten immer im Adressraum der JVM (eigener Prozess) und sind außerhalb dieser nicht sichtbar
\end{itemize*}
Erzeugung eines Threads
\begin{itemize*}
\item Unterklasse der Basisklasse „Thread“ bilden `class MyThread extends Thread`
\item Problem: keine Mehrfachvererbung, daher Alternative nötig (Beispiel: Applet):
\begin{itemize*}
\item Schnittstelle „Runnable“ implementieren
\item `class MyThread implements Runnable`
\end{itemize*}
\item Die vordefinierte Schnittstelle Runnable ist definiert als
% ```java
% public interface Runnable
% { public abstract void run(); }
% ```
\end{itemize*}
Starten eines Threads
\begin{itemize*}
\item Eine Klasse, die Runnable implementiert, muss wie Unterklassen von Thread immer eine run()-Methode definieren
\item Seiteneffekt der Runnable-Schnittstelle
\begin{itemize*}
\item Instanzen der Klasse werden nebenläufig zu den anderen laufenden Threads ausgeführt
\item Ausführung beginnt mit der Methode run ()
\end{itemize*}
\item Ablauf
\begin{itemize*}
\item Thread-Objekt erzeugen
\item Thread starten mit t.start()
\item start() ruft implizit run() auf
\end{itemize*}
\end{itemize*}
Synchronisation von Threads
\begin{itemize*}
\item Gezielte Einschränkung der Nebenläufigkeit
\item Gründe
\begin{itemize*}
\item Zugriffsbeschränkung, gegenseitiger Ausschluss
\item Abhängigkeiten, einseitige Synchronisation
\end{itemize*}
\item Methoden: Semaphore, Monitore, Schlossvariablen, ...
\end{itemize*}
Java: Monitore
\begin{itemize*}
\item Zugriffsoperationen werden in Klassen zusammengefasst
\item Gegenseitiger Ausschluss: Spezifikation der betroffenen Zugriffsoperation als synchronized
\item Determiniertheit nebenläufiger Programme: Synchronisation
\end{itemize*}
\subsection{Verifikation und Testen}
@ -1713,127 +1476,68 @@
\item Wissen, Erfahrung und Methodenkompetenz der Programmierer
\item Projektstruktur, klare Verantwortlichkeiten
\item Kosten- und Zeitdruck? Änderungen?
\item Programmier- und Testmethoden
\begin{itemize*}
\item pair programming, code reading etc.
\item Qualitätsverantwortlicher, automatisiertes Testen
\end{itemize*}
\item Technische Unterstützung
\begin{itemize*}
\item Z.B. Versionierung, Dokumentation, Testen, Entwicklungsumgebung
\end{itemize*}
\item Programmier- und Testmethoden (pair programming, code reading)
\item Technische Unterstützung (Versionierung, Dokumentation, Testen)
\end{itemize*}
Begriffe
\begin{itemize*}
\item Zuverlässigkeit: Maß für Übereinstimmung des Systemverhaltens mit Spezifikation
\item Grund für Unzuverlässigkeit:
\begin{itemize*}
\item Fehler (bug, fault): fehlerhafter Programmcode o.ä.
\item Der Begriff „Bug“:
\begin{itemize*}
\item Schon vor Computern als Begriff für Fehler benutzt
\item Motte im Relais des Computers Mark II Aiken (1947)
\end{itemize*}
\end{itemize*}
\item Fehlerhafter Zustand (error): Fehler hat zur Laufzeit zu einem internen fehlerhaften Zustand geführt, der möglicherweise zu einem Ausfall führt
\item Störfall, Ausfall (failure): Abweichung vom spezifizierten Verhalten, meist mit negativen Folgen
\end{itemize*}
\begin{description*}
\item[Zuverlässigkeit] Maß für Übereinstimmung des Systemverhaltens mit Spezifikation
\item[Unzuverlässigkeit] Fehler (bug, fault), fehlerhafter Programmcode
\item[Fehlerhafter Zustand (error)] Fehler hat zur Laufzeit zu einem internen fehlerhaften Zustand geführt, der möglicherweise zu einem Ausfall führt
\item[Störfall, Ausfall (failure)] Abweichung vom spezifizierten Verhalten, meist mit negativen Folgen
\end{description*}
Vergleich System / Systemmodell
\paragraph{Verifikation}
\begin{itemize*}
\item Anspruch guter Software: System entspricht Systemmodell (Korrektheit)
\item Problem: System nicht vollständig automatisch erzeugbar!
\item Auswege
\begin{itemize*}
\item Fehlervermeidung (Inspektion, pair programming, ...)
\item Nachweis, dass System dem Modell entspricht - Verifikation
\item Überprüfen, ob System dem Modell entspricht - Testen
\item Fehlertoleranz (durch Redundanz)
\end{itemize*}
\end{itemize*}
Verifikation
\begin{itemize*}
\item Mathematisch formaler Beweis, dass ein Programm einer Spezifikation genügt
\item Mathematisch formaler Beweis genügt
\item Vorteil: wenn anwendbar, dann vollständiger Beweis
\item Problem: für viele (realistisch große) Fälle nicht anwendbar
\begin{itemize*}
\item Zu aufwändig
\item Umgebung muss ebenfalls verifiziert werden
\item Auch in der Theorie nicht immer entscheidbar: Halteproblem, Gödelscher Unvollständigkeitssatz
\end{itemize*}
\item Theoretische Informatik: Berechenbarkeitstheorie, formale Semantik; aktives Forschungsgebiet
\begin{itemize*}
\item model checking
\end{itemize*}
\item Theoretische Informatik: Berechenbarkeitstheorie, Semantik
\end{itemize*}
Testen
\begin{itemize*}
\item Systematischer Versuch, Defekte in der Software zu finden
\item Ingenieurtechnik zur Erhöhung des Vertrauens in Softwaresysteme, aber: unvollständig!
\begin{itemize*}
\item Kann nur die Anwesenheit von Fehlern nachweisen, aber nicht Korrektheit (Abwesenheit von Fehlern)!
\end{itemize*}
\item Ingenieurtechnik zur Erhöhung des Vertrauens
\item Aufgabe: Unterschiede zwischen Modell und System finden
\item Destruktiv im Gegensatz zu sonstigen SWE-Aufgaben
\begin{itemize*}
\item Daher sollten nicht (nur) Entwickler selbst testen
\end{itemize*}
\end{itemize*}
Testplanung
\begin{itemize*}
\item Testen ist aufwändig, deshalb ist gute Planung nötig!
\item Testplanung sollte bereits mit der Anforderungsanalyse beginnen und im Entwurf verfeinert werden (V-Modell, Test-First-Ansatz)!
\item Testplanung sollte bereits mit der Anforderungsanalyse beginnen
\item Typische Bestandteile einer Test-Spezifikation (Testdrehbuch)
\begin{itemize*}
\item Phasenmodell des Testprozesses
\item Zusammenhang zur Anforderungsspezifikation, z.B. dort festgelegte Qualitätsziele
\item Zusammenhang zur Anforderungsspezifikation
\item Zu testende Produkte
\item Zeitplan für die Tests
\item Abhängigkeiten der Testphasen
\item Aufzeichnung der Testergebnisse
\item Hardware\item und Softwareanforderungen
\item Hardware- und Softwareanforderungen
\end{itemize*}
\end{itemize*}
Arten von Tests
\begin{itemize*}
\item Komponententest: Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System
\begin{itemize*}
\item Umgebung muss nachgebildet werden
\end{itemize*}
\item Integrationstest: Zusammenspiel von Komponenten
\begin{itemize*}
\item Vollständiges System: Systemtest; Szenarios
\end{itemize*}
\item Strukturtest: innere Zustände, Interaktionen
\item Funktionstest: Anforderungen aus Lastenheft
\item Leistungstest: nichtfunktionale Anforderungen
\item Benutzbarkeitstest: Fehler in der Benutzungsschnittstelle, Verständlichkeit, Akzeptanz bei Anwendern
\begin{itemize*}
\item Prototypen
\end{itemize*}
\item Akzeptanztest, Installationstest: Kunde, Abnahme
\end{itemize*}
\begin{description*}
\item[Komponententest] Fehler in einzelnen Objekten oder Subsystemen, losgelöst vom umgebenden System
\item[Integrationstest] Zusammenspiel von Komponenten
\item[Systemtest] Vollständiges System; Szenarios
\item[Strukturtest] innere Zustände, Interaktionen
\item[Funktionstest] Anforderungen aus Lastenheft
\item[Leistungstest] nichtfunktionale Anforderungen
\item[Benutzbarkeitstest] Fehler in der Benutzungsschnittstelle, Verständlichkeit, Akzeptanz bei Anwendern
\item[Akzeptanztest, Installationstest]: Kunde, Abnahme
\end{description*}
Komponententests
\begin{itemize*}
\item Überprüft Verhalten einer Systemkomponenten im Vergleich zur Spezifikation
\item Da Tests bereits frühzeitig stattfinden sollten, ist Umgebung meist nicht vollständig implementiert
\begin{itemize*}
\item Teststumpf (stub, dummy) simuliert aufgerufene Komponenten
\item Teststumpf simuliert aufgerufene Komponenten
\item Testtreiber simuliert aufrufende Komponenten
\end{itemize*}
\item Vorgehensweisen
\begin{itemize*}
\item Bottom-up
\item Top-down
\item Sandwich
\item Schichtenweises Testen
\end{itemize*}
\item Vorgehensweisen: Bottom-up, Top-down, Sandwich, Schichtenweise
\end{itemize*}
Systematisches Testen
@ -1849,7 +1553,7 @@
\end{itemize*}
\item Weitere Begriffe
\begin{itemize*}
\item Regressionstest: erneute Durchführung eines Tests anhand einer geänderten Version des Testgegenstands
\item Regressionstest: geänderte Version des Testgegenstands
\item Alphatest: Test eines Prototypen durch Benutzer
\item Betatest: Test der vollständigen Software durch Benutzer
\end{itemize*}
@ -1862,48 +1566,18 @@
\item E/A-Zusammenhang
\end{itemize*}
Äquivalenzklassen im funktionalen Test
\begin{itemize*}
\item Problem: alle Kombinationsmöglichkeiten der Eingangsdaten sind zu umfangreich für vollständigen Test
\item Mögliche Einschränkung: Bildung von Äquivalenzklassen der Eingangsdaten, für die ähnliches Verhalten erwartet wird
\item Basierend auf Anwendungsdomäne
\item Äquivalenzklasse = Teilmenge der möglichen Datenwerte der Eingabeparameter
\item Test je eines Repräsentanten jeder Äquivalenzklasse
\item Finden von Äquivalenzklassen
\begin{itemize*}
\item Zulässige / unzulässige Teilbereiche der Datenwerte
\item Unterteilung der Bereiche nach erwarteten Ausgabewerten
\end{itemize*}
\end{itemize*}
Grenztests
\begin{itemize*}
\item Ergänzung von Äquivalenztests: Spezialfälle
\item Rand der Äquivalenzklasse
\item Außerdem: Sonderfälle, erwartete Problemfälle (technisch)
\end{itemize*}
Strukturtest (white box test, glass box test)
\begin{itemize*}
\item Testfallauswahl beruht auf Programmstruktur
\item Wie erreicht man möglichst vollständige Abdeckung?
\item Kontrollflussorientiert
\begin{itemize*}
\item Anweisungsüberdeckung anhand Quellcode
\item Zweigüberdeckung und
\item Pfadüberdeckung anhand des Flussgraphen reduzierte Variante: bounded interior Pfadtest
\end{itemize*}
\item Datenflussorientiert
\begin{itemize*}
\item defines / uses-Verfahren: Abarbeitungspfade von Definition zu jeder Verwendung von Variable oder Objekt durchlaufen
\end{itemize*}
\item Kontrollflussorientiert (Anweisungsüberdeckung anhand Quellcode)
\item Datenflussorientiert (Abarbeitungspfade von Definition)
\item Zustandsorientiert
\end{itemize*}
\subsection{Testaktivitäten und Werkzeuge}
Wann wird getestet?
\begin{itemize*}
\item Während der Implementierung!
\item Wann wird getestet? Während der Implementierung!
\begin{itemize*}
\item Auch wenn Schreiben von Tests scheinbar unproduktiv ist
\item Tests sind unbeliebt, da Probleme aufgezeigt werden
@ -1911,10 +1585,9 @@
\end{itemize*}
\item Inkrementell, d.h. für jede überschaubare Änderung
\item Spezielle Vorgehensweise: test first-Ansatz
\item Wie wird getestet? Geplant, systematisch, möglichst automatisiert, dokumentiert, wiederholbar
\end{itemize*}
Wie wird getestet? Geplant, systematisch, möglichst automatisiert, dokumentiert, wiederholbar
Testplanung
\begin{itemize*}
\item Iterative Erstellung eines Testplans / Testdrehbuchs
@ -1947,7 +1620,7 @@
\item Festlegen und Erstellen der Eingabedaten
\item Festlegungen zum Testablauf und zur Testreihenfolge
\item Festlegen Soll-Ergebnis
\item Festlegung der Bedingung(en) für 'Test erfüllt'; ...
\item Festlegung der Bedingung(en) für 'Test erfüllt'
\end{itemize*}
\end{itemize*}
@ -1960,19 +1633,15 @@
\item Bereitstellen der Dokumente (Testspezifikation)
\item Verfügbar machen von Werkzeugen (Fehlermanagement)
\item Aufbauen der Testumgebung(en)
\item Integration der Entwicklungsergebnisse in die Testumgebung (Software installieren, konfigurieren, ...)
\item Bereitstellung von Testdaten bzw. Eingabedaten in die Testumgebung
\item Integration der Entwicklungsergebnisse
\item Bereitstellung von Testdaten in die Testumgebung
\item Benutzer und Benutzerrechte anlegen
\end{itemize*}
\end{itemize*}
Testdurchführung
\begin{itemize*}
\item Durchführung der spezifizierten Tests
\begin{itemize*}
\item Manuell
\item Automatisiert
\end{itemize*}
\item Durchführung der spezifizierten Tests (Manuell/Automatisiert)
\item Aktivitäten
\begin{itemize*}
\item Auswählen der zu testenden Testfälle
@ -1993,9 +1662,8 @@
\begin{itemize*}
\item Klassifizierung (z. B.: Fehlerursache, Fehlerschwere etc.)
\item Fehler reproduzieren!
\item Angemessene Fehlerbeschreibung und erläuterung: Nur ausreichend dokumentierte Fehler sind gültig und können bearbeitet werden!
\item Angemessene Fehlerbeschreibung und -erläuterung
\item Fehler im Fehlermanagement eintragen (Bug report)
\item Testfall bleibt offen
\end{itemize*}
\end{itemize*}
@ -2005,37 +1673,29 @@
\item Ziel ist die Reproduzierbarkeit des Fehlers
\item Zuordnung zu Projektplan: Meilenstein, Version
\item Fehlerklassifikation
\begin{itemize*}
\item defect: Fehler in einer bestehenden Funktionalität
\item enhancement / feature: Funktionale Anforderung oder Erweiterung der bestehenden Funktionalität
\item task: Allgemeine Aufgabe
\end{itemize*}
\begin{description*}
\item[defect] Fehler in einer bestehenden Funktionalität
\item[enhancement/feature] Funktionale Anforderung (Erweiterung)
\item[task] Allgemeine Aufgabe
\end{description*}
\item Priorität festlegen
\begin{itemize*}
\item Unterschiedliche Stufen
\item Festlegung innerhalb eines Unternehmens / Projektes
\end{itemize*}
\item Prioritäten von Fehlern (bugs)
\begin{description*}
\item[blocker] Schwerwiegender Fehler, führt zur Arbeitsunfähigkeit anderer
\item[critical] Schwerer Fehler, grundlegende Funktionalität des Systems nicht gegeben
\item[major] normaler Fehler. System kann weiterhin verwendet werden
\item[minor] Kleiner Fehler, behindert nicht weiter die Funktionsfähigkeit des Systems
\item[trivial] Schönheitsfehler, stört während des Betrieb des Systems nicht.
\end{description*}
\end{itemize*}
%| Stufe | Bedeutung | Verhalten |
%| -\item | -\item | -\item |
%| blocker | Schwerwiegender Fehler. Führt zur Arbeitsunfähigkeit anderer (Entwicklung, QA, Produktion,...). | Verdrängt alle anderen Aufgaben! Muss sofort gelöst werden, um Arbeitsfähigkeit wieder herzustellen. |
%| critical | Schwerer Fehler. Eine grundlegende Funktionalität des Systems ist nicht gegeben. Fehler muss bis zur nächsten Version behoben werden. System kann nicht verwendet werden. | Alle anderen Fehler (außer blocker) werden später gelöst. Bis zum nächsten Release muss dieser Bug gelöst sein. |
%| major | „normaler“ Fehler. Es tritt ein Fehler innerhalb einer Funktion des Systems auf. Das System kann jedoch weiterhin verwendet werden. | Fehler wird normal eingeplant. |
%| minor | Kleiner Fehler. Fehler behindert nicht weiter die Funktionsfähigkeit des Systems. Einfacher Work-Around vorhanden? | Je nach Aufwand und Zeitplanung erledigen. |
%| trivial | Schönheitsfehler. Fehler stört während des Betrieb des Systems nicht. | Je nach Aufwand „zwischendrin“ erledigen. Alle anderen Bugs bevorzugt lösen. |
Testabschluss
\begin{itemize*}
\item Zusammenfassen der Tests
\item Gesamtstatus dokumentieren und kommunizieren
\item Entscheidungen herbeiführen z.B.: Auslieferung?
\item Zusammenfassen der Tests dokumentieren und kommunizieren
\item Entscheidungen herbeiführen
\begin{itemize*}
\item Ziele erreicht - nächste Schritte (Auslieferung)
\item Tests vorzeitig beenden oder unterbrechen
\item Gründe dokumentieren
\item Vollständiger Nachtest oder Teiltest möglich?
\end{itemize*}
\item Unterlagen archivieren
\end{itemize*}
@ -2043,11 +1703,8 @@
Testautomatisierung
\begin{itemize*}
\item Automatische Code-Validierung
\begin{itemize*}
\item Statisch: lint (C), Compiler
\item Dynamisch: run-time checking, memory leaks etc.
\end{itemize*}
\item Beispiel: Test-Framework JUnit
\item Statisch: lint (C), Compiler
\item Dynamisch: run-time checking, memory leaks etc.
\end{itemize*}
Behebung funktionaler Fehler
@ -2065,28 +1722,21 @@
\item Aufrufe, Zeitverbrauch in Methoden usw.
\end{itemize*}
Memory Leaks, JProbe
Memory Leaks
\begin{itemize*}
\item Runtime heap summary: Welche Objekte verbrauchen Speicher?
\item Reference graph: Wer referenziert diese Objekte, so dass sie nicht per garbage collection gelöscht werden?
\end{itemize*}
\subsection{Softwareverteilung}
Softwareverteilung (deployment)
\subsection{Softwareverteilung (deployment)}
\begin{itemize*}
\item Prozess zur Installation von Software auf
\begin{itemize*}
\item Anwender-PCs, Servern, Maschinen in Produktion ...
\end{itemize*}
\item Prozess zur Installation von Software auf PCs, Servern, Maschinen in Produktion
\item Steuerung der Installation der Software
\item Voraussetzungen für die Software schaffen
\begin{itemize*}
\item Schulungen planen und durchführen
\end{itemize*}
\item Softwareverteilung ist ein kritischer Prozess!
\begin{itemize*}
\item Fehler können zu vielen Störungen und Ausfällen führen
\end{itemize*}
\item Ziele
\begin{itemize*}
\item Automatische Installation, Konfiguration und Wartung einer großen Anzahl von Systemen mit geringem Aufwand
@ -2096,85 +1746,36 @@
\end{itemize*}
Installationsarten
\begin{itemize*}
\item Erstinstallation
\item Software-Update (Software-Aktualisierung)
\begin{itemize*}
\item Aktualisierung der Software, Daten oder Konfiguration
\end{itemize*}
\item Hotfixes und Service Packs
\begin{itemize*}
\item Nur bestimmte Teile der Software werden aktualisiert
\item Meist nur Fehlerbehebung, keine neuen Features
\end{itemize*}
\item Upgrade
\begin{itemize*}
\item Erweitert eine Software deutlich um neue Funktionen
\end{itemize*}
\item Unbeaufsichtigte (automatische) Installation
\begin{description*}
\item[Erstinstallation]
\item[Software-Update] Aktualisierung der Software, Daten oder Konfiguration
\item[Hotfixes/Service Packs] Nur bestimmte Teile der Software werden aktualisiert; Meist nur Fehlerbehebung, keine neuen Features
\item[Upgrade] Erweitert eine Software deutlich um neue Funktionen
\item[Unbeaufsichtigte (automatische)] Installation
\begin{itemize*}
\item Installation erfolgt ohne Benutzereingriff
\item Periodisch, durch Aufruf des Anwenders, beim Programmstart
\item Einstellungen in einem Skript festgelegt oder werden als Parameter übergeben
\end{itemize*}
\end{itemize*}
Installationshilfsmittel
\begin{itemize*}
\item Installationsprogramm (Installer)
\begin{itemize*}
\item Windows: Windows Installer, InstallShield
\item Linux: RPM, Port, APT
\item MAC-OS: Installer, WarpIn
\end{itemize*}
\item Installations-Script
\item Installationsanweisung
\end{itemize*}
\end{description*}
Software-Rollout
\begin{itemize*}
\item Vorgang des Veröffentlichens und Verteilens von Softwareprodukten auf entsprechende Clients
\item Anzahl der Clients kann weit über 10.000 liegen!
\item Rollout abhängig von verschiedenen Kriterien (Vorherige Installation, Hardwarekonfiguration, Zeit, Kunde)
\item Vorgang des Veröffentlichens und Verteilens
\item Rollout abhängig von verschiedenen Kriterien
\item Rollout-Varianten
\begin{itemize*}
\item Zentral / Dezentral
\item Manuell (Benutzer löst Installation aus)
\item Automatisiert (ohne Benutzerinteraktion)
\end{itemize*}
\end{itemize*}
Vollständige Verteilung (big bang)
\begin{itemize*}
\item Alle Installationen werden mit einem Mal installiert
\item Sehr hohes Risiko
\item Eventuelle Fehler führen zu vielen fehlerhaften Zuständen oder Störfällen - führt zu hohem Druck
\item Eventuelle Fehler müssen schnell gelöst werden (Provisorium)
\item Sehr kurze Einführungsphase
\item Rollback-Mechanismus sehr empfohlen
\end{itemize*}
Rollback
\begin{itemize*}
\item Wiederherstellung des Ursprungszustands
\item Technische Realisierung muss ermöglicht werden
\end{itemize*}
Pilotierte Einführung
\begin{itemize*}
\item Einführung für wenige ausgewählte Installationen
\item Sehr hohe Sicherheit
\item Festlegung der späteren Rollout-Schritte
\item Benötigt zusätzliche Zeit
\item Geringere Auftrittswahrscheinlichkeit von Fehlern
\end{itemize*}
Schrittweise (iterative) Einführung
\begin{itemize*}
\item Einführung erfolgt schrittweise mit einer definierten Anzahl
\item von Installationen (Rampe - ramp-up)
\item Höhere Fehlerwahrscheinlichkeit $\rightarrow$ Bessere Reproduzierbarkeit $\rightarrow$ schnelleres Finden von Fehlern $\rightarrow$ Erfahrungsgewinn
\item Begrenztes Risiko, mittlerer Zeitaufwand
\item Verteilungsarten
\begin{description}
\item[Vollständige Verteilung] (big bang) Alle Installationen werden mit einem Mal installiert (Sehr hohes Risiko)
\item[Rollback] Wiederherstellung des Ursprungszustands
\item[Pilot] Einführung für wenige ausgewählte Installationen (Sehr hohe Sicherheit)
\item[Iterativ (schrittweise)] mit definierten Anzahl von Installationen bessere Reproduzierbarkeit
\end{description}
\end{itemize*}
\newpage