Humboldt-Universität zu Berlin

Größe: px
Ab Seite anzeigen:

Download "Humboldt-Universität zu Berlin"

Transkript

1 Humboldt-Universität zu Berlin Institut für Informatik Einführung von Unit Tests in das bestehende C++ Softwaresystem SUMO Diplomarbeit Matthias Heppner 27. Dezember 2009 Gutachter: Prof. Dr. Klaus Bothe Humboldt-Universität zu Berlin Dr. Michael Behrisch Deutsches Zentrum für Luft und Raumfahrt

2

3 INHALTSVERZEICHNIS Inhaltsverzeichnis 1 Einleitung Motivation Zielsetzung Aufbau der Arbeit Verwandte Arbeiten SUMO Einführung in SUMO Testverfahren in SUMO Unit Testing Warum Unit Tests schreiben? Unit Test Frameworks Testcase Assert Methoden Testfixture Testrunner Testsuite Testresult Test-Driven Development Refactoring Testkonzepte für Unit Tests Mock Objekte Testen von privaten Methoden Testen von Exceptions Ein Assert pro Testmethode Unit Test als Regressionstest Auswirkungen auf den Programmierstil Weitere Konzepte Unit Test Frameworks für C Warum existieren für C++ so viele Unit Test Frameworks? Übersicht der bekanntesten Frameworks Testkriterien Unit Test Frameworks CxxTest Boost Test Library TUT Unit i

4 INHALTSVERZEICHNIS CppUnit Google Test Fazit: Unit Test Framework Auswahl Auswahl der zu testenden Klassen Analyse der Klassenstruktur Analyse der Ausführungshäufigkeit Testfallspezifikation Funktionales Testen Äquivalenzklassentest Grenzwerttest Zufallstest Strukturelles Testen Anweisungsüberdeckung Zweigüberdeckung Pfadüberdeckung Boundary-interior Pfadtest Bedingungsüberdeckung C++ Code Coverage Tools GCov Automatische Testfallgenerierung Realisierung von Unit Tests Anlegen der Testklassenstruktur Erstellung von Unit Tests Testfälle erstellen und umsetzen Testen von Exception Testen mit Testfixtures Verwendung von Mock Objekten Refactoring Daily Build Auswertung Fazit über die Auswahl des Test Frameworks Auswertung der Einführung von Unit Tests in SUMO Zusammenfassung und Ausblick Zusammenfassung Ausblick A GoogleTest mit Visual Studio unter Windows verwenden 72 ii

5 INHALTSVERZEICHNIS B GoogleTest mit gcc unter Unix verwenden 72 C GProf 73 D Auflistung der Fehler 75 Literaturverzeichnis 76 iii

6

7 1 Einleitung 1.1 Motivation Das Testen von Software nimmt eine wichtige Position in der Softwareentwicklung ein. Dies gilt auch für das Softwaresystem SUMO[12] (Simulation of Urban MObility), welches deshalb um Unit Tests erweitert werden soll. SUMO ist ein Programm zur Simulation des Verkehrsflusses, dessen Komplexität und Umfang stetig zunimmt. Die Entwicklung begann im Jahr 2001, bis heute ist das Projekt mit allen Bibliotheken auf etwa 400 Klassen angewachsen und beinhaltet rund Codezeilen. Weil es sich bei SUMO um ein Open Source Projekt handelt, gibt es ein ständig wechselndes Entwicklungsteam, wodurch sich einige zusätzliche Probleme ergeben. So kommt es einerseits zu häufigen Programmänderungen und anderseits ist nicht jeder Programmierer mit allen Teilen von SUMO vertraut. Auf diese Weise treten schneller Programmierfehler auf als bei einem festen Entwicklungsteam. In SUMO existieren zwar schon ausführliche Akzeptanztests, die das System als Ganzes testen, aber das Einführen von Unit Tests auf der untersten Ebene erhöht zusätzlich die Sicherheit des Systems. Jeder Entwickler kann die bestehenden Unit Tests leicht erweitern, während das Anpassen der Akzeptanztests schwieriger ist. Die Unit Tests haben im Vergleich zu anderen Testverfahren einige Vorteile. Wird nach dem Prinzip des Test Driven Developments[1] entwickelt, werden zunächst Tests geschrieben, bevor der Programmcode entwickelt wird. Mithilfe von Unit Tests lassen sich somit schon während des Programmierens Fehler vermeiden. Falls Fehler auftreten und ein Unit Test fehlschlägt, lassen sich die möglichen Fehlerursachen schneller auffinden und ein zeitintensives Debuggen verhindern. 1.2 Zielsetzung Der Schwerpunkt dieser Diplomarbeit liegt in der Integration eines Unit Test Frameworks in das bestehende Softwaresystem SUMO. Hierfür muss als Erstes ein geeignetes Unit Test Framework aus einer Vielzahl von Frameworks ausgewählt werden. Um die Unit Test Frameworks miteinander vergleichen zu können, werden verschiedene Unit Testing Konzepte vorgestellt. Mithilfe des ausgewähltem Frameworks werden dann Unit Tests implementiert. Damit der Nutzen der Tests möglichst groß ist, muss zuvor entschieden werden, welche Klassen zuerst getestet werden sollen. Darüber hinaus ist vor allem die Wahl der Testfälle von Bedeutung, um eine Klasse vollständig zu testen. Es muss überprüft werden, ob sich das ausgewählte Framework in der Praxis bewährt hat. In diesem Zusammenhang wird der Frage nachgegangen, ob sich der Aufwand des nachträglichen Hinzufügens von Unit Tests in existierenden Programmcode lohnt. 1

8 1.3 Aufbau der Arbeit 1.3 Aufbau der Arbeit Die Arbeit ist im Wesentlichen in zwei Teile gegliedert. Der erste Teil beschäftigt sich mit der Auswahl eines Unit Test Frameworks, während es im zweiten Teil darum geht Konzepte zu erarbeiten, die für die zielgerichtete Umsetzung von Unit Tests in SUMO benötigt werden. Bevor ein Unit Test Framework ausgewählt werden kann, werden alle wichtigen Begriffe und Konzepte des Unit Testing beschrieben. Dazu gehört neben dem inneren Aufbau eines Frameworks auch die Beschreibung wie Unit Testing Konzepte in der Praxis angewandt werden. Im weiteren Verlauf der Arbeit wird ein C++ Unit Test Framework für SUMO ausgewählt. Für die Auswahl des Frameworks werden die sechs bekanntesten Tools analysiert, indem verschiedener Kriterien bewertet werden sowie ein kleines Beispielprogramm ihre Anwendung testet. Nachdem die Frameworks abschließend bewertet worden sind, wird eines von ihnen ausgewählt, mit dem die ersten Unit Tests entstehen können. Zuvor muss jedoch geklärt werden, welche Klassen getestet werden sollen und anhand welcher Kriterien die Testfälle auszuwählen sind. Für die Auswahl der Testklassen werden zwei Ansätze verfolgt. Einerseits wird die Struktur des Programms untersucht, d.h. es wird der Frage nachgegangen, welche Klassenabhängigkeiten untereinander bestehen. So ist es sinnvoll möglichst Klassen zu testen, die wenige bis keine Abhängigkeiten besitzen und sich erst danach Klassen mit mehreren Abhängigkeiten zuzuwenden. Andererseits wird die Ausführungshäufigkeit untersucht, die mithilfe eines Profilers berechnet wird, während SUMO eine Simulation durchläuft. Methoden und Klassen, die besonders häufig verwendet werden, sind entsprechend wichtig für SU- MO und sollten demnach ausführlich getestet sein. Im nächsten Schritt müssen geeignete Testfälle ausgewählt werden. Hierbei ist es wichtig, die Testfälle so zu wählen, dass eine Klasse vollständig überprüft wird. In diesem Zusammenhang werden sowohl funktionsorientierte wie auch strukturorientierte Tests näher betrachtet. Eine wichtige Rolle bei der Auswahl der funktionsorientierten Testfälle haben die Grenzwerttests, weil bei den Grenzwerten häufig Fehler auftreten. Um zu überprüfen, ob die Qualität der Tests ausreichend ist, werden verschiedene Überdeckungsgrade vorgestellt und ihre Vor- und Nachteile beschrieben. Darüber hinaus soll ein Tool ausgewählt werden, mit dem sich Überdeckungsgrade messen lassen und welches für SUMO geeignet ist. Im Anschluss werden dann einige Unit Test realisiert, die bisherigen Konzepte angewandt und an Beispielen demonstriert, bevor die Auswertung folgt. In der Auswertung wird darauf eingegangen, ob das ausgewählte Framework den Anforderungen gerecht geworden ist und es wird geklärt, ob der Aufwand des Einführens von Unit Tests in ein bestehendes Softwaresystem den Nutzen der Unit Tests rechtfertigt. 2

9 1.4 Verwandte Arbeiten 1.4 Verwandte Arbeiten Im Bereich des Unit Testing existiert eine Vielzahl von vorhandener Literatur. Allerdings gibt es speziell zu der Thematik, welche die Einführung von Unit Tests in bestehende Software beschreibt, nur sehr wenig verfügbare Literatur. In den verschiedenen Publikationen wird meistens nur der Zusammenhang von Unit Tests mit dem Test Driven Development (TDD) ausgeführt. Kent Beck [2] empfiehlt sogar, dass keine Unit Tests für bestehenden Code geschrieben werden sollten, weil der Zeitaufwand dafür zu groß ist. Dennoch lässt sich das Konzept der Unit Tests auf bestehende Software anwenden, auch wenn dabei das Vorgehen im Vergleich zum TDD leicht verändert ist. Johannes Link [3] gibt einen kurze Übersicht zu dieser Problematik, geht allerdings vor allem auf die Auswirkungen auf das Entwicklerteam und die zunächst veränderten Entwicklungsphasen ein. Er beschriebt kurz, wann es sinnvoll ist, neue Unit Tests zu schreiben und verweist darauf, dass es unnötig ist, alle Klasse vollständig zu testen, um eine ausreichende Basis an Tests zu schaffen. In der Diplomarbeit von Adrian Kuhn mit dem Thema Software-Qualitätssicherung für das PUA-Tool werden auch Unit Tests in das Softwaresystem PUA eingeführt. Allerdings liegt hier der Schwerpunkt mehr auf dem vollständige Testen der Software und der Beseitigung vorhandener Fehler. So wird weniger auf die Testfallbestimmung und der Problematik, in welchem Umfang und zu welchen Klassen Unit Tests sinnvoll sind, eingegangen. Auch entfällt in dieser Arbeit die Auswahl eines Test Frameworks, da das Programm in Java geschrieben ist und somit JUnit als Framework benutzt werden konnte. 3

