23.11.2012 Aufrufe

Testen, Testmanagement, Unit-Tests - beim Fachbereich Informatik ...

Testen, Testmanagement, Unit-Tests - beim Fachbereich Informatik ...

Testen, Testmanagement, Unit-Tests - beim Fachbereich Informatik ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 &registry =<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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!