Testen, Testmanagement, Unit-Tests - beim Fachbereich Informatik ...
Testen, Testmanagement, Unit-Tests - beim Fachbereich Informatik ...
Testen, Testmanagement, Unit-Tests - beim Fachbereich Informatik ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Vorlesung „Software Engineering“<br />
Kapitel 3 <strong>Testmanagement</strong> und J<strong>Unit</strong><br />
Version 1.0<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
3.1 Software-Entwicklungsumgebungen<br />
3.2 Prototyping<br />
3.3 <strong>Testmanagement</strong><br />
3.4 <strong>Unit</strong>-<strong>Tests</strong>: J<strong>Unit</strong>, Cpp<strong>Unit</strong><br />
h_da<br />
Ohne Werkzeuge kann kein Softwaresystem entwickelt werden!<br />
Und gute Test-Werkzeuge und –Verfahren sind ein integraler Bestandteil<br />
jedes erfolgreichen Projektes!<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Motivation<br />
Die Entwicklung von Software erfordert den Einsatz unterschiedlichster<br />
Werkzeuge. Je nach Anwendungstyp können wenige oder viele (> 10)<br />
Werkzeuge verwendet werden, z. B.<br />
- CASE-Werkzeuge (UML-Modelle) und Generatoren<br />
- IDE mit Editor, Compiler (Übersetzer) und Binder (Linker)<br />
- Debugger und Testwerkzeuge<br />
- Werkzeuge für Konfigurations- und Versionsmanagement<br />
- Werkzeuge für ER-Modellierung, DBMS, Data Dictionaries und Repositories<br />
- Spezielle Editoren: Grafikeditor (Bildbearbeitung), XML-Editor<br />
- Application Server (für verteilte Systeme)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Begriff SEU<br />
Eine Software-Entwicklungsumgebung (SEU) legt fest, mit welchen Werkzeugen<br />
gearbeitet werden soll und wie diese zusammenspielen (sollen).<br />
Leider gibt es keine "ideale SEU", die für alle Projekte passt und manchmal<br />
erfolgt eine "Umnutzung" von Werkzeugen (z. B. bei methodenfremden<br />
Werkzeugen).<br />
Oft müssen auch spezielle Tools (z. B. "Bridges") im Rahmen eines Projektes<br />
entwickelt werden, um den Werkzeugeinsatz zu verbessern oder erst zu<br />
ermöglichen. Beispielsweise ist dies notwendig, wenn wichtige Informationen in<br />
einer Form vorliegen, die sonst nicht direkt genutzt werden kann. Ein weiterer<br />
wichtiger Grund kann die Verbesserung der Qualität einzelner Artefakte sein.<br />
Gute Werkzeuge helfen die Qualität der Software zu verbessern und gleichzeitig<br />
auch die Produktivität zu steigern.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Vorgehen<br />
Am Anfang eines jeden Projektes steht die Auswahl/Festlegung der Plattform und<br />
der Programmiersprache(n). Idealerweise ergibt sich diese aus der Bewertung<br />
der Anforderungen.<br />
Oft werden aber schon aus "politischen Überlegungen" heraus, Festlegungen für<br />
Werkzeuge und SEUs getroffen.<br />
Werkzeuge, die eingesetzt werden sollen, müssen auch zu der Architektur des zu<br />
entwickelnden Systems und dem methodischen Vorgehen passen.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Vorgehen<br />
Die Beschaffung zentraler Entwicklungswerkzeuge sollte möglichst früh im<br />
Projekt (-> RUP: “Inception Phase/Environment Workflow“) erfolgen, damit die<br />
Entwicklungsumgebung rasch bereitgestellt werden kann.<br />
Falls notwendig, werden einzelne Werkzeuge untersucht und im Rahmen eines<br />
PoC (Proof-of-Concept) bewertet. Dies ist insbesondere dann notwendig, wenn<br />
die Preise sehr hoch sind (z. B. für ETL-Werkzeuge [Extraction, Transformation<br />
and Load] oder Portal-Software) sowie wenn Abhängigkeiten zu existierenden<br />
Umgebungen/Plattformen/Tools geklärt werden müssen.<br />
Nicht vergessen werden sollte, eventuell notwendige Schulungen, die sich<br />
idealerweise an den Projekt-Konventionen/Vorgaben orientieren.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Management von SEUs<br />
Die Konzeption, der Aufbau und Betrieb einer SEU für ein mittleres bis großes<br />
Projekt stellt oft selbst ein Teil-Projekt dar, mit all den Regeln (z. B.<br />
Teamaufgaben, Budget und Termine).<br />
Das SEU-Projekt beginnt (immer) am 1. Tag des Gesamtprojektes und sollte<br />
bereits eine Start-Infrastruktur (z. B. Dokumenten-Server) sowie einige Projekt-<br />
Regeln/Konventionen bereitstellen.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Entwicklungsrepositories<br />
Sofern absehbar ist, dass im Verlauf des Projektes viele Dokumente und weitere<br />
Artefakte entstehen werden, ist der Einsatz eines Entwicklungsrepositories zu<br />
prüfen.<br />
Dieses stellt neben den eingestellten Dokumenten auch konsistente<br />
Querverweise zu den verschiedenen Projekt-Artifakten bereit.<br />
Des weiteren dient es als "Single Point of Control" für Management-Aufgaben<br />
(z. B. Überwachung des Projektfortschrittes, Qualitätskontrolle)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.1 Software-Entwicklungsumgebungen<br />
Einsatz von Debugging-Werkzeugen<br />
Oft entstehen massive Projektprobleme <strong>beim</strong> Einsatz von "intelligenten"<br />
Generatoren.<br />
Das Problem besteht darin, dass durch umfangreiche Generierungen (z. B. bei<br />
Einsatz von SQL-Präprozessoren) nicht mehr der direkte Bezug zum Quelltext<br />
existiert bzw. nur schwer hergestellt werden kann und somit der Entwickler erst<br />
Erfahrungen bzgl. möglicher Fehlerquellen aufbauen muss.<br />
Test- und Debuggingwerkzeuge sollten daher sorgfältig in Bezug auf die<br />
eingesetzten Generatoren ausgewählt werden.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Agenda<br />
Kapitel 3 <strong>Testmanagement</strong> und J<strong>Unit</strong><br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
3.1 Software-Entwicklungsumgebungen<br />
3.2 Prototyping<br />
3.3 <strong>Testmanagement</strong><br />
3.4 <strong>Unit</strong>-<strong>Tests</strong>: J<strong>Unit</strong>, Cpp<strong>Unit</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.2 Software-Entwicklungsumgebungen<br />
Begriff<br />
Ein Software-Prototyp ist ein - mit wesentlich geringerem Aufwand als das<br />
geplante Produkt - hergestelltes System, das nicht alle Eigenschaften des<br />
Zielsystems besitzt aber zur Erprobung und Beurteilung einiger angestrebter<br />
Systemeigenschaften verwendet werden kann.<br />
Beispiel: Prototyp zur Entwicklung einer besonderen Oberfläche (GUI)<br />
- statischer Prototyp (Entwicklung einzelne Bildschirmmasken)<br />
- dynamischer Prototyp (Übergang zwischen Dialogen, evtl. Testdaten integriert)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.2 Software-Entwicklungsumgebungen<br />
Klassifikation von Prototypen<br />
Explorative Entwicklung<br />
- Gemeinsame Definition der benötigten Systemfunktionen durch Endanwender<br />
und Software-Ingenieure<br />
- Diskussion von verschiedenen Lösungsideen<br />
- Entwicklung von Prototypen, um Funktionen (und deren Änderbarkeit) zu testen<br />
- Es wird geprüft, ob das System im gegebenen organisatorischem Umfeld<br />
realisierbar ist. Es wird daher in erster Linie die Problemanalyse und<br />
Systemspezifikation unterstützt.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.2 Software-Entwicklungsumgebungen<br />
Werkzeugeinsatz<br />
- Für die Entwicklung von Prototyp-Systemen werden sog. Rapid Application<br />
Development (RAD)-Werkzeuge eingesetzt.<br />
- Diese sollen eine schnelle Realisierung ermöglichen<br />
Beispiel: Oberflächenprototyp<br />
- Entwicklung mit Visual Basic anstelle einer komplexen<br />
grafischen Bibliothek<br />
Es wird somit frühzeitig evaluiert, ob eine Benutzeroberfläche für die Zielgruppe<br />
einsetzbar ist.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.2 Software-Entwicklungsumgebungen<br />
Klassifikation von Prototypen<br />
Evolutionäre Entwicklung<br />
- Systementwicklung in mehreren Stufen<br />
- Vorgehen erfolgt gemäss Priorisierung der (unstrittigen) Benutzeranforderungen<br />
- Jede Stufe realisiert und integriert weitere Anforderungen abnehmender<br />
Priorität und ist somit in das Gesamtprojekt stark integriert. Die Grenze<br />
zwischen Prototyp und Zielsystem verschwimmen.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.2 Software-Entwicklungsumgebungen<br />
Klassifikation von Prototypen<br />
Experimentelle Entwicklung<br />
- Entwicklung eines schmalen Ausschnitts eines geplanten Systems als<br />
„Durchstich“ (z. B. substantieller vertikaler Prototyp durch alle Schichten)<br />
- Simulation/Untersuchung der Wechselwirkungen zwischen den<br />
Systemkomponenten und zentraler Schnittstellen (z. B. Kommunikation<br />
zwischen Mainframe und Unix-System)<br />
- Prüfung neuer Software (z. B. ETL-Werkzeug)<br />
Experimentelle Prototypen sind meist „Wegwerf-Prototyp“ und versuchen<br />
mögliche Projektrisiken möglichst früh (und nicht erst bei Entwicklung/Test)<br />
zu erkennen.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Agenda<br />
Kapitel 3 <strong>Testmanagement</strong> und J<strong>Unit</strong><br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
3.1 Software-Entwicklungsumgebungen<br />
3.2 Prototyping<br />
3.3 <strong>Testmanagement</strong><br />
3.4 <strong>Unit</strong>-<strong>Tests</strong>: J<strong>Unit</strong>, Cpp<strong>Unit</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Testen</strong><br />
Das <strong>Testen</strong> von Software gehört zu den wichtigsten (und oft auch ungeliebten)<br />
Tätigkeiten bei der Softwareerstellung.<br />
Eine SEU sollte sowohl die Dokumentation und Bewertung der Testfälle als auch<br />
die Wiederholbarkeit (Regressionstests, Lasttest, Testfallautomatisierung)<br />
unterstützen.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Überblick zu Testverfahren<br />
Dynamische <strong>Tests</strong>: Black-Box-Verfahren vs. White-Box-Verfahren<br />
Statische <strong>Tests</strong>: Code-Inspektion u. a.<br />
Verifikation : Nachweis der Korrektheit (mit formalen Methoden)<br />
Validierung : Überprüfung von Eigenschaften der Anwendung<br />
(-> wurde das richtige System entwickelt?)<br />
Debuggen : Fehlersuche<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess *) s. a. nachfolgende Folien<br />
Dynamisch<br />
- Planung<br />
- Entwurf<br />
- Review<br />
- Vorbereitung<br />
- Ausführung<br />
- Nachbereitung<br />
Statisch<br />
- Inspektion<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Planung<br />
- Festlegung der Testobjekte und Testziele<br />
- Wie soll getestet werden (Richtlinien und Standards)?<br />
Einsatz welcher Testverfahren?<br />
- Kriterien zur Beendigung des <strong>Testen</strong>s<br />
- Zeitplan (wann soll etwas getestet werden?)<br />
- Verantwortungsbereiche (Wer testet? Wer liefert was (z. B. Testdaten)?)<br />
- Testdokumentation / Testprotokoll<br />
- Testwerkzeuge, Testkonfiguration<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Entwurf<br />
- Festlegung der Testfälle, Testablaufpläne<br />
- Eingabeverfahren und -formate der Testdaten<br />
- Ausgabeverfahren und -formate der Testergebnisse<br />
- Evaluierung der Testumgebung und Werkzeuge, wie soll/kann getestet werden?<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Review<br />
Prüfung/Bewertung des geplanten Testverfahrens<br />
Review-Fragen, z. B.<br />
- Wurde <strong>beim</strong> Entwurf der Testfälle das jeweils richtige Testverfahren<br />
eingesetzt?<br />
- Sind ausreichend viele Testfällen definiert?<br />
- Was sind Voraussetzungen um erfolgreich zu testen?<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Code Coverage vs. Path Coverage<br />
100 % Code-Abdeckung:<br />
A && B<br />
!A && !B<br />
oder<br />
!A && B<br />
A && !B<br />
Linearer Aufwand<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
y<br />
y<br />
Condition A<br />
n<br />
Condition B<br />
n<br />
100 % Pfad-Abdeckung<br />
A && B<br />
!A && !B<br />
und<br />
!A && B<br />
A && !B<br />
Exponentieller Aufwand<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Vorbereitung<br />
- Vorbereitung der Systemkonfiguration, auf der getestet wird,<br />
Bereitstellung der Testobjekte und Generierung der Testdaten aus den<br />
Testfällen<br />
- Installation und Integration von Geräten, die Prozeßverhalten simulieren<br />
- Installation und Integration evtl. notwendiger Testwerkzeuge<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Ausführung<br />
- Testobjekt wird mit den Testdaten zur Ausführung gebracht<br />
- Testergebnisse werden protokolliert, dokumentiert und verwaltet<br />
Beispiele<br />
- <strong>Testen</strong> von Schnittstellen (Black-Box)<br />
- <strong>Testen</strong> von Komponenten (White-Box)<br />
- <strong>Testen</strong> des Zusammenspiels von Komponenten<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Black-Box-Test<br />
• Test der Schnittstelle einer Klasse ohne Betrachtung der Interna<br />
Eigenschaften des Black-Box-<strong>Tests</strong><br />
- dynamische <strong>Tests</strong><br />
- Aufwand für <strong>Tests</strong> liegt im vertretbaren Rahmen<br />
Wichtige Fragestellungen<br />
- Funktioniert der Schnittstellenaufruf?<br />
- Werden die korrekten Ergebnisse erstellt?<br />
- Werden alle Methoden vom Programm benutzt?<br />
- Welche Wirkung hat eine Methode auf andere Objekte?<br />
Achtung:<br />
ausschließliche Betrachtung der Ausgabedaten<br />
nicht ausreichend, auch Zustandsänderungen<br />
und Seiteneffekte überprüfen!<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Eingabedaten<br />
Black-Box<br />
Klasse<br />
Methode 2<br />
Methode 3<br />
Aktueller<br />
Zustand<br />
Methode 1<br />
Ausgabedaten<br />
Testauswertung<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
White-Box-Test<br />
� Test der Klasse mit Betrachtung der Interna<br />
� Test aller Methoden<br />
� Durchlauf aller möglichen Pfade (Testabdeckung)<br />
Eigenschaften des White-Box-<strong>Tests</strong><br />
- dynamische <strong>Tests</strong><br />
- großer Aufwand und hohe Komplexität<br />
Wichtige Fragestellungen<br />
- Welcher Testabdeckungsgrad soll erreicht werden?<br />
- Wie hoch ist der Testaufwand?<br />
- Können <strong>Tests</strong> automatisiert werden?<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Testabdeckungsgrade:<br />
C0 – Jede Anweisung wird min.<br />
einmal durchlaufen<br />
C1 – Jeder Zweig wird min.<br />
einmal durchlaufen.<br />
C2 – Jede Bedingung wird min.<br />
einmal verwendet.<br />
C3 – Jeder Zweig und jede<br />
Schleifengrenze wird<br />
min. einmal durchlaufen.<br />
C4 - ...<br />
Aufwand und Anzahl gefundener<br />
Fehler steigen<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Nachbereitung<br />
� Analyse und Vergleich der Testergebnisse mit den erwarteten Ergebnissen<br />
� Beschreibung, Analyse und Dokumentation der Fehler<br />
� Weiterleitung der Fehler an die Fehlerstatistik<br />
� Suche nach Ursachen für festgestellte Fehler im Testobjekt<br />
� Erstellung eines Auftrags zur Fehlerbehebung<br />
� Fehlerbehebung<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess *) s. a. nachfolgende Folien<br />
Dynamisch<br />
- Planung<br />
- Entwurf<br />
- Review<br />
- Vorbereitung<br />
- Ausführung<br />
- Nachbereitung<br />
Statisch<br />
- Inspektion<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion<br />
� Prüfung bzgl. korrekter Testausführung<br />
� Entwurfsinspektion („Dokumentenprüfung“), Dauer 1-2 Stunden<br />
- Entwerfer/Ersteller, Moderator, erfahrener Programmierer, 2-3 weitere<br />
Teilnehmer<br />
(z. B. Programmierer, Wartungspersonal)<br />
- Fallweiser Abgleich der Anforderungsdefinition mit Entwurf<br />
- Kritische Stellen werden mit dem Entwerfer/Ersteller diskutiert<br />
- Protokollierung der entdeckten Fehler und Schwachstellen<br />
- spätere Durchführung der Fehlerkorrekturen (nach Sitzung)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion (Beispiel für Abnahme-Workshop) – 1(2)<br />
Begrüßung � Moderator gibt Einführung über Ziele und Inhalt an die<br />
Teilnehmer des Workshops<br />
Vorgehen/Methodik � Zusammenfassung der Zielsetzung und<br />
Aufgabenstellung<br />
� Darstellung des Vorgehens bei Inspektion zur Erzielung<br />
der geforderten Ergebnisse<br />
� Erläuterung des Teams, das Dokument erstellt hat<br />
� Erklärung des Vorgehens für die Abnahme<br />
Ergebnisse<br />
(inhaltlich präzisiert)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
� Übersicht der Ergebnistypen<br />
� Erläuterung der Einzelergebnisse anhand geeigneter<br />
(visueller) Darstellungen<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion (Beispiel für Abnahme-Workshop) – 2(2)<br />
Abgrenzung /<br />
Prämissen<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
� Aufzeigen der wichtigsten Annahmen und ggfs. deren<br />
Konsequenzen<br />
� Darstellung von nicht berücksichtigten Aspekten<br />
� Aufzählung der Schnittstellen zu anderen<br />
Ergebnistypen und deren (Nicht-)Berücksichtigung<br />
Mängelfeststellung � Aufnahme von Mängeln und Feststellung der Schwere<br />
Ende des WS � Feststellung der Abnahme (ggfs. mit Auftrag die<br />
Mängeln nachzubessern)<br />
Weitere Aktivitäten � Statusverfolgung der Mängel und Anmerkungen<br />
� Ablage und Versionierung des Dokumentes<br />
(„Meilensteinverzeichnis“) nach erfolgter Korrektur<br />
ohne Mängelliste<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion (Beispiel für Abnahme-Workshop)<br />
- Die Dokumentation der Anmerkungen und Mängel aus der Qualitäts-<br />
sicherung erfolgt in dem jeweiligen Ergebnisdokument in einer vorgegebenen<br />
Erfassungstabelle.<br />
- Dort wird auch die Priorisierung und Folgeaktivitäten (Maßnahmen,<br />
Verantwortliche, Terminierung) dokumentiert.<br />
- Aufbau der Erfassungstabelle<br />
Nr./Referenz, Datum, Mangel, Prio (hoch, mittel, niedrig),<br />
Verantwortlicher, Termin, Status (in Klärung, erledigt, abgelehnt)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion<br />
Codeinspektion („Softwareprüfung“), Dauer 1-2 Stunden<br />
- Programmierer des Produkts, Moderator, <strong>Tests</strong>pezialist, Entwerfer<br />
- Verteilung der Programmliste sowie Entwurfsspezifikation an Sitzungsteilnehmer<br />
- Programmierer erläutert Programmlogik Schritt für Schritt<br />
- Kritische Fälle werden durchgespielt<br />
- Analyse des Codes anhand einer Checkliste der häufigsten Fehler<br />
- Protokollierung der Fehler aber keine Korrektur (nach Sitzung)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion<br />
Codeinspektion („Softwareprüfung“) - Checkliste<br />
- Variablenbenutzung<br />
z. B. korrekte Initialisierung, Indexgrenzen von Arrays, Verwendung von<br />
Pointern, Anzahl und Typ von Argumenten bei Unterprogrammen<br />
(Funktionen, Moduln, APIs)<br />
- Variablenvereinbarung<br />
z. B. Deklaration aller notwendigen Variablen, Bennenung von Variablen<br />
(Einhaltung der Namenskonventionen, ähnliche Variablennamen),<br />
Vereinbarung von globalen Variablen an richtiger Stelle<br />
- Berechnungen<br />
z. B. Über-/Unterlauf bei Zwischenergebnissen, Division durch Null,<br />
Prioritäten bei Operationen<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Testprozess Inspektion<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Welche Checks werden vom Compiler durchgeführt<br />
und welche können andersweitig automatisiert werden?<br />
Codeinspektion („Softwareprüfung“) - Checkliste<br />
- Vergleiche<br />
z. B. Verträglichkeit bei unterschiedlichen Datentypen, korrekte<br />
Verwendung von boolschen Ausdrücken<br />
- Programmablauf<br />
z. B. Schleifen, Erfüllung von Eingangsbedingungen, Berücksichtung<br />
aller Fälle<br />
- Schnittstellen<br />
z. B. Parameter, globale Variablen<br />
- Dateiein-/ausgabe<br />
z. B. Dateiende, Satzzugriff<br />
- Weitere Prüfungen<br />
z. B. Nicht verwendete Variablem, Warnmeldungen <strong>beim</strong> Compilieren<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen<br />
� Modultest<br />
� Integrationstest / Subsystemtest<br />
� Systemtest<br />
� Abnahmetest<br />
� Installationstest<br />
� Usability Test<br />
� Regressionstest<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Modultest<br />
� <strong>Testen</strong> kleiner / elementarer Programmeinheiten<br />
� Module auf gleicher Ebene können gleichzeitig getestet werden<br />
� Simulation der Testumgebung z. B. durch Treiber oder weiterer Werkzeuge<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Integrationstest / Subsystemtest<br />
� Montage von elementaren Testobjekten zu größeren Einheiten<br />
und <strong>Testen</strong> dieser Einheiten<br />
� Testet Schnittstellen und Zusammenspiel von Modulen<br />
� Vorgehensweisen <strong>beim</strong> Integrationstest („<strong>Tests</strong>trategie“):<br />
> inkrementell, top down, funktionsorientiert, ...<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Systemtest<br />
� <strong>Testen</strong> des Systems als Ganzes im Hinblick auf verschiedene<br />
Qualitätsmerkmale:<br />
> Vollständigkeit<br />
> Leistung<br />
> Volumen<br />
> Stresstest / Lasttest<br />
> Sicherheit<br />
> Benutzerfreundlichkeit<br />
> Dokumentation<br />
> Kompatibilität<br />
> ...<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Abnahmetest<br />
� <strong>Testen</strong> des Systems durch den Auftraggeber<br />
� im Idealfall sind bereits im Vertrag Abnahmekriterien festgelegt<br />
� Versuch, nachzuweisen, daß die Anforderungen nicht erfüllt sind<br />
� Protokolle der vom Auftragnehmer durchgeführten <strong>Tests</strong> sind hilfreich<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Installationstest<br />
� Wird nach der Installation des Systems auf der Zielplattform durchgeführt<br />
� Ziel: Aufdecken von Installationsfehlern<br />
> Installation des vollständigen Systems<br />
> Vollständigkeit der benötigten Hardware<br />
> Verbindung zu anderen Programmen<br />
> Einstellung der Parameter, der Systemoptionen<br />
> ...<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Usability Test<br />
� Prüfen, ob Benutzung des Systems durch Anwender effizient erfolgt<br />
(Benutzerfreundlichkeit und Akzeptanz)<br />
� Durchführung von typischen Aufgabenszenarien durch Benutzer<br />
� Aufzeichnung der Reaktionen<br />
==> Optimierung des SW-Systems<br />
Durchführung (6 Schritte)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Usability Test<br />
1. Produkt Analyse<br />
Zuerst wird die zu testende Software zur Vorbereitung analysiert und auf evtl.<br />
Usability Schwachstellen hin überprüft.<br />
2. Pre-Test & Vorbereitung<br />
Während der Vorbereitungsphase werden die Ziele des Usability Testes<br />
gemeinsam mit dem Auftraggeber vereinbart. Die Verhaltensbeobachtungssoftware<br />
sollte für jeden Usability Test individuell auf die Bedürfnisse und<br />
Ziele des Testes konfiguriert werden.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Usability Test<br />
3. Durchführung des <strong>Tests</strong> (Beispiel)<br />
Für die Zeitdauer der Testdurchführung befindet sich der Anwender alleine und<br />
ungestört im Testraum. Dieser ist vom Beobachtungsraum durch einen<br />
sogenannten "one-way-mirror" getrennt. Der Anwender sieht so die<br />
Beobachter während des Testes nicht und kann so ungestört die<br />
vorgegebenen Aufgabenstellungen durcharbeiten. Der Anwender und der<br />
Testverantwortliche kommunizieren während der Testphase über Mikrophon.<br />
Der Anwender führt eine Aufgabe nach der anderen aus. Während dieser Zeit<br />
wird er vom Testverantwortlichen, dem Protokollführer und anderen im<br />
Beobachtungsraum anwesenden Personen beobachtet. Der Anwender wird<br />
gebeten, während des Testes "laut zu denken" und seinen Emotionen so gut<br />
wie möglich freien Lauf zu lassen.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Usability Test<br />
4. Debriefing<br />
Unmittelbar nach dem Test wird der Anwender durch den Testverantwortlichen<br />
im Test Raum interviewt, um zusätzliche Kommentare oder Bemerkungen des<br />
Anwenders festzuhalten (-> Videoaufzeichnung).<br />
5. Test Analyse & Auswertung<br />
Nach Durchführung aller <strong>Tests</strong>, werden die Testdaten analysiert und<br />
ausgewertet. Auf Wunsch werden die Highlights des <strong>Tests</strong> in einem Highlight-<br />
Clip zusammengestellt.<br />
6. Erstellung des Test-Berichtes<br />
Alle Test-Protokolle werden nochmals überprüft, die Video Sequenzen<br />
nochmals abgespielt. Alle Testresultate werden in einem Testbericht,<br />
zusammengefasst und evtl. dem Kunden präsentiert.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Usability Test<br />
Heuristische Evaluation<br />
Eine heuristische Evaluation ist eine Inspektionsmethode, d.h. ohne<br />
Testpersonen. Usability-Kriterien werden für eine heuristische Evaluation<br />
angewendet. Sie wird von Usability-Experten durchgeführt, die eine Liste von<br />
bewährten Usability-Prinzipien anwenden. Wird ein SW-Produkt von 3-5<br />
erfahrenen Experten begutachtet, können bis 90% der Usability Probleme<br />
gefunden werden.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Usability Test<br />
Cognitive Walkthrough<br />
Ein Cognitive Walkthrough ist eine aufgabenorientierte Usability<br />
Inspektionsmethode, d.h. ohne Testpersonen. Der Usability-Experte erkundet die<br />
Funktionalitäten im Interesse eines imaginären Benutzeres. Dabei geht er davon<br />
aus, dass der Kunde das SW-System erkundet und den Weg des geringsten<br />
kognitiven Aufwands gehen wird. Der Usability Experte legt deshalb Wert auf<br />
gute Erlernbarkeit der Software und ermittelt für jede mögliche Aktion den<br />
voraussichtlichen kognitiven Aufwand.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Regressionstest<br />
� Einsatz bei der inkrementellen Softwareentwicklung und in der Wartungsphase<br />
� Änderungen an existierenden Klassen können korrektiv (Spezifikation verletzt),<br />
inkrementell (Spezifikation erweitert), adaptiv (Spezifikation geändert) oder<br />
optimierend (Spezifikation unverändert) sein.<br />
� In keinem Fall darf hierbei eine Regression auftreten, d.h., die geänderten<br />
Klassen müssen weiterhin (den unveränderten Teilen) der Spezifikation<br />
genügen.<br />
� Bei jeder neuen Softwareversion müssen die Original-<strong>Tests</strong> wiederholt werden,<br />
um sicherzustellen, daß Modifikationen das gewünschte Ergebnis bringen und<br />
keine unerwünschten Nebeneffekte aufgetreten sind.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
<strong>Tests</strong>tufen Regressionstest<br />
Bei Regressionstest treten zwei grundlegende Probleme auf:<br />
� Änderungsanalyse (change impact analysis)<br />
zur Bestimmung der Regressionsmenge, d.h. der von einer Änderung<br />
möglicherweise betroffenen und somit neu zu testenden Teile des<br />
Anwendungssystems<br />
� Testfallauswahl (selective regression testing)<br />
die Bestimmung aller im Regressionstest erneut auszuführenden Testfälle.<br />
Dies ist notwendig, da aus Zeitgründen nach jeder Iteration nicht alle <strong>Tests</strong><br />
erneut durchgeführt werden können. Eine sichere Testfallauswahl muss hierbei<br />
alle Testfälle berücksichtigen, deren Ausführung Fehler im modifizierten<br />
Anwendungssystem aufdecken können.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
QS-Kosten<br />
� ca. 50% der Entwicklungszeit (= 50% der Entwicklungskosten),<br />
alle QS-Maßnahmen: 30-90%, nur Test: 10-25%)<br />
� Der Aufwand für die Überarbeitung bereits erstellter Arbeitsschritte beträgt ca.<br />
30-40% der Entwicklungszeit. Diese Zeit unterteilt sich in etwa wie folgt:<br />
> 30-50%: Testfallermittlung<br />
> 20-40%: Testdaten- und Testprozedurenerstellung<br />
> 20-50%: Testdurchführung<br />
bzw.<br />
> Testvorbereitung ca. 60 - 80 %<br />
> Testdurchführung und Testauswertung ca. 20 - 40 %<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.3 <strong>Testmanagement</strong><br />
Anforderungen der ISO 9001 an die Qualitätssicherung (Auswahl)<br />
Der Lieferant muß ...<br />
� für Prüftätigkeiten Verfahrensanweisungen erstellen<br />
� ein Produkt, wie im QM-Plan / in Verfahrensanweisungen gefordert, prüfen<br />
� ein Produkt zurückhalten, bis<br />
� die geforderten Prüfungen abgeschlossen sind und<br />
� die Ergebnisse die Qualitätsanforderungen erfüllen sowie<br />
� die zugehörigen Daten und Dokumente verfügbar und genehmigt sind<br />
� Aufzeichnungen einführen, die für den Nachweis sorgen, dass das Produkt<br />
geprüft worden ist<br />
� Sofern das Produkt die Annahmekritierien nicht erfüllt, müssen die<br />
Verfahren für die Lenkung fehlerhafter Produkte angewendet werden<br />
(Quelle: DIN, EN, ISO /DIN EN ISO 9001 Aug. 94/)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Agenda<br />
Kapitel 3 <strong>Testmanagement</strong> und J<strong>Unit</strong><br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
3.1 Software-Entwicklungsumgebungen<br />
3.2 Prototyping<br />
3.3 <strong>Testmanagement</strong><br />
3.4 <strong>Unit</strong>-<strong>Tests</strong>: J<strong>Unit</strong>, Cpp<strong>Unit</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
Überblick UNIT-<strong>Tests</strong><br />
- Seitdem Extreme Programming (XP) und agile Methoden mehr Beachtung<br />
erhalten haben, ist die Durchführung von <strong>Tests</strong> (insbesondere Akzeptanz- und<br />
<strong>Unit</strong>-<strong>Tests</strong>) zu einer zentralen Tätigkeit geworden<br />
- Ein Test kann unterschiedliche Arten von <strong>Unit</strong>s umfassen (z. B. Methode,<br />
Klasse, Software-Paket, Sub-System)<br />
- Ein Test-Framework kann das Überprüfen der <strong>Unit</strong>s vereinfachen/<br />
systematisieren und ermöglicht insbesondere die Automatisierung der <strong>Tests</strong><br />
- Es exitieren Test-Frameworks für verschiedene Programmiersprachen, z. B.<br />
J<strong>Unit</strong>, cpp<strong>Unit</strong><br />
Grundprinzipien<br />
- Erst denken, dann coden.<br />
- Erst testen (!) dann coden.<br />
=> Test a little, write a little, test a little, write a little.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
Testgetriebene Softwareentwicklung – Test-First-Programmierung<br />
Kent Beck beschreibt diesen Ansatz mit zwei einfachen Regeln:<br />
- Schreibe nur dann neuen Code, wenn ein automatisierter Test fehlschlägt<br />
- Eliminiere Duplikation<br />
Dies bedeutet in der Praxis:<br />
1. Schreibe einen Test, der zunächst fehlschlagen sollte. Schreibe gerade<br />
so viel Code, dass der Test kompiliert.<br />
2. Schreibe gerade so viel Code, dass alle <strong>Tests</strong> – inklusive des neuen <strong>Tests</strong> –<br />
laufen.<br />
3. Eliminiere Duplikation und andere Code-Probleme.<br />
Dieser Zyklus wird auch unter dem Slogan „Test! Code! Refactor!“ zusammengefasst.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
Was ist J<strong>Unit</strong>?<br />
- Test-Framework zum Test von Java-Anwendungen<br />
(J<strong>Unit</strong> bietet Klassen an, um geschriebenen Java-Quelltext leicht zu prüfen)<br />
- J<strong>Unit</strong> verlangt während der <strong>Tests</strong> keine Benutzerinteraktion und ermöglicht so<br />
die Automatisierung der <strong>Tests</strong><br />
- Bei der Nutzung von J<strong>Unit</strong> (und anderen Test-Frameworks) geht es um die<br />
Erstellung von leistungsfähigen Test-Treibern (zum <strong>Testen</strong> von Methoden<br />
[Design by Contract], von Klassen [CUT – Class under Test] und der Interaktion<br />
zwischen zwei oder mehreren Objekten)<br />
- Die Sprache zur <strong>Tests</strong>pezifikation ist die gleiche wie bei der Programmierung<br />
der Anwendung, der Testcode wird aber vom Anwendungscode strikt getrennt<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
TestCase und TestSuite<br />
Durch das gemeinsame Interface Test ist es möglich, <strong>Tests</strong> von TestSuiten und<br />
von TestCases durchzuführen. Hierdurch ist mit einem einzelnem Aufruf das<br />
<strong>Testen</strong> von ganzen Paketen möglich.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
Testablauf<br />
- Jeder Test wird grundsätzlich gekapselt:<br />
+ vor jedem Test werden die Werte mit setUp() initialisiert<br />
+ mit runTest() der Test durchgeführt und<br />
+ mit tearDown() aufgeräumt.<br />
(jeder Aufruf der drei Routinen ist durch try-catch-Blöcke gekapselt)<br />
Assert<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
TestCase TestSuite<br />
EigenerTest<br />
<br />
Test<br />
*<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
J<strong>Unit</strong> Assertions<br />
assertTrue(boolean condition)<br />
assertFalse(boolean condition)<br />
assertEquals(Object expected, Object actual)<br />
assertSame(Object expected, Object actual)<br />
assertNotSame(Object expected, Object actual)<br />
assertEquals(float expected, float actual, float tolerance)<br />
assertNull(Object o)<br />
assertNotNull(Object o)<br />
fail(String message)<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
J<strong>Unit</strong> Beispiel<br />
package fbi.Junit;<br />
public class Student {<br />
private String name;<br />
private int studentID;<br />
}<br />
public Student(String first,<br />
String last, int id){<br />
this.name = last;<br />
this.studentID = id;<br />
}<br />
public String getName(){<br />
return this.name;<br />
}<br />
public int getID(){<br />
return this.studentID;<br />
}<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
package fbi.Junit;<br />
import junit.framework.TestCase;<br />
public class TestStudent extends TestCase{<br />
private Student student_1;<br />
protected void setUp(){<br />
student_1 = new Student("Peter", "Parker",<br />
10500015);<br />
}<br />
}<br />
public void testID(){<br />
assertEquals(student_1.getID(),10500015);<br />
}<br />
public void testNames(){<br />
assertSame(student_1.getName(), "Parker");<br />
}<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 J<strong>Unit</strong><br />
J<strong>Unit</strong> Testlauf<br />
Aufruf mittels “TestRunner” (textuelle oder grafische Schnittstelle)<br />
-> java junit.swingui.TestRunner fbi.Junit.TestStudent<br />
fbi.Junit.TestStudent<br />
fbi.Junit.TestStudent<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
J<strong>Unit</strong> Report<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Cpp<strong>Unit</strong> (http://sourceforge.net/projects/cppunit)<br />
Cpp<strong>Unit</strong> ist ein in Anlehnung an J<strong>Unit</strong> entwickeltes Werkzeug zur<br />
Entwicklung von automatisierten <strong>Unit</strong>-<strong>Tests</strong> für C++ im Rahmen eines<br />
testgetriebenen Entwicklungsansatzes (test driven development, test first<br />
development).<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
<strong>Unit</strong>-<strong>Tests</strong><br />
Ein <strong>Unit</strong>-Test ist eine Methode in einer Testklasse und bezieht sich in der<br />
Regel immer auf eine korrespondierende Klasse, deren Verhalten getestet<br />
wird.<br />
- Ein solcher Test interagiert dabei mit einer Instanz der zu testenden Klasse<br />
über deren öffentliche (public) Methoden.<br />
- Gegebenenfalls nimmt der Test Instanzen anderer Klassen zu Hilfe. Diese<br />
müssen bevor der Test beginnt in einer Testvorrichtung (test fixture)<br />
bereitgestellt werden.<br />
- Anschließend versichert (assert) sich der Test, ob das Verhalten richtig war. Es<br />
gibt hier nur zwei Möglichkeiten: ja oder nein. Dementsprechend war der Test<br />
erfolgreich oder schlug fehl.<br />
- Jeder Test ist für sich abgeschlossen und untersucht einen bestimmten<br />
Teilaspekt der zu testenden Klasse. <strong>Unit</strong>-<strong>Tests</strong> müssen so konstruiert sein,<br />
dass sie in einer beliebigen Reihenfolge ausgeführt werden können.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel<br />
In einer Bibliotheksanwendung sollen Bücher verwaltet werden.<br />
- Jedes Buch hat einen Titel und einen Autor.<br />
- Diese beiden Attribute werden im Konstruktor gesetzt und man soll mit<br />
Getter-Methoden darauf zugreifen können.<br />
class Book {<br />
public:<br />
Book(const string& title, const string& author);<br />
string& getTitle();<br />
string& getAuthor();<br />
private:<br />
string title;<br />
};<br />
string author;<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel<br />
Die <strong>Unit</strong>-<strong>Tests</strong> für die Klasse Book werden in einer eigenen Klasse<br />
BookTest definiert und implementiert.<br />
Beispiele für <strong>Tests</strong>:<br />
- Es gibt einen Test, der prüft, ob ein getTitle() den korrekten Titel<br />
zurückliefert.<br />
- Es gibt einen weiteren Test, der prüft, ob getAuthor() den korrekten Autor<br />
zurückliefert.<br />
“If I had one test broken, I wanted one problem. If I had two tests<br />
broken,<br />
wanted two problems.”<br />
Quelle: K. Beck „Test-Driven Development“, Addison-Wesley, 2003<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Definition der Testklasse (BookTest.h)<br />
Die Klasse BookTest ist von TestFixture abgeleitet. Wir definieren die <strong>Tests</strong><br />
unter Zuhilfenahme von vorgefertigten Macros. Hierzu muss die Datei<br />
HelperMacros.h inkludiert werden.<br />
#include <br />
#include <br />
#include "Book.h"<br />
using namespace std;<br />
class BookTest : public CPPUNIT_NS :: TestFixture<br />
{<br />
// hier geht es auf der nächsten Folie weiter<br />
};<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Definition der Testklasse (BookTest.h)<br />
Die Definition der <strong>Tests</strong> beginnt mit dem Makro CPPUNIT_TEST_SUITE und<br />
endet mit dem Makro CPPUNIT_TEST_SUITE_END.<br />
- Dem Makro CPPUNIT_TEST_SUITE muss der Name der Testklasse, hier also BookTest<br />
übergeben werden.<br />
- Zwischen diesen beiden Makros werden die Namen der einzelnen Testmethoden mit dem<br />
Makro CPPUNIT_TEST definiert. Hier gibt es zwei Testmethoden, titleTest() und<br />
authorTest().<br />
CPPUNIT_TEST_SUITE(BookTest);<br />
CPPUNIT_TEST(titleTest);<br />
CPPUNIT_TEST(authorTest);<br />
CPPUNIT_TEST_SUITE_END();<br />
- Diese Makros erzeugen eine statische Methode suite(), welche die aufgezählten<br />
Testmethoden enthält.<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Definition der Testklasse (BookTest.h)<br />
Die beiden Methoden setUp() und tearDown() dienen dazu, eine<br />
Testvorrichtung auf- bzw. wieder abzubauen. In unserem Fall brauchen wir<br />
für die Testvorrichtung lediglich ein Buch und den dazugehörigen Titel und<br />
Autor. Des Weiteren sind die zwei Testmedoden titleTest() und authorTest()<br />
definiert.<br />
public:<br />
void setUp();<br />
void tearDown();<br />
void titleTest();<br />
void authorTest();<br />
private:<br />
string title;<br />
string author;<br />
Book *b;<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Implementation der Testklasse (BookTest.cpp)<br />
Damit eine Testklasse von dem Cpp<strong>Unit</strong> Framework auch gefunden wird,<br />
muss sie registriert werden. Hierzu gibt es ein Makro.<br />
CPPUNIT_TEST_SUITE_REGISTRATION(BookTest);<br />
Bei jedem Aufruf einer Testmethode wird zuerst setUp(), danach die eigentliche Testmethode und<br />
im Anschluss daran tearDown() aufgerufen. Somit wird jede Testmethode in einer eigenen,<br />
wohldefinierten Testvorrichtung ausgeführt.<br />
void BookTest :: setUp() {<br />
title = "Extreme Programming Explained";<br />
author = "Kent Beck";<br />
b = new Book(title, author);<br />
}<br />
void BookTest :: tearDown() {<br />
delete b;<br />
}<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Implementation der Testklasse (BookTest.cpp)<br />
In der Testmethode titleTest() wird überprüft, ob der mit getTitle()<br />
zurückgelieferte Titel tatsächlich dem vorher bekannten Titel entspricht.<br />
- Hierzu wird das Makro CPPUNIT_ASSERT_EQUAL verwendet, welches zwei Parameter<br />
besitzt. Der erste Parameter ist der zu erwartende Wert (expected value), und der zweite<br />
Parameter ist der tatsächliche Wert (actual value). Wenn beide Werte gleich sind, war der<br />
Test erfolgreich.<br />
- Mit CPPUNIT_ASSERT(Ausdruck) kann man einen beliebigen Ausdruck testen. Er muss<br />
wahr sein wenn der Test erfolgreich sein soll. Z. B.<br />
“CPPUNIT_ASSERT(kalk.squareRoot(9) == 3);“<br />
Weitere Zusicherungs-Makros sind in TestAssert.h definiert.<br />
void BookTest :: titleTest() {<br />
CPPUNIT_ASSERT_EQUAL(title, b->getTitle());<br />
}<br />
void BookTest :: authorTest() {<br />
CPPUNIT_ASSERT_EQUAL(author, b->getAuthor());<br />
}<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Das eigentliche Testprogramm (test.cpp)<br />
Damit die <strong>Tests</strong> gestartet werden können benötigt man einen TestRunner.<br />
- Es gibt verschiedene TestRunner für die Textkonsole und graphische Oberflächen.<br />
- Mit registry.makeTest() erhält man eine <strong>Tests</strong>uite mit allen registrierten <strong>Tests</strong>.<br />
#include <br />
#include <br />
using namespace std;<br />
main() {<br />
Cpp<strong>Unit</strong>::TestFactoryRegistry ®istry =<br />
Cpp<strong>Unit</strong>::TestFactoryRegistry::getRegistry();<br />
}<br />
Cpp<strong>Unit</strong>::TextUi::TestRunner runner;<br />
runner.addTest(registry.makeTest());<br />
bool rc = runner.run();<br />
return !rc;<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Cpp<strong>Unit</strong><br />
Beispiel: Praktikumsaufgabe 3, 4<br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Eclipse-Projekt<br />
„ShopWithCpp<strong>Unit</strong>“<br />
Hochschule Darmstadt<br />
University of Applied Sciences
Kapitel 3.4 Junit, Cpp<strong>Unit</strong><br />
Weitere Informationen / Links<br />
- Johannes Link, Softwaretests mit Junit, Techniken der testgetriebenen<br />
Entwicklung, dpunkt.verlag, 2005<br />
- Cpp<strong>Unit</strong>-Homepage: http://sourceforge.net/projects/cppunit<br />
- Cpp<strong>Unit</strong>-Tutorial:<br />
http://www.evocomp.de/tutorials/tutorium_cppunit/howto_tutorial_cppunit.html<br />
- Wikipedia – Cpp<strong>Unit</strong>:<br />
http://de.wikipedia.org/wiki/Cpp<strong>Unit</strong><br />
© Prof. Dr. Frank Bühler · Software Engineering · h_da - <strong>Fachbereich</strong> <strong>Informatik</strong><br />
Hochschule Darmstadt<br />
University of Applied Sciences