10 2 SUMO 2.1 Einführung in SUMO SUMO (Simulation of Urban MObility) ist ein Open Source Projekt, welches am Institut für Verkehrssystemtechnik des DLR (Deutsches Zentrum für Luft- und Raumfahrt ev) entwickelt worden ist. Das Projekt entstand im Jahr 2001 und wird kontinuierlich weitergeführt, so dass bis heute mehr als 400 Klassen existieren, die rund Codezeilen beinhalten. Daneben sind auch eine große Anzahl von Dokumentationen entstanden, die SUMO von der Installation bis hin Benutzung beschreiben. Des weiteren wurden auch Publikationen veröffentlicht, die sich mit der Komplexität von Verkehrssimulationen befassen und die zeigen, dass es sich um ein aktuelles Forschungsgebiet handelt. Mithilfe von SUMO lassen sich komplexe Verkehrssimulationen durchführen, Straßennetze definieren und der Verkehrsfluss reproduzierbar analysieren. SUMO erlaubt die detailgenaue Modellierung des Straßenaufbaus und die Steuerung des Verkehrsdurchflusses, indem Fahrzeuge auf Routen durch das Straßennetz geschickt werden. Jedes Fahrzeug hat ein zugrundeliegendes Modell, so dass sich reale Situationen nachstellen lassen, wie beispielsweise ein Stau oder das Anfahren eines Fahrzeugs. So können ganze Stadtteile mit ihrem Verkehrsfluss nachgestellt werden. Für SUMO gibt es viele Anwendungsszenarien, die verdeutlichen, wie sich das Hinzufügen eines Fahrstreifens oder eine veränderte Ampelschaltung auf den Verkehr auswirken. In Abbildung 1 ist eine Beispielsimulation der Simulation-GUI (Graphical User Interface) von SUMO dargestellt. Bei der Entwicklung von SUMO wird besonders darauf geachtet, dass das Softwaresystem portabel bleibt. Alle verwendeten Programme müssen plattformunabhängig sein. So wird SUMO derzeit vor allem für Windows und Unix Plattformen entwickelt. Aus der Portabilität leitet sich auch eine wichtige Anforderung für das gesuchte Test Framework ab. In verschiedenen Projekten wurde SUMO bereits mit Erfolg verwendet. Ein Überblick über alle Projekte ist auf der Homepage von SUMO zu finden [12]. Darunter finden sich viele interessante Aufgabenstellungen, wie zum Beispiel die Vorhersage des Verkehrsaufkommens für den Weltjugendtag im Jahr 2005 oder für die FIFA Weltmeisterschaft Testverfahren in SUMO Bisher gibt es in SUMO eine Reihe von ausführlichen Akzeptanztests. Die Akzeptanztests werden mithilfe des Open Source Tools TextTest[13] durchgeführt, das die Ausgabe von SUMO mit einer vorher definierten Vergleichsdatei überprüft. Damit ist sichergestellt, dass sich SUMO nach einer Programmänderung weiterhin richtig 4

11 2.2 Testverfahren in SUMO Abbildung 1: Beispielsimulation einer Ampelkreuzung mit der Simulation-GUI verhält bzw. sich genauso verhält wie vor der Änderung. Allerdings birgt die Vergleichsdatei eine gewisse Fehlerquelle, da diese im Allgemeinen per Hand erstellt und überprüft wird. Im Fall von SUMO wurde die Vergleichsdatei aus der Ausgabe von SUMO generiert und enthält somit auch mögliche Programmfehler. Allerdings wird die Datei nochmal auf Fehler überprüft. Inzwischen existiert eine Vielzahl von Testszenarien für die Akzeptanztests, die SUMO ausführlich testen. Neben den Akzeptanztests existieren noch keine weiteren Testverfahren. Um das Programm trotzdem durch weitere mögliche Fehlerquellen abzusichern, ist das Einführen weiterer Testverfahren, wie dem Unit Testing, sinnvoll. 5

12 3 Unit Testing Dieses Kapitel gibt eine Einführung in den Themenkomplex des Unit Testing. Es wird dargestellt, warum das Schreiben von Unit Tests sinnvoll ist und warum das Konzept des Unit Testing angewandt werden sollte. Danach werden wichtige Begriffe sowie der prinzipielle Aufbau eines Unit Test Frameworks anhand von Beispielen erklärt. Für das Schreiben von Unit Tests werden verschiedene Konzepte benötigt, die vorgestellt, erläutert und in den weiteren Kapiteln angewandt werden. Darüber hinaus werden weitere Möglichkeiten für die Verwendung von Unit Tests, die in dieser Arbeit nur peripher behandelt werden können, am Ende des Kapitels vorgestellt. 3.1 Warum Unit Tests schreiben? Das Konzept hinter dem Unit Testing ist sehr einfach, so dass bereits das Schreiben eines Hello World Programms als Unit Test aufgefasst werden kann. Hierbei wird überprüft, ob die Programmiersprache korrekt installiert ist. Auch die Ausgabe von Variablen auf die Konsole mittels cout in C++ oder System.out.println in Java sind mit Unit Tests vergleichbar. Die ausgegebenen Werte werden mit denjenigen verglichen, die erwartet werden. Stimmen diese überein, ist der Test erfolgreich. Vielfach wird auch eine main Methode in einer Klasse implementiert, um diese zu testen. Dazu wird die Klasse erzeugt, verschiedene Methoden an dieser aufgerufen und die Ergebnisse zur Überprüfung wieder auf die Konsole ausgegeben. Die gerade aufgelisteten Beispiele von Testmöglichkeiten haben eine große Gemeinsamkeit, welche auch gleichzeitig ihr Nachteil ist. Nachdem eine Klasse oder eine Methode fertig gestellt ist, werden die Tests auskommentiert oder gelöscht, da sie nicht mit der eigentlichen Programmfunktionalität im Zusammenhang stehen. Die Ideen und die Zeit, die darin investiert wurden, gehen verloren. Viel besser wäre es, diese Ideen zu erhalten. Das Konzept des Unit Testing gibt dem ganzen einen Rahmen. Ohne großen Aufwand können die Tests aus den vorherigen Beispielen in eine weitere Klasse auslagert werden. In dieser werden alle Tests gesammelt und entsprechend strukturiert. Diese Klasse wird nicht wieder gelöscht und existiert parallel zur Klasse, welche sie testet. Alle enthaltenen Tests sind jederzeit aufrufbar und können somit das Verhalten wiederholbar überprüfen. Wenn Programmcode geändert wird, können die Tests sicherstellen, dass die vorherige Programmlogik immer noch funktioniert. Dies entspricht im Wesentlichen dem Grundkonzept des Unit Testing. Das Schreiben von Unit Tests ist somit wenig zeitaufwändig, effizient und vom hohen Nutzen. Langfristig entsteht durch Unit Testing auch ein besseres Design des Programmcodes, weil vorausschauend programmiert wird und erst nach dem Durchdenken der benötigte Funktionalität, diese implementiert wird. Sollten später Fehler auftreten, können die Fehlerstelle schneller lokalisiert werden und es wird weniger Zeit beim Debuggen verbracht. Daher ist es ratsam beim Erstellen von 6

13 3.2 Unit Test Frameworks neuem Code immer eine zugehörige Unit Test Klasse anzulegen. 3.2 Unit Test Frameworks Unit Test Frameworks sind Software Tools, die eine Grundfunktionalität bereitstellen, um Tests zu schreiben und auszuführen. Sie vereinheitlichen die Art wie Unit Tests aufgebaut sind und liefern aufbereitete Testergebnisse. So gut wie alle Unit Test Frameworks besitzen die gleichen Grundelemente. Dazu gehören der Testcase, die Testsuite, das Textfixture, der Testrunner, das Testresult und die Asserts. Wie diese Elemente zusammenhängen ist in Abbildung 2 (vgl. [7] S.31) zu sehen. Die Grundelemente werden in den nächsten Unterkapiteln vorgestellt, um zu verstehen, wie Unit Test Frameworks funktionieren. Test Assert Testfixture implementiert implementiert Testsuite führt aus werden hinzugefügt Testcase Testrunner sammelt Ergebnisse Testresult Abbildung 2: Klassen eines Unit Test Frameworks Der Aufbau in Abbildung 2 stammt im Wesentlichen aus dem Unit Test Framework JUnit[14], welches für Java entwickelt wurde. JUnit zählt zu dem ersten und bis heute wichtigstem Framework. Aufgrund seines Bekanntheitsgrades orientieren sich andere Frameworks an die Funktionalität von JUnit. Auch wenn Abweichungen bei dem Klassendiagramm festgestellt werden können oder der grundlegende Aufbau nicht immer identisch ist, finden sich die gleichen Grundelemente in jedem Framework wieder. Alle Beispiele, die in diesem Kapitel folgen, sind in einer Art C++ Pseudocode geschrieben und berücksichtigen keinen Framework spezifischen Programmcode. Weil der prinzipielle Aufbau bei allen Unit Test Frameworks identisch ist, lässt sich der Code auf die später vorgestellten Frameworks problemlos übertragen. 7

14 3.2 Unit Test Frameworks Testcase Die wichtigste Klasse in einem Unit Test Framework ist Testcase. Alle geschriebenen Testklassen werden von Testcase abgeleitet. Über Testcase wird bestimmt wie eine Testklasse und die einzelnen Test aufgebaut sein müssen. Einfache Tests können mithilfe von Testcase erstellt und ausgeführt werden, ohne zusätzliches Wissen über den Aufbau des Frameworks zu besitzen. Ein einfaches Beispiel sieht folgendermaßen aus: #i n c l u d e <Framework. h> #i n c l u d e <Framework Main Method. cpp> #i n c l u d e Quadrat. h void testumfang ( ) { Quadrat * quadrat = new Quadrat ( 2 ) ; a s s e r t E q u a l s ( ( 8, quadrat >getumfang ( ) ) ; Die Methode assertequals wird vom Framework ausgewertet. Eine Auflistung aller Assert-Methoden folgt im nächsten Abschnitt. Sobald ein Assert zu false ausgewertet wird, schlägt der Test fehl. Das Framework teilt dann mit, an welcher Stelle und warum der Test fehlgeschlagen ist. Wenn mehrere Tests in einer Klassen vorhanden sind, wird mit der Auswertung der anderen Tests fortgefahren. Alle Testmethoden sind voneinander unabhängig, so dass ein fehlgeschlagener Test keine anderen Test beeinflusst und die Reihenfolge der Ausführung der Tests keinen Unterschied in den Testergebnissen ausmacht Assert Methoden In jedem Framework wird eine Menge von Assert Methoden bereitgestellt. Die Auswahl ist meistens überschaubar und die Verwendung erfolgt intuitiv. Die wichtigsten Assert Methoden, die in allen Unit Test Frameworks vorhanden sind, werden in der folgenden Übersicht aufgelistet: 8 - asserttrue(boolean condition): Die Methode überprüft, ob die condition true ist. - assertfalse(boolean condition): Die Methode überprüft, ob die condition false ist. - assertequals(expected, actual): Die Methode überprüft, ob expected gleich actual ist. Sie sollte für verschiedene Typen gültig sein zum Beispiel Boolean, int oder String. - assertnull(object object): Die Methode überprüft, ob das Objekt gleich null ist.

15 3.2 Unit Test Frameworks - assertsame(object expected, Object actual): Die Methode überprüft, ob die Objekte gleich sind. - fail(): Der Test schlägt fehl. Mithilfe dieser wenigen Assert Methoden ist es möglich, ein Programm komplett zu testen. Um die Verwendung eines Frameworks noch einfacher zu gestalten, werden auch des öfteren weitere Assert Methoden zur Verfügung gestellt. Zum Beispiel eine Assert Methode, die direkt überprüft, ob Exceptions geworfen werden. Falls die Funktionalität eines Frameworks zu gering ist, können auch leicht eigene Assert Methoden gechrieben werden, die zum Beispiel zwei beliebige Objekte miteinander vergleichen: void a s s e r t E q u a l s ( Person * per1, Person * per2 ) { asserttrue ( strcmp ( per1 >getvorname ( ), per2 >getvorname ( ) ) && strcmp ( per1 >getnachname ( ), per2 >getnachname ( ) ) ) ; Testfixture Das Testfixture ist ein wichtiges Konzept der Unit Test Frameworks. Mithilfe eines Testfixtures wird ein definierter Zustand hergestellt. Dies kann das Laden einer Datenbank mit festgelegten Inhalt sein oder das Instanzieren eines Objektes. Das Konzept wird in Unit Test Frameworks durch eine Set-Up und eine Tear-Down Methode realisiert, die für jede Testklasse überschrieben werden können. Im Folgendem wird die Verwendung an einem Beispiel gezeigt. #i n c l u d e <Framework. h> #i n c l u d e <Framework Main Method. cpp> #i n c l u d e Quadrat. h private Quadrat * quadrat ; void setup ( ) { * quadrat = new Quadrat ( 2 ) ; void teardown ( ) { d e l e t e quadrat ; void testumfang ( ) { a s s e r t E q u a l s ( ( 8, quadrat >getumfang ( ) ) ; 9

16 3.2 Unit Test Frameworks void t e s t F l a e c h e ( ) { a s s e r t E q u a l s ( ( 4, quadrat >getflaeche ( ) ) ; Die Set-Up Methode erzeugt ein neues Objekt vom Typ Quadrat. Jeder Testmethode steht das Objekt aus der Set-Up Methode zur Verfügung. Die Set-Up Methode wird vor jedem Test aufgerufen und nachdem ein Test gelaufen ist, wird die Tear- Down Methode ausgeführt. In C++ empfiehlt es sich, in der Tear-Down Methode die Objekte wieder zu löschen, um den belegten Speicher freizugeben. Das Testfixture bietet einige Vorteile und sollte, wenn es sinnvoll ist, verwendet werden. In erster Linie reduziert es Codeduplikationen und macht dadurch die Testmethoden kürzer und verständlicher. Dennoch bleibt das Prinzip, dass alle Tests isoliert betrachtet werden können, erhalten. Auch wenn ein Test fehlschlägt, sichert das Testfixture, dass die Tear-Down Methode aufgerufen wird Testrunner Der Testrunner führt Tests aus und schreibt die Ergebnisse in das Testresult. Dabei erhält er als Argument eine Testklasse, die vom Typ Testcase oder Testsuite ist. Alle enthaltenen Testmethoden werden nacheinander ausgeführt. Die Frameworks erkennen auf unterschiedliche Weise die Testmethoden. In JUnit werden alle Methoden gesucht die mit test anfangen. Dies ist in Java mithilfe von Reflections einfach zu realisieren. Das Konzept der Reflections wird in C++ nicht unterstützt, darum ist es möglich, dass in C++ die Testmethoden nochmals einzeln registriert werden. Wie in spätereren Kapiteln beschrieben wird, gibt es aber auch C++ Frameworks, die automatisch Testmethoden erkennen. In vielen Frameworks existiert eine main Methode, die automatisch einen Testrunner initialisiert und startet. Vereinzelt kann es aber auch vorkommen, dass die main Methode noch programmiert werden muss. In beiden Fällen ist es möglich dem Testrunner mit verschiedenen Parametern aufzurufen. So kann über den Testrunner gesteuert werden, ob alle Testmethoden oder nur eine Teilmenge ausgeführt werden sollen oder in welchem Format das Testresult ausgegeben werden soll Testsuite Eine Testsuite wird benötigt, wenn mehrere Testklassen zusammengefasst werden sollen. Dem Testrunner kann neben einem Testcase auch eine Testsuite übergeben werden, so dass es möglich ist, mehrere Testklassen in einem Testlauf auszuführen. Über eine add Methode lassen sich neue Testklassen, welche das Interface Test implementieren, hinzufügen. Wie in Abbildung 2 dargestellt, sind dies Testcase und Testsuite. Auf diese Weise kann einer Testsuite wieder eine Testsuite hinzufügt wer- 10

17 3.3 Test-Driven Development den, so dass sich beliebige Hierarchien aus Testcases und Testsuites aufbauen lassen. Zusätzlich können aber auch nur einzelne Testmethoden aus einer Testklasse hinzufügt werden. Wie eine Testsuite aufgebaut werden kann, verdeutlicht folgender Programmcode. #i n c l u d e <Framework. h> #i n c l u d e <Framework Main Method. cpp> class GeometrischeFigurenTests : public TestSuite { public : Test s u i t e ( ) { TestSuite * s u i t e = new TestSuite ( ) ; s u i t e >addtest (new TestSuite ( QuadratTest ) ) ; s u i t e >addtest (new KreisTest ( testumfang ) ) ; return s u i t e ; Es ist hilfreich, wenn ein Unit Test Framework automatisch eine Testsuite aufbaut, die beispielsweise alle in einem Ordner befindlichen Testklassen enthält, so dass Arbeitsaufwand eingespart werden kann. Ebenso wird eine mögliche Fehlerquelle umgangen, weil das Hinzufügen einer neuen Testklasse zu einer Testsuite nicht mehr vergessen werden kann Testresult Das Objekt Testresult ist ein einfaches Objekt. Alle Ereignisse, die während des Ausführens der Tests auftreten, werden im Testresult gesammelt. Dazu zählen beispielsweise die Anzahl der erfolgreichen oder fehlgeschlagenen Tests. Schlägt ein Test fehl, muss sich zusätzlich der Fehler sowie die Stelle im Programmcode gemerkt werden. Das Testresult kann entsprechend aufbereitet werden, um es für den Nutzer übersichtlich darzustellen. So sind neben der einfachen Ausgabe auf der Konsole auch Ausgaben in XML oder HMTL denkbar. 3.3 Test-Driven Development Der Begriff des Unit Testing wurde vom Extreme Programming[2] geprägt. Einer der Mitbegründer und der bekannteste Vertreter des Extreme Programming ist Kent Beck. Er trug, durch seine Arbeit als Entwickler von JUnit[14], maßgeblich zur Entwicklung von Unit Testing bei. Die Grundidee des Extreme Programming ist es, anders als bei den klassischen Softwareentwicklungsmodellen, wie beispielsweise dem Wasserfallmodell, den Entwicklungsprozess in viele kleinere Phasen aufzuteilen. Dabei rückt die formale Spezifikation der Programmanforderungen in den Hintergrund. 11

18 3.3 Test-Driven Development Viele Anforderungen ergeben sich meistens erst während des Entwicklungsprozesses. Dabei wird besonderen Wert auf die Kommunikation mit dem Kunden gelegt. Schon in frühen Entwicklungsphasen werden erste Programmteile fertiggestellt und können mit dem Kunden besprochen werden. In jeder Entwicklungsphase wird erneut eine Rahmenplanung für die aktuelle Iteration festgelegt. Somit kann besonders flexibel auf geänderte Kundenwünsche reagiert werden und ein Projekt Stück für Stück zu einem fertigen Produkt entwickelt werden. Das Test-Driven Development[1] ist eine Ausprägung des Extreme Programming. Die Verwendung von Unit Test Frameworks wird noch stärker in den Entwicklungsprozess eingebunden. Im Test-Driven Development wird nach dem Prinzip des Test First Musters programmiert, d.h. es wird erst ein Test für eine Anforderung geschrieben und im Anschluss wird die entsprechende Anforderung implementiert. Jede Entwicklung von neuem Code ist in drei Phasen eingeteilt. 1 Es wird ein Test geschrieben, der die neuen Anforderungen genau spezifiziert oder einen Fehler darstellt. Dieser Test muss fehlschlagen. 2 Es wird neuer Code geschrieben, bis der Test erfolgreich durchlaufen wird, ebenso wie alle älteren Testfälle. Dabei soll der Code so einfach wie möglich sein. 3 Es wird ein Code Refactoring durchgeführt, welches sicherstellt, dass ein sauberes Design entsteht. Alle drei Phasen werden immer wieder durchlaufen, dabei werden nicht mehrere Tests auf einmal geschrieben, sondern das Programm anhand einzelner Tests sukzessive erweitert. Da der Code möglichst einfach programmiert werden soll, reicht es oft schon, wenn Methoden feste Werte zurückliefern, damit ein Test nicht fehlschlägt. Diese Vorgehensweise ist beabsichtigt. Vielfach wird erst ein weiterer Test die gewünschte Funktionalität komplett abbilden, so dass die Qualität der Tests auch die Funktionalität des Programms bestimmt. Sollte zu einem späterem Zeitpunkt ein Fehler im Programm auftauchen, muss zuerst ein Test geschrieben werden, der diesen Fehler nachstellt, bevor der eigentliche Fehler behoben werden sollte. Verschiedene Untersuchen (vgl. [5]) haben gezeigt, dass der zusätzliche Aufwand verschiedene Testverfahren in ein Projekt zu integrieren, zu deutlich weniger Fehlern und zu einer höheren Entdeckungsrate von Fehlern führt. Dies liegt bei den Unit Tests vor allem daran, dass der bereits geschriebene Testcode hilft keine Fehler in schon bestehenden Code einzubauen. Sobald getesteter Code verändert wird und dabei Fehler auftreten, werden diese sofort beim Ausführen der Tests entdeckt. Auch helfen die Unit Tests, die Fehlerursache schneller zu finden. Für die Anhänger des Test-Driven Development sind dies die entscheidenden Vorteile. 12

19 3.4 Refactoring 3.4 Refactoring Bei der Entwicklung nach dem Prinzip des Test-Driven Development s (TDD) werden viele kleinere Refactorings in den programmierten Klassen durchgeführt, somit ist die Anwendung von Refactorings eng mit dem TDD verbunden (vgl. [1], S.181ff). Während diese noch leicht durchzuführen sind, weil der Programmcode gerade erst entwickelt wurde, treten bei der Einführung von Unit Tests in ein bestehendes Softwaresystem einige Probleme auf. Die Software wurde nicht in erster Linie für die Testbarkeit durch Unit Tests entwickelt. Vielfach lassen sich Programmteile dadurch nicht testen. Somit ist meistens der einzige Weg, das Programm testbar zu machen, ein Refactoring durchzuführen. Dennoch liegt gerade hier das Problem. Martin Fowler[10] beschreibt, dass ein Refactoring nur durchführt werden sollte, wenn dieses durch Tests abgedeckt ist. Andersfalls kann es sehr schnell zu Bugs kommen, die erst mal unerkannt bleiben und später Probleme verursachen. Einfache Refactorings können selbstverständlich auch ohne Tests durchführt werden. Am einfachsten geht dies, wenn ein geeignetes Tool vorhanden ist, welches automatisch Refactorings durchführt und entsprechend alle Referenzen richtig ändert. Die Einführung von Unit Tests in SUMO trifft auf diese Problematik. Da die Klassen nicht durch Unit Test abgedeckt sind, sollte sehr genau überprüft werden, ob eine Klasse testbar gemacht werden sollte und im Zweifel lieber darauf verzichten. Allerdings ist SUMO sehr sauber programmiert und somit lassen sich viele Klassen testen, ohne ein Refactoring durchzuführen. 3.5 Testkonzepte für Unit Tests Mock Objekte Eine grundlegende Idee des Unit Testing ist es, dass jeder Test eine einzelne Funktionalität testet. Nicht immer kann die Funktionalität isoliert betrachtet werden. Dies liegt daran, dass viele Klassen andere Klassen verwenden, um die eigene Logik zu implementieren. Somit werden eventuell Abhängigkeiten zu sehr komplexen Klassen oder zu Klassen, die mit einer Datenbank oder einen Netzwerk verbunden sind, erstellt, die zu Problemen beim Schreiben der Unit Tests führen. Bei besonders komplexen Klassen können mögliche Seiteneffekte nicht mehr einfach isoliert werden oder es wird ungewollt die Funktionalität dieser Klasse getestet, die aber in eigenen Unit Tests überprüft werden sollte. Noch schwerwiegendere Probleme ergeben sich bei der Verwendung von Datenbanken. Die Datenbank muss sich vor jedem Test immer in einem konsistenten Zustand befinden, um die Testergebnisse reproduzierbar zu erzeugen. Somit ist die Verwendung der Produktivdatenbank nicht geeignet. Des Weiteren muss vor jedem Test die Datenbank komplett neu initialisiert werden. Dies kann, neben dem zusätzlichen Aufwand, auch zu deutlich langsameren Tests führen. Ferner treten auch Probleme auf, wenn sich das Programm mit ei- 13

20 3.5 Testkonzepte für Unit Tests nem Netzwerk verbindet. Es ist nicht sichergestellt, dass das Netzwerk immer eine Verbindung herstellen kann, ebenso kann es zu zeitlichen Verzögerungen kommen. Dadurch können Tests unkontrolliert fehlschlagen und sind nicht reproduzierbar. Bei allen diesen Problemen können Mock Objekte weiterhelfen. Ein Mock Objekt simuliert ein reales Objekt. In einem Test wird anstelle des realen Objektes das entsprechende Mock Objekt verwendet. Eine Mock Klasse kann auf zwei verschiedene Arten angelegt werden. Im ersten Fall erweitert die Mock Klasse die eigentliche Klasse und überschreibt Methoden. Im zweiten Fall implementiert die Mock Klasse ein Interface oder eine abstrakte Klasse. Voraussetzung dafür ist allerdings, dass die eigentliche Klasse auch dieses Interface implementiert. Die Implementierung der Mock Klasse wird dabei möglichst einfach gehalten und sollte kein Verhalten nachprogrammieren. Eine konkrete Umsetzung hat dann Methoden, die einen festgelegten Rückgabewert haben, unabhängig davon wie der Zustand des Objektes ist oder welche Übergabeparameter die Methoden bekommen haben. Im Folgenden wird beispielhaft die Verwendung eines Mock Objektes demonstriert (vgl. [7] S.42). Es wird die Klasse QuadrateDB getestet, deren Aufgabe es ist eine Verbindung zu einer Datenbank herzustellen und alle Quadrate auszulesen. class QuadrateDB { public : QuadrateDB ( DBConnection con ) : con ( con ) { vector <Quadrat> getquadrate ( ) { con. connect ; vector <Quadrat> quadrate = con. s e l e c t Q u a d r a t e ( ) ; con. d i s c o n n e c t ; return quadrate ; private : DBConnection con ; Dem Parameter des Konstruktors wird eine DBConnection übergeben. Dies ist eine abstrakte Klasse, welche folgendermaßen aufgebaut ist: class DBConnection { public : v i r t u a l void connect ( ) = 0 ; v i r t u a l void d i s c o n n e c t ( ) = 0 ; v i r t u a l vector <Quadrat> s e l e c t Q u a d r a t e ( ) = 0 ; 14 Es wird eine Instanz der Klasse DBConnection benötigt, um die Klasse Quadra-

21 3.5 Testkonzepte für Unit Tests tedb zu testen. Um das Problem, eine Datenbank zu initialisieren und diese mit Werten zu füllen, zu umgehen, wird eine Mock Klasse von DBConnection erstellt. Eine Beispielimplementierung ist im Folgenden angegeben. c l a s s MockDBConnection : DBConnection { public : void connect ( ) { connected = true ; void d i s c o n n e c t ( ) { d i s c o n n e c t e d = f a l s e ; vector <Quadrat> s e l e c t Q u a d r a t e ( ) { vector <Quadrat> quadrate ; return quadrate ; boolean v a l i d a t e ( ) { return connected && d i s c o n n e c t e d ; private : boolean connected = f a l s e ; boolean d i s c o n n e c t e d = f a l s e ; Die Methode selectquadrate greift auf keine Datenbank zu, sondern gibt eine leere Collection zurück. Um zu überprüfen, ob die Methoden connect und disconnect innerhalb der Methode getquadrate aufgerufen wurden, müssen entsprechende Werte gesetzt werden. Über die Methode validate lassen sich diese dann überprüfen. Für die Testklasse ergibt sich letztendlich folgende Implementation: #i n c l u d e <Framework. h> #i n c l u d e <Framework Main Method. cpp> #i n c l u d e Quadrat. h void testgetquadrate ( ) { MockDBConnection *mock = new MockDBConnection ( ) ; QuadratDB *db = new QuadratDB (*mock ) ; vector <Quadrat> quadrate = db >getquadrate ( ) ; a s s e r t E q u a l s ( 0, quadrate >s i z e ( ) ) ; asserttrue (mock >v a l i d a t e ( ) ) ; Die zusätzlich verwendetet Methode validate ist keinesfalls typisch für Mock Objekte, demonstriert aber die Möglichkeiten mit Mock Objekten zu arbeiten. Vielfach 15

22 3.5 Testkonzepte für Unit Tests werden einfach die vorhandenen Methoden überschrieben und möglichst einfach implementiert. In der Entwicklung nach dem Prinzip des TDD s ergibt sich noch eine weitere Verwendung von Mock Objekten. Da die Tests während der Entwicklung geschrieben werden, sind nicht immer alle verwendeten Klassen vollständig implementiert. Um trotzdem funktionierende Tests zu schreiben, können diese durch Mock Klassen ersetzt werden Testen von privaten Methoden Auf das Testen von privaten Methoden sollte möglichst verzichtet werden, weil private Methoden Implementierungsdetails einer Klasse beinhalten, die nicht nach außen hin sichtbar sein sollten. Dementsprechend gibt es keinen Grund einen Testfall für private Methoden zu erstellen. Allerdings ist dies nicht immer so einfach zu betrachten. So kann es durchaus vorkommen, dass komplexerer Code in eine private Methode ausgelagert wird und diese Methode besser isoliert getestet werden kann, als einen Umweg über eine public Methode machen zu müssen. Dies trifft vor allem dann zu, wenn eine Testabdeckung von 100% erreicht werden soll. Im Allgemeinen sollte das Design aber so gewählt werden, dass eine Klasse vollständig durch seine public Methoden getestet werden kann und private Methoden nicht getestet werden. Dennoch gibt es in den unterschiedlichen Programmiersprachen die Möglichkeit, auch private Methoden zu testen. Zwei Ansätze für die Programmiersprachen C++ und Java sollen kurz vorgestellt werden. In C++ besteht die Möglichkeit, die Testklasse als friend in der zu testenden Klasse zu deklarieren und damit Zugang zu den protected und privaten Methoden zu erhalten. Allerdings ist dieser Ansatz nicht empfehlenswert, da der Produktivcode geändert werden muss und die Testklasse davon abhängig wird. Somit sollte in C++ vollständig darauf verzichtet werden, private Methoden zu testen. Java besitzt einen anderen Mechanismus, um private Methoden zu testen. Mithilfe von Reflections kann auf die Methoden einer Klasse zugegriffen werden und sich dadurch Zugang zu den private Methoden verschafft werden. Der Vorteil dieses Ansatzes ist es, dass der Testcode unabhängig vom Produktivcode ist. Dennoch wird die Testmethode sehr unübersichtlich, da der Aufruf einer Methode per Reflection einige Zeilen Code benötigt. Deshalb sollte auch dieser Ansatz mit Bedacht eingesetzt werden Testen von Exceptions Die Fehlerbehandlung eines Programms sollte, genauso wie der andere Programmcode, auch getestet werden, um festzustellen, ob die richtige Exception geworfen wird und ob der Fehlertext stimmt. Das Abfangen der Fehler lässt sich in der Testmethode 16

23 3.5 Testkonzepte für Unit Tests mit einem try-catch-block bewerkstelligen und mithilfe des fail-asserts kann überprüft werden, ob der Fehler auch tatsächlich geworfen wird. Eine Beispielanwendung sieht folgendermaßen aus: #i n c l u d e <Framework. h> #i n c l u d e <Framework Main Method. cpp> #i n c l u d e Quadrat. h void testnegativesargument ( ) { try { new Quadrat ( 2); f a i l ( Es s o l l t e e i n e Exception geworfen werden. ) ; catch ( IllegalArgumentException e ) { a s s e r t E q u a l s ( S e i t e n l ä n g e i s t n egativ, e. getmessage ( ) ) ; Ein Assert pro Testmethode Es ist eine sinnvolle Regel, wenn beim Schreiben von Unit Tests jede Testmethode genau ein Assert verwendet, so dass jeder Test genau einen Testfall abdeckt. Werden mehrere Asserts benutzt, werden auch mehrere Aspekte des Programms getestet. Dieser Ansatz bringt viele Vorteile mit sich. Da immer nur ein Testfall ausgeführt wird, kann schon der Methodenname so gewählt werden, dass der Zweck des Tests sofort erkennbar ist. Auch bleiben die Tests dadurch kurz und übersichtlich. Ein weiterer großer Vorteil ist es, dass, falls ein Test fehlschlägt, alle anderen Tests noch ausgeführt werden, während bei der Verwendung von weiteren Asserts in einer Testmethode diese abhängig vom Framework nicht ausgeführt werden. Dennoch ist in der Praxis dieses Konzept zu restriktiv, da die Anzahl der Testmethoden dadurch sehr schnell ansteigt. Deshalb ist Verwendung mehrerer Asserts in einer Testmethode, wenn diese das gleiche Verhalten testen, durchaus sinnvoll. Die ursprüngliche Idee sollte aber immer eingehalten werden, d.h. die Testmethode sollte möglichst kurz sein und sich auf einen Testfall konzentrieren Unit Test als Regressionstest Ein Regressionstest ist das erneute Ausführen von bereits erfolgreich ausgeführten Tests. Mithilfe der Regressionstests wird sichergestellt, dass bestehender Programmcode durch Programmänderungen weiterhin fehlerfrei funktioniert (vgl. [4] S.192). Somit wird erreicht, dass die Qualität der getesteten Software erhalten bleibt und keine neuen Fehler oder Seiteneffekte auftreten. Deshalb müssen nach jeder Programmänderung alle vorhandenen Tests erneut ausgeführt werden. Unit Tests eig- 17

24 3.5 Testkonzepte für Unit Tests nen sich hervorragend, um als Regressionstest eingesetzt zu werden. Dies geschieht zum einen lokal auf dem Rechner eines Programmierers. Durch das Ausführen von Unit Tests sollte nach jeder Programmänderung sichergestellt werden, dass die zugehörigen Tests noch funktionieren. Damit werden die meisten Fehler sofort erkannt und können behoben werden, bevor eine Klasse für andere Programmierer freigegeben wird. Aus zeitlichen Gründen ist es zumeist nicht möglich, alle Testklassen eines Programms nach jeder Änderung auszuführen. Dies kann dazu führen, dass Fehler in anderen Programmteilen auftreten, ohne dass dies unmittelbar bemerkbar ist. Deshalb sollten alle Unit Tests täglich als Regressionstest ausgeführt werden. Dieser sollte automatisch ausgeführt werden und alle auftretenden Fehler müssen den Programmierern mitgeteilt werden, die Änderungen vorgenommen haben. Alternativ zur täglichen Ausführung, ist es auch vorstellbar, alle Tests auszuführen, sobald eine Änderungen in das System übernommen wird. Somit wird unmittelbar eine Rückmeldung geliefert, ob Fehler aufgetreten sind und die Fehlerquelle kann besser eingeschränkt werden Auswirkungen auf den Programmierstil Die Verwendung von Unit Tests hat unmittelbare Auswirkungen auf den Programmierstil. Dies trifft besonders beim Programmieren nach dem Prinzip des Test Driven Development zu, aber auch bei der späteren Einführung von Unit Tests. Die zu testenden Klassen müssen gewisse Anforderungen erfüllen, damit sie testbar sind. Dies kann, wie weiter oben beschrieben, durch ein Refactoring geschehen. Einige der dabei entstehenden Auswirkungen auf den Programmierstil sind sogar erwünscht, da dadurch der Programmierstil verbessert wird (vgl. [6] S.5). Eine Auswirkung hat das Programmieren nach dem Entwurfsmuster der Dependency Injection. Dadurch werden Abhängigkeiten zwischen Objekten in den Konstruktor einer Klasse verlagert, so dass alle abhängigen Objekte bei der Erzeugung eines Objektes angegeben werden müssen. Innerhalb einer Klassen dürfen keine Objekte lokal initialisiert werden. Dies erleichtert das Testen dieser Klassen deutlich. Insbesondere Mock Objekte lassen sich leichter verwenden, da sie problemlos der Klasse übergeben werden können. Eine weitere Auswirkung des Programmierens von Unit Tests ist das Umgehen von Singleton Klassen. Auch wenn diese des öfteren nützlich sind, ist deren Verwendung umstritten, weil sie Probleme verursachen können[27]. Singleton Klassen sind sehr umständlich zu testen, da sie nur über eine getinstance Methode erstellt werden können und keine Möglichkeiten vorhanden ist, die Klasse von außen zu steuern. Hinzu kommt noch, dass zu Singleton Klassen keine Mock Klassen erstellt werden können. Des Weiteren ergibt sich beim Schreiben von Unit Tests, dass die Schnittstellen einer Klasse nach außen besser durchdacht sind, weil die Funktionalität einer Klasse 18

25 3.5 Testkonzepte für Unit Tests durch die Unit Test abgedeckt und überprüft wird. Deshalb muss sorgfältig überlegt werden, welche Methoden überhaupt vorhanden sein müssen und ob diese public sein sollten. Allerdings sollte darauf geachtet werden, nicht zu viele Methoden auf public zu setzen, nur um sie besser testen zu können. So sollten beispielsweise Hilfsmethoden, die nur innerhalb einer Klasse verwendet werden, immer private Methoden sein Weitere Konzepte Im Zusammenhang mit Unit Tests gibt es verschiedene Ansätze auch Programmcode zu testen, der über das bisher Vorgestellte hinausgeht. Dazu gehört auch das Testen von verteilten Systemen oder von Code, der Multithreading verwendet. An dieser Stelle sollen zwei weitere Konzepte kurz vorgestellt werden. Diese spielen in dieser Arbeit eine untergeordnete Rolle, weil keine GUI-Tests sowie Datenbanktests durchgeführt werden, aber bei der Auswahl des Unit Test Frameworks erwähnt werden und die Möglichkeiten, auf welche Weise sich Unit Tests einsetzen lassen, zeigen. GUI-Tests Um die GUI (Graphical User Interface) einer Anwendung zu testen, werden entsprechende Erweiterungen für ein Unit Test Framework benötigt. Diese sind, auch abhängig von der Programmiersprache, nicht immer verfügbar. So besteht in C++ das Problem, dass die GUI stark plattformabhängig ist und entsprechend auch nur Tools das Testen von GUI Elementen unterstützen können, die für eine Plattform entwickelt wurden. Mithilfe zusätzlicher Methoden, die die Erweiterung bereitstellt, können GUI Fenster erzeugt, einzelne Elemente angesteuert und ihr Zustand abgefragt werden. Das Prinzip von GUI-Tests wiederspricht im Prinzip der Grundidee des Unit Testing, da hier auf einer sehr hohen Ebene getestet wird und es sich eigentlich um Integrationstests handelt. Dennoch sind Unit Tests auch für GUI-Tests hervorragend geeignet. Vorraussetzung dafür ist allerdings, dass die verwendeten Klassen, die die zugrundeliegende Logik der GUI implementieren, schon vollständig durch Unit Tests getestet sind. Testen mit Datenbanken Auch das Testen mit Datenbanken benötigt eine entsprechende Erweiterung für das Unit Test Framework, die im Wesentlichen dafür sorgt, dass die Datenbank automatisch wieder in einen definierten Zustand gebracht wird. Hierzu wird die Datenbank in der Set-Up Methode aufgebaut und die benötigten Tabellen angelegt, dabei werden die Informationen zum Beispiel aus einer Datei gelesen. In der Tear- 19

26 3.5 Testkonzepte für Unit Tests Down Methode wird die Datenbank wieder zurückgesetzt, wenn dies nicht schon automatisch passiert. In der Praxis ist dies meistens nicht so einfach zu realisieren, weil nicht alle Anwendungen auf die gleiche Weise mit einer Datenbank verbunden sind. Vielfach ist noch ein Adapter zwischen Datenbank und Programm geschaltet, der die Datenbankanfragen absetzt und die Ergebnisse zurückliefert. Mithilfe eines Adapters lassen sich problemlos verschiedene Datenbanken verwenden oder komplexe Objekte abspeichern, wobei keine SQL Anfragen geschrieben werden müssen. Abhängig von der jeweiligen Anwendung gibt es verschiedene Ansätze und entsprechende Tools. Eine tieferen Einstieg in diese Tools und deren Benutzung soll es hier aber nicht geben, weil keine Datenbanktests in dieser Arbeit durchgeführt werden. 20

27 4 Unit Test Frameworks für C++ Für die Programmiersprache C++ existieren eine Vielzahl von Unit Test Frameworks. In diesem Kapitel soll es darum gehen, einen Überblick über verfügbare Unit Test Frameworks zu geben und anhand von verschiedenen Entscheidungskriterien ein geeignetes Framework für das Projekt SUMO auszuwählen. 4.1 Warum existieren für C++ so viele Unit Test Frameworks? Beim Vergleich zwischen der Auswahl von Frameworks für C++ und Java fällt sofort auf, dass es für C++ eine Vielzahl existierender Frameworks gibt, während sich im Umfeld von Java nur wenige Frameworks entwickelt haben. So gibt es in Java mit JUnit ein Unit Test Framework, welches sich als Standard durchgesetzt hat. Dies belegen u.a. die Vielzahl von existierenden Büchern, die als Tutorial dienen, einen umfassenden Einblick in Unit Testing geben und JUnit als Beispielsprache benutzen. Darüber hinaus gibt es auch über das Internet eine große Zahl an Informationsquellen zu JUnit. Es drängt sich die Frage auf, warum sich für C++ kein ähnlich populäres Unit Test Framework entwickelt hat. Die Antwort liegt sicherlich in der Programmiersprache C++, die sich in vielen Details von Java unterscheidet, obwohl beide objektorientierte Sprachen sind. Einer der wichtigsten Unterschiede liegt in der Plattformabhängigkeit von C++. Viele Unit Test Frameworks für C++ sind speziell für eine Plattform entwickelt, um die Vorteile dieser Plattform auszunutzen. Darüber hinaus sind viele Frameworks auf die API eines Betriebssystems zugeschnitten. Dennoch gibt es auch eine Reihe von Unit Test Frameworks in C++, welche nicht abhängig von dem Betriebssystem sind. Mit diesen Frameworks ist es aber bisher nicht möglich GUI Tests oder Datenbanktests durchzuführen. Die Vielzahl der existierenden Frameworks erklärt sich auch einerseits aus ihrer Abhängigkeit zu verschiedenen Compilern, beispielsweise G++, Visual Studio C++, Borland C++, Intel C++, usw. Es gibt einige Unit Test Frameworks, die nur für bestimmte Compiler geschrieben wurden, zum Beispiel Team Test für Visual Studio C++. Anderseits gelingt es nicht allen Compilern, die im Jahr 1998 festgelegte Sprachnorm umsetzen. Der einzige Compiler, der zurzeit die Sprachnorm vollständig unterstützt, ist der Compiler Comeau C++. Verwenden Frameworks spezielle Spracheigenheiten sind sie nicht auf allen Compilern lauffähig. Darüber hinaus gibt es Frameworks, die die verschiedensten Bibliotheken benötigen oder RTTI (Runtime Type Information) verwenden. RTTI ermöglicht es, zur Laufzeit den Typ eines Objektes zu ermitteln. Mit diesen Abhängigkeiten, kommt es bei der Installation des Öfteren zu Schwierigkeiten, da nicht jede Bibliothek mit jedem Compiler harmoniert. Allgemein kann festgehalten werden, dass ein Unit Test Framework leichter zu verwenden ist, wenn es so wenig 21

Testen mit JUnit. Motivation

Testen mit JUnit. Motivation Test First Design for Test in Eclipse (eigentlich: ) zu einer Klasse Beispiel zur Demonstration Ergänzungen Test First "Immer dann, wenn Du in Versuchung kommst, etwas wie eine print- Anweisung oder einen

Mehr

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Fortgeschrittenes Programmieren mit Java. Test Driven Development Fortgeschrittenes Programmieren mit Java Test Driven Development Test getriebene Programmierung Benedikt Boeck Hochschule für Angewandte Wissenschaften Hamburg 6. November 2009 B. Boeck (HAW Hamburg) Test

Mehr

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch

Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen. Alexander Schunk Marcel Teuber Henry Trobisch Softwaretests in Visual Studio 2010 Ultimate Vergleich mit Java-Testwerkzeugen Alexander Schunk Henry Trobisch Inhalt 1. Vergleich der Unit-Tests... 2 2. Vergleich der Codeabdeckungs-Tests... 2 3. Vergleich

Mehr

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008 Konzeption und Implementierung einer automatisierten Testumgebung, 10. Dezember 2008 1 Gliederung Einleitung Softwaretests Beispiel Konzeption Zusammenfassung 2 Einleitung Komplexität von Softwaresystemen

Mehr

EasyWk DAS Schwimmwettkampfprogramm

EasyWk DAS Schwimmwettkampfprogramm EasyWk DAS Schwimmwettkampfprogramm Arbeiten mit OMEGA ARES 21 EasyWk - DAS Schwimmwettkampfprogramm 1 Einleitung Diese Präsentation dient zur Darstellung der Zusammenarbeit zwischen EasyWk und der Zeitmessanlage

Mehr

Datensicherung. Beschreibung der Datensicherung

Datensicherung. Beschreibung der Datensicherung Datensicherung Mit dem Datensicherungsprogramm können Sie Ihre persönlichen Daten problemlos Sichern. Es ist möglich eine komplette Datensicherung durchzuführen, aber auch nur die neuen und geänderten

Mehr

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version: 1.0 09.06.2009

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version: 1.0 09.06.2009 Testen von Software Systemen Übung 02 SS 2009 Version: 1.0 09.06.2009 Komponententest Kunde: Dr. Reinhold Plösch Dr. Johannes Sametinger Kundenreferenz: 259.019 Team 19 Mitarbeiter: Christian Märzinger

Mehr

SEP 114. Design by Contract

SEP 114. Design by Contract Design by Contract SEP 114 Design by Contract Teile das zu entwickelnde Programm in kleine Einheiten (Klassen, Methoden), die unabhängig voneinander entwickelt und überprüft werden können. Einheiten mit

Mehr

Whitebox-Tests: Allgemeines

Whitebox-Tests: Allgemeines -Tests: Allgemeines Andere Bezeichnungen Logic driven, Strukturelles Der Tester entwickelt Testfälle aus einer Betrachtung der Ablauflogik des Programms unter Berücksichtigung der Spezifikation Intuitiv

Mehr

Robot Karol für Delphi

Robot Karol für Delphi Robot Karol für Delphi Reinhard Nitzsche, OSZ Handel I Version 0.1 vom 24. Januar 2003 Zusammenfassung Nach der Einführung in die (variablenfreie) Programmierung mit Robot Karol von Freiberger und Krško

Mehr

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum C A R L V O N O S S I E T Z K Y Agile Vorgehensmodelle in der Softwareentwicklung: Scrum Johannes Diemke Vortrag im Rahmen der Projektgruppe Oldenburger Robot Soccer Team im Wintersemester 2009/2010 Was

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung Objektorientierte Programmierung 1 Geschichte Dahl, Nygaard: Simula 67 (Algol 60 + Objektorientierung) Kay et al.: Smalltalk (erste rein-objektorientierte Sprache) Object Pascal, Objective C, C++ (wiederum

Mehr

Das Test-Framework JUnit ETIS SS04

Das Test-Framework JUnit ETIS SS04 Das Test-Framework JUnit ETIS SS04 Gliederung Motivation TestFirst Grundlagen Assert TestCase Lebenszyklus TestCase UML-Diagramm TestCase TestSuite Zusammenfassung 2 Motivation (I) Kostspielige Folgen

Mehr

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Objektorientierte Programmierung für Anfänger am Beispiel PHP Objektorientierte Programmierung für Anfänger am Beispiel PHP Johannes Mittendorfer http://jmittendorfer.hostingsociety.com 19. August 2012 Abstract Dieses Dokument soll die Vorteile der objektorientierten

Mehr

Grundlagen von Python

Grundlagen von Python Einführung in Python Grundlagen von Python Felix Döring, Felix Wittwer November 17, 2015 Scriptcharakter Programmierparadigmen Imperatives Programmieren Das Scoping Problem Objektorientiertes Programmieren

Mehr

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche

etutor Benutzerhandbuch XQuery Benutzerhandbuch Georg Nitsche etutor Benutzerhandbuch Benutzerhandbuch XQuery Georg Nitsche Version 1.0 Stand März 2006 Versionsverlauf: Version Autor Datum Änderungen 1.0 gn 06.03.2006 Fertigstellung der ersten Version Inhaltsverzeichnis:

Mehr

Übung: Verwendung von Java-Threads

Übung: Verwendung von Java-Threads Übung: Verwendung von Java-Threads Ziel der Übung: Diese Übung dient dazu, den Umgang mit Threads in der Programmiersprache Java kennenzulernen. Ein einfaches Java-Programm, das Threads nutzt, soll zum

Mehr

OP-LOG www.op-log.de

OP-LOG www.op-log.de Verwendung von Microsoft SQL Server, Seite 1/18 OP-LOG www.op-log.de Anleitung: Verwendung von Microsoft SQL Server 2005 Stand Mai 2010 1 Ich-lese-keine-Anleitungen 'Verwendung von Microsoft SQL Server

Mehr

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren Lineargleichungssysteme: Additions-/ Subtraktionsverfahren W. Kippels 22. Februar 2014 Inhaltsverzeichnis 1 Einleitung 2 2 Lineargleichungssysteme zweiten Grades 2 3 Lineargleichungssysteme höheren als

Mehr

DOKUMENTATION VOGELZUCHT 2015 PLUS

DOKUMENTATION VOGELZUCHT 2015 PLUS DOKUMENTATION VOGELZUCHT 2015 PLUS Vogelzucht2015 App für Geräte mit Android Betriebssystemen Läuft nur in Zusammenhang mit einer Vollversion vogelzucht2015 auf einem PC. Zusammenfassung: a. Mit der APP

Mehr

Objektorientierter Software-Entwurf Grundlagen 1 1. Analyse Design Implementierung. Frühe Phasen durch Informationssystemanalyse abgedeckt

Objektorientierter Software-Entwurf Grundlagen 1 1. Analyse Design Implementierung. Frühe Phasen durch Informationssystemanalyse abgedeckt Objektorientierter Software-Entwurf Grundlagen 1 1 Einordnung der Veranstaltung Analyse Design Implementierung Slide 1 Informationssystemanalyse Objektorientierter Software-Entwurf Frühe Phasen durch Informationssystemanalyse

Mehr

Beschreibung des MAP-Tools

Beschreibung des MAP-Tools 1. Funktionen des MAP-Tool 2. Aufbau des MAP-Tools 3. Arbeiten mit dem MAP-Tool Beschreibung MAP-Tool.doc Erstellt von Thomas Paral 1 Funktionen des MAP-Tool Die Hauptfunktion des MAP-Tools besteht darin,

Mehr

GeoPilot (Android) die App

GeoPilot (Android) die App GeoPilot (Android) die App Mit der neuen Rademacher GeoPilot App machen Sie Ihr Android Smartphone zum Sensor und steuern beliebige Szenen über den HomePilot. Die App beinhaltet zwei Funktionen, zum einen

Mehr

Einführung in die Informatik Tools

Einführung in die Informatik Tools Einführung in die Informatik Tools Werkzeuge zur Erstellung von Softwareprojekten Wolfram Burgard 8.1 Motivation Große Softwareprojekte werden schnell unübersichtlich. Änderungen im Code können leicht

Mehr

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept

Swp08-6 Verantwortliche: Yundensuren, Baigalmaa. Testkonzept Testkonzept 1.Einführung Um die Zuverläsigkeit und die Qualität der Software und des gesamten Systems zu verbessern, sind Tests durchzuführen. Die Testreihe läst sich in drei Stufen einteilen, nülich Komponententest,

Mehr

Programmiertechnik II

Programmiertechnik II Modultests Ziele Überprüfung der Korrektheit eines Moduls Korrektheit: Übereinstimmung mit (informaler) Spezifikation Modul: kleine testbare Einheit (Funktion, Klasse) Engl.: unit test White box testing

Mehr

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {... PIWIN I Kap. 8 Objektorientierte Programmierung - Vererbung 31 Schlüsselwort: final Verhindert, dass eine Methode überschrieben wird public final int holekontostand() {... Erben von einer Klasse verbieten:

Mehr

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem Fachbericht zum Thema: Anforderungen an ein Datenbanksystem von André Franken 1 Inhaltsverzeichnis 1 Inhaltsverzeichnis 1 2 Einführung 2 2.1 Gründe für den Einsatz von DB-Systemen 2 2.2 Definition: Datenbank

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein. Schritt 1: Installation des Javacompilers JDK. Der erste Start mit Eclipse Bevor Sie den Java-Compiler installieren sollten Sie sich vergewissern, ob er eventuell schon installiert ist. Gehen sie wie folgt

Mehr

.. für Ihre Business-Lösung

.. für Ihre Business-Lösung .. für Ihre Business-Lösung Ist Ihre Informatik fit für die Zukunft? Flexibilität Das wirtschaftliche Umfeld ist stärker den je im Umbruch (z.b. Stichwort: Globalisierung). Daraus resultierenden Anforderungen,

Mehr

GEVITAS Farben-Reaktionstest

GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest GEVITAS Farben-Reaktionstest Inhalt 1. Allgemeines... 1 2. Funktionsweise der Tests... 2 3. Die Ruhetaste und die Auslösetaste... 2 4. Starten der App Hauptmenü... 3 5. Auswahl

Mehr

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER Inhalt 1 Einleitung... 1 2 Einrichtung der Aufgabe für die automatische Sicherung... 2 2.1 Die Aufgabenplanung... 2 2.2 Der erste Testlauf... 9 3 Problembehebung...

Mehr

Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express

Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express Howto Installation und Inbetriebnahme von Microsoft Visual C++ 2010 Express Peter Bitterlich Markus Langer 12. Oktober 2012 Zusammenfassung Dieses Dokument erklärt Schritt für Schritt die Installation

Mehr

Artikel Schnittstelle über CSV

Artikel Schnittstelle über CSV Artikel Schnittstelle über CSV Sie können Artikeldaten aus Ihrem EDV System in das NCFOX importieren, dies geschieht durch eine CSV Schnittstelle. Dies hat mehrere Vorteile: Zeitersparnis, die Karteikarte

Mehr

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am 14.08.08

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am 14.08.08 Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements von Stephanie Wilke am 14.08.08 Überblick Einleitung Was ist ITIL? Gegenüberstellung der Prozesse Neuer

Mehr

Testen mit JUnit. Apcon Workplace Solutions Member of itelligence. Testen von Java-Code mit JUnit. ÿstruktur eines Testfalls

Testen mit JUnit. Apcon Workplace Solutions Member of itelligence. Testen von Java-Code mit JUnit. ÿstruktur eines Testfalls Testen von Java-Code mit JUnit ÿmotivation ÿjunit-testklassen ÿjunit-testfälle ÿstruktur eines Testfalls Henning Wolf APCON Workplace Solutions GmbH wolf@jwam.de Motivation: Werkzeugunterstützung für Tests

Mehr

Zimmertypen. Zimmertypen anlegen

Zimmertypen. Zimmertypen anlegen Zimmertypen anlegen Hier legen Sie Ihre Zimmer an, damit sie auf der Homepage dargestellt werden und online buchbar gemacht werden können. Wobei wir ausdrücklich darauf hinweisen möchten, dass es ganz

Mehr

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Einrichtung des Cisco VPN Clients (IPSEC) in Windows7 Diese Verbindung muss einmalig eingerichtet werden und wird benötigt, um den Zugriff vom privaten Rechner oder der Workstation im Home Office über

Mehr

IAWWeb PDFManager. - Kurzanleitung -

IAWWeb PDFManager. - Kurzanleitung - IAWWeb PDFManager - Kurzanleitung - 1. Einleitung Dieses Dokument beschreibt kurz die grundlegenden Funktionen des PDFManager. Der PDF Manager dient zur Pflege des Dokumentenbestandes. Er kann über die

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

Testen von graphischen Benutzeroberflächen. 24. Juni 2015

Testen von graphischen Benutzeroberflächen. 24. Juni 2015 Testen von graphischen Benutzeroberflächen 24. Juni 2015 Überblick Motivation für das automatische Testen von graphischen Benutzeroberflächen Entwicklungsprinzipien für GUIs Capture / Replay Testmethode

Mehr

Test-Driven Design: Ein einfaches Beispiel

Test-Driven Design: Ein einfaches Beispiel Test-Driven Design: Ein einfaches Beispiel Martin Wirsing in Zusammenarbeit mit Moritz Hammer und Axel Rauschmayer SS 06 2 Ziele Veranschaulichung der Technik des Test-Driven Design am Beispiel eines Programms

Mehr

Arbeiten mit UMLed und Delphi

Arbeiten mit UMLed und Delphi Arbeiten mit UMLed und Delphi Diese Anleitung soll zeigen, wie man Klassen mit dem UML ( Unified Modeling Language ) Editor UMLed erstellt, in Delphi exportiert und dort so einbindet, dass diese (bis auf

Mehr

Lizenzen auschecken. Was ist zu tun?

Lizenzen auschecken. Was ist zu tun? Use case Lizenzen auschecken Ihr Unternehmen hat eine Netzwerk-Commuterlizenz mit beispielsweise 4 Lizenzen. Am Freitag wollen Sie Ihren Laptop mit nach Hause nehmen, um dort am Wochenende weiter zu arbeiten.

Mehr

Kurzanleitung zu. von Daniel Jettka 18.11.2008

Kurzanleitung zu. von Daniel Jettka 18.11.2008 Kurzanleitung zu Tigris.org Open Source Software Engineering Tools von Daniel Jettka 18.11.2008 Inhaltsverzeichnis 1.Einführung...1 2.Das Projektarchivs...3 2.1.Anlegen des Projektarchivs...3 2.2.Organisation

Mehr

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen

SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen SafeRun-Modus: Die Sichere Umgebung für die Ausführung von Programmen Um die maximale Sicherheit für das Betriebssystem und Ihre persönlichen Daten zu gewährleisten, können Sie Programme von Drittherstellern

Mehr

C++11 C++14 Kapitel Doppelseite Übungen Musterlösungen Anhang

C++11 C++14 Kapitel Doppelseite Übungen Musterlösungen Anhang Einleitung Dieses Buch wendet sich an jeden Leser, der die Programmiersprache C++ neu lernen oder vertiefen möchte, egal ob Anfänger oder fortgeschrittener C++-Programmierer. C++ ist eine weitgehend plattformunabhängige

Mehr

Unit Tests und Fehlersuche

Unit Tests und Fehlersuche Unit Tests und Fehlersuche SE 1 - Softwareentwicklungspraktikum Test Deadline! Sinnvolle Tests kompilierbar im CVS d.h. Schnittstellen zu Strategiemethoden etc. schon erstellen Kommentieren! Besser ein

Mehr

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java Objektorientierte Programmierung mit Java Eine praxisnahe Einführung mit BlueJ Klassenentwurf Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? 1.0 Zentrale Konzepte

Mehr

Software Engineering Klassendiagramme Assoziationen

Software Engineering Klassendiagramme Assoziationen Software Engineering Klassendiagramme Assoziationen Prof. Adrian A. Müller, PMP, PSM 1, CSM Fachbereich Informatik und Mikrosystemtechnik 1 Lesen von Multiplizitäten (1) Multiplizitäten werden folgendermaßen

Mehr

5.2 Neue Projekte erstellen

5.2 Neue Projekte erstellen 5.2 Neue Projekte erstellen Das Bearbeiten von bestehenden Projekten und Objekten ist ja nicht schlecht wie aber können Sie neue Objekte hinzufügen oder gar völlig neue Projekte erstellen? Die Antwort

Mehr

Leitfaden zur Installation von Bitbyters.WinShutdown

Leitfaden zur Installation von Bitbyters.WinShutdown Leitfaden zur Installation von Bitbyters.WinShutdown für Windows 32 Bit 98/NT/2000/XP/2003/2008 Der BitByters.WinShutDown ist ein Tool mit dem Sie Programme beim Herunterfahren Ihres Systems ausführen

Mehr

Das Pflichtenheft. Dipl.- Ing. Dipl.-Informatiker Dieter Klapproth Ains A-Systemhaus GmbH Berlin

Das Pflichtenheft. Dipl.- Ing. Dipl.-Informatiker Dieter Klapproth Ains A-Systemhaus GmbH Berlin Fragestellungen: Warum reicht das Lastenheft nicht aus? Was kann ich mit dem Lastenheft machen? Was unterscheidet das Pflichtenheft vom Lastenheft? Was gehört zum Auftragsumfang einer Individualsoftware?

Mehr

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten In dem Virtuellen Seminarordner werden für die Teilnehmerinnen und Teilnehmer des Seminars alle für das Seminar wichtigen Informationen,

Mehr

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar 2015. ZID Dezentrale Systeme Novell Client Anleitung zur Verfügung gestellt durch: ZID Dezentrale Systeme Februar 2015 Seite 2 von 8 Mit der Einführung von Windows 7 hat sich die Novell-Anmeldung sehr stark verändert. Der Novell Client

Mehr

Datenübernahme easyjob 3.0 zu easyjob 4.0

Datenübernahme easyjob 3.0 zu easyjob 4.0 Datenübernahme easyjob 3.0 zu easyjob 4.0 Einführung...3 Systemanforderung easyjob 4.0...3 Vorgehensweise zur Umstellung zu easyjob 4.0...4 Installation easyjob 4.0 auf dem Server und Arbeitsstationen...4

Mehr

1 Mathematische Grundlagen

1 Mathematische Grundlagen Mathematische Grundlagen - 1-1 Mathematische Grundlagen Der Begriff der Menge ist einer der grundlegenden Begriffe in der Mathematik. Mengen dienen dazu, Dinge oder Objekte zu einer Einheit zusammenzufassen.

Mehr

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing

Fassade. Objektbasiertes Strukturmuster. C. Restorff & M. Rohlfing Fassade Objektbasiertes Strukturmuster C. Restorff & M. Rohlfing Übersicht Motivation Anwendbarkeit Struktur Teilnehmer Interaktion Konsequenz Implementierung Beispiel Bekannte Verwendung Verwandte Muster

Mehr

Prinzipien Objektorientierter Programmierung

Prinzipien Objektorientierter Programmierung Prinzipien Objektorientierter Programmierung Valerian Wintner Inhaltsverzeichnis 1 Vorwort 1 2 Kapselung 1 3 Polymorphie 2 3.1 Dynamische Polymorphie...................... 2 3.2 Statische Polymorphie........................

Mehr

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw, 16.04.2013

Testplan. Hochschule Luzern Technik & Architektur. Software Komponenten FS13. Gruppe 03 Horw, 16.04.2013 Software Komponenten FS13 Gruppe 03 Horw, 16.04.2013 Bontekoe Christian Estermann Michael Moor Simon Rohrer Felix Autoren Bontekoe Christian Studiengang Informatiker (Berufsbegleitend) Estermann Michael

Mehr

SANDBOXIE konfigurieren

SANDBOXIE konfigurieren SANDBOXIE konfigurieren für Webbrowser und E-Mail-Programme Dies ist eine kurze Anleitung für die grundlegenden folgender Programme: Webbrowser: Internet Explorer, Mozilla Firefox und Opera E-Mail-Programme:

Mehr

Die Dateiablage Der Weg zur Dateiablage

Die Dateiablage Der Weg zur Dateiablage Die Dateiablage In Ihrem Privatbereich haben Sie die Möglichkeit, Dateien verschiedener Formate abzulegen, zu sortieren, zu archivieren und in andere Dateiablagen der Plattform zu kopieren. In den Gruppen

Mehr

U08 Entwurfsmuster (II)

U08 Entwurfsmuster (II) U08 Entwurfsmuster (II) Inhalt der Übung Diskussion und Implementierung von Entwurfsmustern Übungsaufgaben Aufgabe 1 (Queue) Gegeben ist das folgende Analysemodell einer Warteschlange (Queue): Eine Warteschlange

Mehr

ABB i-bus KNX. Software-Information. Melde- und Bedientableau. Typ: MT 701.2

ABB i-bus KNX. Software-Information. Melde- und Bedientableau. Typ: MT 701.2 Produkt: Melde- und Bedientableau Typ: MT 701.2 Aktuelles Anwendungsprogramm Plug-In für ETS 2 MT_701_2_ETS2_SOW_xx_V1-12a_de_en.exe Plug-In für ETS 3 MT_701_2_ETS3_SOW_xx_V1-12a_de_en.exe EIBTAB: MT_701_2_EIBTAB_SOW_de_V2-08-00A_EibTab+Firmware.EXE

Mehr

Kleines Handbuch zur Fotogalerie der Pixel AG

Kleines Handbuch zur Fotogalerie der Pixel AG 1 1. Anmelden an der Galerie Um mit der Galerie arbeiten zu können muss man sich zuerst anmelden. Aufrufen der Galerie entweder über die Homepage (www.pixel-ag-bottwartal.de) oder über den direkten Link

Mehr

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI TTS - TinyTimeSystem Unterrichtsprojekt BIBI Mathias Metzler, Philipp Winder, Viktor Sohm 28.01.2008 TinyTimeSystem Inhaltsverzeichnis Problemstellung... 2 Lösungsvorschlag... 2 Punkte die unser Tool erfüllen

Mehr

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005 Einführung in die objektorientierte Programmierung mit Java Klausur am 19. Oktober 2005 Matrikelnummer: Nachname: Vorname: Semesteranzahl: Die Klausur besteht aus drei Frageblöcken zu den Inhalten der

Mehr

AUF LETZTER SEITE DIESER ANLEITUNG!!!

AUF LETZTER SEITE DIESER ANLEITUNG!!! BELEG DATENABGLEICH: Der Beleg-Datenabgleich wird innerhalb des geöffneten Steuerfalls über ELSTER-Belegdaten abgleichen gestartet. Es werden Ihnen alle verfügbaren Belege zum Steuerfall im ersten Bildschirm

Mehr

VB.net Programmierung und Beispielprogramm für GSV

VB.net Programmierung und Beispielprogramm für GSV VB.net Programmierung und Beispielprogramm für GSV Dokumentation Stand vom 26.05.2011 Tel +49 (0)3302 78620 60, Fax +49 (0)3302 78620 69, info@me-systeme.de, www.me-systeme.de 1 Inhaltsverzeichnis Vorwort...2

Mehr

FastViewer Remote Edition 2.X

FastViewer Remote Edition 2.X FastViewer Remote Edition 2.X Mit der FastViewer Remote Edition ist es möglich beliebige Rechner, unabhängig vom Standort, fernzusteuern. Die Eingabe einer Sessionnummer entfällt. Dazu muß auf dem zu steuernden

Mehr

Einführung in Eclipse und Java

Einführung in Eclipse und Java Universität Bayreuth Lehrstuhl für Angewandte Informatik IV Datenbanken und Informationssysteme Prof. Dr.-Ing. Jablonski Einführung in Eclipse und Java Dipl.Inf. Manuel Götz Lehrstuhl für Angewandte Informatik

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Dr. Dietrich Boles Aufgaben zu UE16-Rekursion (Stand 09.12.2011) Aufgabe 1: Implementieren Sie in Java ein Programm, das solange einzelne Zeichen vom Terminal einliest, bis ein #-Zeichen

Mehr

Internet Explorer Version 6

Internet Explorer Version 6 Internet Explorer Version 6 Java Runtime Ist Java Runtime nicht installiert, öffnet sich ein PopUp-Fenster, welches auf das benötigte Plugin aufmerksam macht. Nach Klicken auf die OK-Taste im PopUp-Fenster

Mehr

Um zusammenfassende Berichte zu erstellen, gehen Sie folgendermaßen vor:

Um zusammenfassende Berichte zu erstellen, gehen Sie folgendermaßen vor: Ergebnisreport: mehrere Lehrveranstaltungen zusammenfassen 1 1. Ordner anlegen In der Rolle des Berichterstellers (siehe EvaSys-Editor links oben) können zusammenfassende Ergebnisberichte über mehrere

Mehr

Objektorientierte Programmierung. Kapitel 12: Interfaces

Objektorientierte Programmierung. Kapitel 12: Interfaces 12. Interfaces 1/14 Objektorientierte Programmierung Kapitel 12: Interfaces Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester 2012/13 http://www.informatik.uni-halle.de/ brass/oop12/

Mehr

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007 Fachhochschule Bonn-Rhein-Sieg University of Applied Sciences Fachbereich Informatik Prof. Dr. Peter Becker Klausur WS 2006/07 Programmiersprache Java Objektorientierte Programmierung II 15. März 2007

Mehr

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Suche schlecht beschriftete Bilder mit Eigenen Abfragen Suche schlecht beschriftete Bilder mit Eigenen Abfragen Ist die Bilderdatenbank über einen längeren Zeitraum in Benutzung, so steigt die Wahrscheinlichkeit für schlecht beschriftete Bilder 1. Insbesondere

Mehr

Anleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE

Anleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE Anleitung RÄUME BUCHEN MIT OUTLOOK FÜR VERWALTUNGSANGESTELLTE Dezernat 6 Abteilung 4 Stand: 14.Oktober 2014 Inhalt 1. Einleitung 3 2. Räume & gemeinsame Termine finden 3 3. Rüstzeit 8 4. FAQ: Oft gestellte

Mehr

4D Server v12 64-bit Version BETA VERSION

4D Server v12 64-bit Version BETA VERSION 4D Server v12 64-bit Version BETA VERSION 4D Server v12 unterstützt jetzt das Windows 64-bit Betriebssystem. Hauptvorteil der 64-bit Technologie ist die rundum verbesserte Performance der Anwendungen und

Mehr

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen.

Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. Datenbank-Verschlüsselung mit DbDefence und Webanwendungen. In diesem Artikel werden wir Ihnen zeigen, wie Sie eine Datenbank verschlüsseln können, um den Zugriff einzuschränken, aber trotzdem noch eine

Mehr

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag Ludwig-Maximilians-Universität München WS 2015/16 Institut für Informatik Übungsblatt 9 Prof. Dr. R. Hennicker, A. Klarl Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung:

Mehr

Informatik I Tutorial

Informatik I Tutorial ETH Zürich, D-INFK/D-BAUG Herbstsemester 2015 Dr. Martin Hirt Daniel Jost Informatik I Tutorial Dieses Tutorial hat zum Ziel, die notwendigen Tools auf dem eigenen Computer zu installieren, so dass ihr

Mehr

Unit-Test Theorie und Praxis. Stephan Seefeld, INGTES AG

Unit-Test Theorie und Praxis. Stephan Seefeld, INGTES AG Unit-Test Theorie und Praxis Stephan Seefeld, INGTES AG Inhalt Was sind Unit-Test? NUnit für.net Demo Seite 2 Quellen Für diesen Vortrag verwendete Quellen: dotnet User Group Berlin Brandenburg http://www.dotnet-berlinbrandenburg.de/

Mehr

Qt-Projekte mit Visual Studio 2005

Qt-Projekte mit Visual Studio 2005 Qt-Projekte mit Visual Studio 2005 Benötigte Programme: Visual Studio 2005 Vollversion, Microsoft Qt 4 Open Source s. Qt 4-Installationsanleitung Tabelle 1: Benötigte Programme für die Qt-Programmierung

Mehr

Installationsanleitung

Installationsanleitung Idee und Umsetzung Lars Lakomski Version 4.0 Installationsanleitung Um Bistro-Cash benutzen zu können, muss auf dem PC-System (Windows 2000 oder Windows XP), wo die Kassensoftware zum Einsatz kommen soll,

Mehr

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen. Teil B: Erweiterungen Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen. Die folgenden Aufgaben und Ausführungen geben einige Hilfestellungen, welche (mindestens

Mehr

Stammdaten Auftragserfassung Produktionsbearbeitung Bestellwesen Cloud Computing

Stammdaten Auftragserfassung Produktionsbearbeitung Bestellwesen Cloud Computing Stammdaten Auftragserfassung Produktionsbearbeitung Bestellwesen Cloud Computing Finanzbuchhaltung Wenn Sie Fragen haben, dann rufen Sie uns an, wir helfen Ihnen gerne weiter - mit Ihrem Wartungsvertrag

Mehr

SharePoint Demonstration

SharePoint Demonstration SharePoint Demonstration Was zeigt die Demonstration? Diese Demonstration soll den modernen Zugriff auf Daten und Informationen veranschaulichen und zeigen welche Vorteile sich dadurch in der Zusammenarbeit

Mehr

KURZANLEITUNG CLOUD OBJECT STORAGE

KURZANLEITUNG CLOUD OBJECT STORAGE KURZANLEITUNG CLOUD OBJECT STORAGE Version 1.12 01.07.2014 SEITE _ 2 INHALTSVERZEICHNIS 1. Einleitung... Seite 03 2. Anmelden am Cloud&Heat Dashboard... Seite 04 3. Anlegen eines Containers... Seite 05

Mehr

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders

Mehr

Kurzanleitung GigaMove

Kurzanleitung GigaMove Kurzanleitung GigaMove Dezember 2014 Inhalt Kurzerklärung... 1 Erstellen eines neuen Benutzerkontos... 2 Login... 5 Datei bereitstellen... 6 Bereitgestellte Datei herunterladen... 6 Datei anfordern...

Mehr

Einführung in die Java- Programmierung

Einführung in die Java- Programmierung Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger horn@uni-koblenz.de WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113

Mehr

Bedienung von BlueJ. Klassenanzeige

Bedienung von BlueJ. Klassenanzeige Im Folgenden werden wichtige Funktionen für den Einsatz von BlueJ im Unterricht beschrieben. Hierbei wird auf den Umgang mit Projekten, Klassen und Objekten eingegangen. Abgeschlossen wird dieses Dokument

Mehr

IBM Software Demos Tivoli Provisioning Manager for OS Deployment

IBM Software Demos Tivoli Provisioning Manager for OS Deployment Für viele Unternehmen steht ein Wechsel zu Microsoft Windows Vista an. Doch auch für gut vorbereitete Unternehmen ist der Übergang zu einem neuen Betriebssystem stets ein Wagnis. ist eine benutzerfreundliche,

Mehr

Update und Konfiguraton mit dem ANTLOG Konfigurations-Assistenten

Update und Konfiguraton mit dem ANTLOG Konfigurations-Assistenten Update und Konfiguraton mit dem ANTLOG Konfigurations-Assistenten Der Konfigurations-Assistent wurde entwickelt, um die unterschiedlichen ANTLOG-Anwendungen auf den verschiedensten Umgebungen automatisiert

Mehr

am Beispiel von JUnit

am Beispiel von JUnit Aufbau eines Testwerkzeugs am Beispiel von JUnit Üblicher Ansatz für Tests und Fehlersuche: Print-Befehle, Debugger-Ausdrücke, Test-Skripte möglichst über globale Variable debug steuerbar Command Pattern

Mehr

SDD System Design Document

SDD System Design Document SDD Software Konstruktion WS01/02 Gruppe 4 1. Einleitung Das vorliegende Dokument richtet sich vor allem an die Entwickler, aber auch an den Kunden, der das enstehende System verwenden wird. Es soll einen

Mehr

1. Einführung. 2. Die Abschlagsdefinition

1. Einführung. 2. Die Abschlagsdefinition 1. Einführung orgamax bietet die Möglichkeit, Abschlagszahlungen (oder auch Akontozahlungen) zu erstellen. Die Erstellung der Abschlagsrechnung beginnt dabei immer im Auftrag, in dem Höhe und Anzahl der

Mehr