Entwurf und Implementierung einer Web-Test Anwendung

Technische Universität Darmstadt Fachbereich Informatik Fachgebiet: Theoretische Informatik Prof. Dr. Johannes Buchmann Entwurf und Implementierung einer Web-Test Anwendung und Integrierung in die Eclipse IDE Diplomarbeit Tekla Kiss und Alexander Grahl Betreuer: Markus Ruppert 25. Juni 2004 Vorwort Testen ist eine Last! Das behaupten zumindest die Meisten, die mit Softwareentwicklung zu tun haben. Testen wird häufig als wenig kreativ empfunden, es kostet Zeit, Nachdenken und damit zusätzlich auch noch Geld! Fast alle in der Softwarebranche wissen zwar, wie wichtig Testen ist, versuchen aber dennoch, diesem Problem aus dem Wege zu gehen. Manager, Projektleiter, etc. planen aus Kostengründen oft gar keine oder nur sehr wenig Zeit für das Testen ein. Dieses Vorgehen schlägt in den meisten Fällen zurück, weil durch fehlendes Testen nur mehr Kosten entstehen (z.B. in Form der Wartungskosten). Programmierer stehen ständig unter Zeitdruck und finden kaum die Zeit dafür, sind manchmal zu desinteressiert oder auch zu stolz, um ihre selbsterstellte Software zu testen. In dieser Diplomarbeit wird zwar das Problem „Testen“ nicht gelöst, vielmehr wird eine Automatisierung der „black box“ Testfälle für Webanwendungen ermöglicht. Für die Entwicklung heißt das, dass Tests komfortabel über eine Benutzeroberfläche erstellt, verwaltet und ausgeführt werden können. Programmierer, Tester, bzw. Qualitätsmanager müssen den Testablauf immer noch planen. Diese Tests müssen aber nicht von Hand ausgeführt werden und stehen zur erneuten Ausführung sowie Korrektur immer zur Verfügung. Ein weiterer wichtiger Punkt ist, dass die Testabläufe und Testergebnisse mitdokumentiert werden. So wird eine bessere Nachvollziehbarkeit der Fehler ermöglicht und damit auch eine schnellere, effizientere Korrektur. An dieser Stelle möchten wir Herrn Markus Ruppert für die eröffneten Möglichkeiten und seine Unterstützung bei dieser Arbeit danken. Er hat viele neue Impulse gegeben, dennoch aber gezielt vermieden, uns in der selbstständigen Arbeit einzuschränken. -i- Inhaltsverzeichnis 1 Einleitung...........................................................................................................................................2 1.1 Aufgabenbeschreibung...............................................................................................................2 1.2 Aufbau des Dokuments..............................................................................................................3 2 Einführung ins Testen........................................................................................................................4 2.1 Definitionen...............................................................................................................................4 2.2 White- box Testen......................................................................................................................5 2.2.1 Anweisungsüberdeckungstest............................................................................................6 2.2.2 Zweigüberdeckungstest......................................................................................................8 2.2.3 Pfadüberdeckungstest.........................................................................................................8 2.2.4 Bedingungsüberdeckungstest.............................................................................................9 2.2.5 Zusammenfassung............................................................................................................11 2.3 Black- box Testen....................................................................................................................11 2.3.1 Funktionsabdeckung.........................................................................................................12 2.3.2 Funktionale Äquivalenzklassenbildung...........................................................................13 2.3.3 Grenzwertanalyse.............................................................................................................13 2.3.4 Ursache- Wirkungsgraph..................................................................................................14 2.3.5 Zufallstest.........................................................................................................................15 2.3.6 Fehlererwartung...............................................................................................................16 2.3.7 Zusammenfassung............................................................................................................16 2.4 Tests im Software-Entwicklungsprozess.................................................................................16 2.4.1 Modultest..........................................................................................................................16 2.4.2 Integrationstest.................................................................................................................17 2.4.3 Systemtest.........................................................................................................................17 2.4.4 Abnahmetest.....................................................................................................................19 2.4.5 Zusammenfassung............................................................................................................20 3 Einführung Software Komponenten................................................................................................21 3.1 Definition.................................................................................................................................21 3.2 Verwendung.............................................................................................................................22 3.2.1 Vorteile.............................................................................................................................22 3.2.2 Nachteile..........................................................................................................................23 3.3 Zusammenfassung....................................................................................................................24 4 Einführung Plugins..........................................................................................................................25 4.1 Definition.................................................................................................................................25 4.2 Eclipse......................................................................................................................................26 4.2.1 Architektur.......................................................................................................................26 4.2.2 Plugin-Model....................................................................................................................31 4.3 Vorteile....................................................................................................................................34 4.4 Nachteile..................................................................................................................................34 4.5 Zusammenfassung....................................................................................................................35 5 Planung Testausführer.....................................................................................................................36 5.1 Vorüberlegungen......................................................................................................................36 5.1.1 HTML...............................................................................................................................36 5.1.2 XML.................................................................................................................................37 5.2 Simulation des Browserzugriffs...............................................................................................38 5.2.1 HttpUnit............................................................................................................................39 5.2.2 HtmlUnit..........................................................................................................................40 5.2.3 JwebUnit..........................................................................................................................41 5.3 Anwendungsbereich.................................................................................................................42 5.4 Anforderungen.........................................................................................................................43 - ii - 5.5 Teststruktur..............................................................................................................................44 6 Planung Plugin.................................................................................................................................47 6.1 Vorüberlegung.........................................................................................................................47 6.1.1 XML Unterstützung.........................................................................................................48 6.1.2 Editoren............................................................................................................................49 6.1.3 Navigation und Ansichten................................................................................................50 6.1.4 Darstellung der Testergebnisse........................................................................................51 6.1.5 Hilfe..................................................................................................................................52 6.1.6 Refactoring.......................................................................................................................53 6.1.7 Andere Werkzeuge...........................................................................................................54 6.1.8 Zusammenfassung............................................................................................................54 7 Umsetzung Testausführer................................................................................................................56 7.1 Architektur...............................................................................................................................56 7.1.1 Konfiguration...................................................................................................................57 7.1.2 Steuerung..........................................................................................................................57 7.1.3 HTML Elemente..............................................................................................................58 7.1.4 Fehler................................................................................................................................59 7.2 Testsammlungsdatei.................................................................................................................60 7.2.1 Definition.........................................................................................................................60 7.2.2 Ausführung.......................................................................................................................60 7.2.3 Fehlerbehandlung.............................................................................................................60 7.2.4 Beispiel.............................................................................................................................61 7.3 Testdatei...................................................................................................................................62 7.3.1 Definition.........................................................................................................................62 7.3.2 Ausführung.......................................................................................................................62 7.3.3 Fehlerbehandlung.............................................................................................................63 7.3.4 Beispiel.............................................................................................................................64 7.4 Moduldatei...............................................................................................................................65 7.4.1 Definition.........................................................................................................................65 7.4.2 Ausführung.......................................................................................................................65 7.4.3 Fehlerbehandlung.............................................................................................................66 7.4.4 Beispiel.............................................................................................................................66 7.5 Schnittstellen............................................................................................................................66 7.5.1 Assert................................................................................................................................66 7.5.2 Massentest........................................................................................................................69 7.5.3 Logger..............................................................................................................................72 8 Umsetzung Plugin............................................................................................................................74 8.1 Architektur...............................................................................................................................74 8.2 Plugin Struktur.........................................................................................................................75 8.2.1 Feature..............................................................................................................................75 8.2.2 Kern..................................................................................................................................76 8.2.3 Allgemeine Oberfläche....................................................................................................80 8.2.4 Editoren............................................................................................................................85 8.2.5 Hilfe..................................................................................................................................91 8.2.6 Update Site.......................................................................................................................93 9 Anwendungsbeispiel........................................................................................................................94 9.1 Testumgebung..........................................................................................................................94 9.2 Teststruktur..............................................................................................................................94 9.3 Testergebnis.............................................................................................................................95 10 Ausblick.........................................................................................................................................96 - iii - Abbildungsverzeichnis Abbildung 1 Programmgraph...............................................................................................................6 Abbildung 2 Programmgraph für Fakultätsberechnung.......................................................................7 Abbildung 3 Kategorien des "white- box Testens"............................................................................11 Abbildung 4 Funktionale Testfallmatrix............................................................................................13 Abbildung 5 Ursache- Wirkungsgraph...............................................................................................15 Abbildung 6 Entscheidungstabelle zum Ursache- Wirkungsgraph....................................................15 Abbildung 7 Kategorien von Testaufgaben........................................................................................20 Abbildung: 8 Eclipse Plattform Architekur........................................................................................27 Abbildung: 9 Workspace Resourcemapping......................................................................................28 Abbildung: 10 Model-View-Controller..............................................................................................30 Abbildung 11 Anwendbarkeit von "black-box" Tests........................................................................42 Abbildung 12 XML Struktur des Entwicklungsprozesses..................................................................45 Abbildung 13 Eclipse: Model-View-Controller.................................................................................48 Abbildung 14 Digester XML- / Objektstruktur..................................................................................49 Abbildung 15 Eclipse: PDE Editor.....................................................................................................49 Abbildung 16 Eclipse: PDE Editor Registerkarten............................................................................50 Abbildung 17 Eclipse: Navigator für Resourcen................................................................................51 Abbildung 18 Eclipse: Ansicht der Eigenschaften.............................................................................51 Abbildung 19 Eclipse: Anischt JUnit.................................................................................................52 Abbildung 20 Eclipse: Kontexthilfe...................................................................................................52 Abbildung 21 Eclipse: Onlinehilfe.....................................................................................................53 Abbildung 22 Eclipse: Java Rename Dialog......................................................................................54 Abbildung 23 Architektur des Testausführers....................................................................................56 Abbildung 24 Architektur WebTest Plugin........................................................................................74 Abbildung 25 Verwendung von Features...........................................................................................76 Abbildung 26 WebTest initial Perspektive.........................................................................................81 Abbildung 27 UI Plugin: Präferenzseite.............................................................................................82 Abbildung 28 Verwendung von Actions............................................................................................83 Abbildung 29 Verwendung von Natures............................................................................................84 Abbildung 30 Ansicht WebTest Navigator........................................................................................85 Abbildung 31 Editor: Testsammlung.................................................................................................86 Abbildung 32 Editor: Testsammlung Quellkode................................................................................87 Abbildung 33 Editor: Kodevervollständigung....................................................................................88 Abbildung 34 Editor: Übersichtsregisterkarte....................................................................................88 Abbildung 35 Eigenschaftsanzeige.....................................................................................................89 Abbildung 36 Eigenschaftsanzeige: Listenfeld..................................................................................90 Abbildung 37 WebTest Hilfe.............................................................................................................91 Abbildung 38 Kontexthilfe im Editor.................................................................................................92 Abbildung 39 Installation: Update Manager öffnen.............................................................................4 Abbildung 40 Installation: Site Bookmark erstellen............................................................................5 - iv - Abbildung 41 Installation: Feature auswählen.....................................................................................5 Abbildung 42 Installation: Feature Dialog...........................................................................................6 Abbildung 43 Struktur der HTML Testverfolgung ...........................................................................11 -v- Literaturverzeichnis [Bal89] Helmut Balzert, Die Entwicklung von Software-Systemen: Prinizpien - Methoden Sprachen - Werkzeuge, 1989, Wissentschaftsverlag, ISBN 3411016183 [Bal98] Helmut Balzert, Lehrbuch der Software- Technik: Software- Management, SoftwareQualitätssicherung, Unternehmensmodellierung, 1998, Spektrum Akademischer Verlag, ISBN 3827400651 [Bol03] Azad Bolour, Notes on the Eclipse Plug-in Architecture, 2003, http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html [Dig04] Apache Software Foundations, Commons Digester, 2004, http://jakarta.apache.org/commons/digester/ [Ecl03a] Object Technology International, Inc., Eclipse PlatformTechnical Overview, 2001, -, http://www.eclipse.org/whitepapers/eclipse-overview.pdf [Ecl04] Eclipse.org, Eclipse, 2004, http://www.eclipse.org/ [Equi04] Eclipse.org, equinox, 2004, http://www.eclipse.org/equinox/index.html [FlexSec04] FlexSecure, Bausteine für Public-Key-Infrastrukturen, 2004, http://www.flexsecure.de/ojava/home.html [Gam95] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object-Oriented Software, 1995, Addison-Wesley, ISBN 0201633612 [Html01] Stefan Münz, SELFHTML, 2001, http://de.selfhtml.org [Java04] Sun Microsystems, Java, 2004, http://java.sun.com/ [Junit04] Junit.org, Junit, 2004, http://www.junit.org/index.htm [Kun98] Kuno Dünhölter, Das Web automatisieren mit XML, 1998, http://members.aol.com/xmldoku/ [Link02] Johannes Link, Unit Tests mit Java, 2002, dpunkt.verlag, ISBN 3898641503 [Log4j04] Apache Software Foundations, Logging services, 2004, http://logging.apache.org [Mmv03] Klaus Marquardt, Markus Völter, Plug-Ins - applikationsspezifische Komponenten, 2003, JavaSpektrum, [Mye95] ISBN - Glenford J. Myers, Methodisches Testen von Programmen, 1995, Oldenburg Verlag, [Sam97] Johannes Sametinger, Software Engineering with Reusable Components, 1997, Springer, ISBN 3540626956 [Sch03] Jörn Schumacher, Eine Plugin-Architektur für Renew - Konzepte, Methoden, Umsetzung, Universität Hamburg, Fachbereich Informatik, Arbeisgebiet TGI, 2003 [Sha03] Sherry Shavor, Jim D´Anjou, Scott Fairbrother, Dan Kehn, John Kellerman, Pa, The Java Developer´s Guide to Eclipse, 2003, Addison-Wesley, ISBN 0321159640 [Sin01] Vipan Singla, Don't Use System.out.println!Use Log4j, 2001, -, http://logging.apache.org/log4j/docs/documentation.html [Som98] Alan Sommerer, The Java Archive (JAR) File Format, 1998, http://java.sun.com/developer/Books/javaprogramming/JAR/ - vi - [Wal90] Ernest Wallmüller, Software- Qualitätssicherung, 1990, Carl Hanser Verlag, ISBN 3446158464 [Wiki04] Wikipedia, Wikipedia die freie Enzyklopädie, 2004, http://de.wikipedia.org/wiki/Metasprache - vii - Ehrenwörtliche Erklärung Hiermit versichern wir, die vorliegende Diplomarbeit ohne Hilfe Dritter und nur mit den angegebenen Quellen und Hilfsmitteln angefertigt zu haben. Alle Stellen, die aus den Quellen entnommen wurden, sind als solche kenntlich gemacht worden. Diese Arbeit hat in gleicher oder ähnlicher Form noch keiner Prüfungsbehörde vorgelegen. Darmstadt, Juni 2004 ___________________ Tekla Kiss __________________ Alexander Grahl -1- Kapitel 1 : Einleitung 1 Einleitung Das Motiv für die Wahl dieses Themas war die Arbeit. Immer wieder war zu erkennen, dass Webanwendungen gar nicht oder nur „per Hand“ getestet wurden. Dieses „per Hand“ Testverfahren ist allerdings aus mehreren Gründen sehr unbefriedigend: 1. Geringe Motivation des Testers, da es eine monotone, uninteressante Arbeit darstellt, nämlich:“ Webseite aufmachen, ausfüllen, abschicken, Ergebnis prüfen“....und das 1000 mal am Tag! 2. Es ist unzuverlässig. Menschen machen Fehler, bemerken kleine Änderungen nicht immer, bekommen die internen Fehler oft nicht in der Oberfläche zu sehen! 3. Es werden oft keine aussagekräftigen Protokolle über Testausführung, Testablauf und Erfolg oder Misserfolg des Testens geführt! 4. Fehler können oft nicht von den Entwicklern nachvollzogen werden und sind dadurch nicht reproduzierbar. 5. Der Testablauf geht nach der Ausführung verloren; er steht danach nicht nochmals einzeln oder zusammen zur Verfügung. 6. Tests sind insgesamt sehr zeitaufwändig durchzuführen, insbesondere Massentests. Man kann also zusammenfassen, dass diese intuitive Art des Testens sicher noch einiger Verbesserungen bedarf. 1.1 Aufgabenbeschreibung Nachdem wir uns auf dem Markt umgesehen hatten, fanden wir heraus, dass die vorhandenen Werkzeuge zum Testen von Webanwendungen nicht unseren Vorstellungen entsprachen. Sie boten häufig nicht genügend Flexibilität und Funktionen oder waren einfach nicht komfortabel zu bedienen. Es kam auch vor, dass für die Verwendung der Software hohe Preise verlangt wurden und dadurch der Einsatz in kleineren Projekten verhindert wurde. Als Konsequenz daraus wollen wir ein Werkzeug erstellen, das die zuvor aufgeführten Mängel nicht hat und in einem breiten Spektrum von Webanwendungen zum Testen eingesetzt werden kann. Folgende Ansprüche setzen wir an unsere Anwendung: 1. Ohne großen Aufwand, schnell einfache Testfälle erstellen. 2. Hohe Flexibilität beim Strukturieren der Testfälle. 3. Breites Angebot zur Verwendung von Schnittstellen zum Einbinden eigener Überprüfungsmethoden, Massendaten und Loggern. 4. Unterstützung beim Erstellen der Tests durch eine graphische Oberfläche. 5. Aussagekräftige Fehlerprotokolle über Ablauf und Ergebnis. Bei der Konzeptierung der Software sollte so weit wie möglich auf vorhandene Implementationen zurückgegriffen werden, um schnell einen Prototyp zu entwickeln. Nur an Stellen, wo vorhandene Werkzeuge oder Bibliotheken keine ausreichende Unterstützung bieten, muss eine eigene Implementation erfolgen. Die Software wird sich dabei in drei Teile gliedern: -2- Kapitel 1 : Einleitung 1. Definition von Testabläufen und deren Speicherformat. 2. Programm zum Ausführen der Tests. 3. Oberfläche zum Erstellen und Bearbeiten der Tests. Die Punkte zwei und drei werden von verschiedenen Personen entwickelt. Der Datenaustausch zwischen den verschiedenen Anwendungen wird in Punkt >1< durch die festgelegten Definitionen und Speicherformate ermöglicht. Die Entwicklung dieser Schnittstelle muss gemeinsam erfolgen. 1.2 Aufbau des Dokuments Dieses Kapitel (1 Einleitung Seite 2) beschreibt die Motivation und Aufgabenstellung dieser Diplomarbeit. Um das Verständnis der eigentlichen Arbeit zu erleichtern, wird eine kurze theoretische Einführung in die Materie des Testens (Kapitel 2 Einführung ins Testen Seite 4) und der Verwendung von Komponenten und Plugins (Kapitel 3 Einführung Software Komponenten Seite 21 und Kapitel 4 Einführung Plugins Seite 25) gegeben. Zum Einen gibt es eine Einführung, warum Testen eine so wichtige Rolle zugeordnet werden sollte, zum Anderen werden verschiedene Testarten beleuchtet und deren Vor- bzw. Nachteile aufgeführt. Bei der Einführung in Komponenten und Plugins soll dann ein Grundverständnis geschaffen werden, was eine Komponente bzw. Plugin ist und welche Vor- oder Nachteile bei ihrer Verwendung entstehen. Es folgt dann die Planungsphase unseres Werkzeuges (Kapitel 5 und 6). Die theoretischen Grundlagen der vorherigen Kapitel bilden hier die Basis für bestimmte Designentscheidungen. In den Kapiteln der Umsetzung (Kapitel 7 und 8) geht es dann um die Implementierung unseres Konzeptes. Der in der Planung festgelegte Aufbau und die definierten Ziele werden in konkrete Implementationen umgesetzt. Dabei werden auch Schwierigkeiten bei der Umsetzung und deren Lösung aufgezeigt. Im Anwendungsbeispiel (Kapitel 9) wird unser Prototyp zum Testen der FlexiTrust Webschnittstelle verwendet. Es soll dabei die Funktion und Tauglichkeit unserer Software zum Testen demonstriert werden. Im letzten Kapitel (Kapitel 10) geben wir eine kurze Zusammenfassung unserer Ergebnisse. Dabei geht es darum, in wie weit wir unsere Ziele erreicht haben und wo noch Verbesserungen statt zu finden haben. Es soll auch betrachtet werden, wo die Entwicklung noch hingehen könnte. Da die Diplomarbeit von zwei Personen erstellt wurde, finden sie im Anhang eine Übersicht der von den Personen bearbeiteten Kapitel. -3- Kapitel 2 : Einführung ins Testen 2 Einführung ins Testen In diesem Kapitel wird eine kleine Einführung ins Testen gegeben. Diese fängt mit der Begriffsklärung an. Hier werden die Definitionen für wichtige Begriffe, wie Testen, Fehler, Testfall etc. angegeben und die Ziele des Testens diskutiert. Dem folgen die Beschreibungen von den zwei Hauptkategorien des Testens: „white- box“ Testen und „black-box“ Testen. Schließlich wird ein Einblick in verschiedenen Testarten im Rahmen des Software- Entwicklungsprozesses gewährt. 2.1 Definitionen Um von Testen reden zu können, müssen wir erst definieren, was „Testen“ ist. Ein allgemeiner Irrtum unter Entwicklern und Managern ist es oft, dass Testen zeigen soll, dass die Software funktioniert. Das ist aber nicht das Ziel des Testens! „Testen ist der Prozeß, ein Programm mit der Absicht auszuführen, Fehler zu finden!“[Mye95] Wie man leicht erkennen kann, ist Testen ein kontraproduktiver Prozess zur Entwicklung. Dies ist wohl der Grund dafür, dass Entwickler ungern und nicht ausreichend gut ihre Code testen wollen, bzw. können. Testen allgemein sollte im Idealfall folgende Ziele verfolgen:[Wal90] • Mit jedem Test müssen sinnvolle, vordefinierte Ziele erreicht werden. Testen ohne Plan ist eine Vergeudung von Zeit und Geld. • Testziele müssen erreichbar und messbar definiert sein. • Für jeden Test muss ein Endekriterium vorgesehen werden. • Jedes Testergebnis muss kontrolliert werden. Was sind aber eigentlich die Fehler, um dessen Auffindung es geht? „Ein Fehler ist... • • eine Abweichung zwischen Ist-Verhalten ( im Testlauf festgestellt) und Soll-Verhalten ( in der Spezifikation gefordert). nicht erfülltes, vom Kunden vorausgesetztes, Qualitätskriterium“[Bal98]. Jetzt bleibt noch die Frage, wie ein Test erstellt, bzw. wie er beschrieben werden kann, damit er ausführbar wird? Die Beschreibung des Tests heißt Testfall und wird folgendermaßen definiert. „Ein Testfall ist: Ein Satz von Testdaten, der die vollständige Ausführung des zu testenden Programmes verursacht.“[Bal98]. „Ein Testdatum ist: -4- Kapitel 2 : Einführung ins Testen Ein Satz von Eingabe-und Zustandswerten für einen Softwareobjekt mit zugehörigen Ausgabe- Sollwerten.“[Bal98]. Die einfachste Art des Testens ist, die Software mit Zufallseingaben zu versorgen und so auszuführen. Diese Testart lässt allerdings viel zu wünschen übrig. Wie schon erwähnt wurde, geht es bei der Auswahl der Testfälle darum, möglichst viele Fehler aufzudecken. Laut Erfahrung wird aber mit Zufallseingaben nur ein sehr geringer Anteil der Fehler aufgedeckt. Es werden also Vorgehensweisen gebraucht, die eine systematische Wahl der Testfälle erlauben, so dass die gewählten Testfälle mit hoher Wahrscheinlichkeit Fehler finden. Nach der Methode der Testfallunterscheidung werden zwei Hauptkategorien des Testens unterschieden: • White-box Testen (Code ist bekannt!) • Black-box Testen (Code ist unbekannt!) 2.2 White- box Testen Beim „white- box Test“ steht dem Tester der gesamte Quellcode zur Verfügung. Mit Hilfe dieser Kenntnisse werden die Testfälle erstellt. Es wird also die interne Umsetzung der Spezifikation, die korrekte Implementierung der einzelnen Methoden, bzw. Einheiten getestet. Ein großer Nachteil dieses Testens ist, dass die Spezifikation an sich nicht geprüft wird. Erwartete Kenntnisse des Testers: • technische Umsetzung der Anwendung • Programmiersprach-, Programmierkentnisse • Fehleranalyse Um das Testen sinnvoll unterstützen zu können, wird die Programmstruktur als Programmgraph dargestellt. „Ein Programmgraph ist ein gerichteter Graph. Jede Anweisung wird als Knoten im Graph dargestellt. Jeder mögliche Kontrollfluss von einer Anweisung zur Nächsten wird durch eine Kante dargestellt.“ [Bal89] • Beispiel: Ein einfacher Programmgraph mit 220 Pfaden -5- Kapitel 2 : Einführung ins Testen Abbildung 1 Programmgraph Um alle Fehler in der Implementierung aufzudecken, wäre ein erschöpfender Pfadtest notwendig. Dieser schreibt vor, dass im Programm alle möglichen logischen Pfade getestet werden sollen. Da die Anzahl der logischen Pfade sehr schnell zu hoch wird, ist ein solcher Test aus finanziellen, aber auch zeitlichen Gründen nicht realisierbar. So wird nach anderen Strategien gesucht, um ein möglichst überdeckendes, aber auch machbares Testen zu ermöglichen. [Bal98] 2.2.1 Anweisungsüberdeckungstest Der Anweisungsüberdeckungstest fordert, dass jede Anweisung des Programms mindestens einmal ausgeführt wird. Dabei werden Sprünge, Entscheidungen, und Schleifen außer Acht gelassen. -6- Kapitel 2 : Einführung ins Testen Start ja (a) nein N<0 ja FAK=-1 (c) (d) (b) FAK=1 nein N=0 ja (f) (g) nein N=1 (h) FAK=N K=N-1 (i) (k) (e) ja (j) FAK=FAK*K K=K-1 FAKULTAET=FAK K<>0 nein (l) Ende Abbildung 2 Programmgraph für Fakultätsberechnung Für den Programmgraphen heißt es, dass alle Knoten außer den Entscheidungsknoten (Knoten mit mehreren Ausgangspfeilen) mindestens einmal ausgeführt werden müssen. • Beispiel: Fakultät berechnen Abbildung 1 Programmgraph Testfälle: • N= -1 => Sollergebnis= -1, Pfad: a, b (hellgraue Kasten) • N= 0 => Sollergebnis= 1, Pfad: c, d, e (mittelgraue Kasten) • N= 2 => Sollergebnis= 2, Pfad: c, g, h, i, j, k, l (dunkelgraue Kasten) Der Anweisungsüberdeckungstest stellt nur sicher, dass keine Anweisungen existieren, die nie -7- Kapitel 2 : Einführung ins Testen ausgeführt werden und hat damit eine sehr geringe Fehleridentifizierungsquote. So ist dieser Test ein notwendiges, aber nicht ausreichendes Testkriterium. 2.2.2 Zweigüberdeckungstest Dieser Test erfasst alle Sprünge und Entscheidungen im Programm. Das entspricht mindestens einer Ausführung aller Kanten, sprich aller Pfeile im Programmgraph. • Beispiel: Fakultät berechnen Abbildung 1 Programmgraph Testfälle: • N= -1 => Sollergebnis= -1, Pfad: a, b (hellgraue Pfeile) • N= 0 => Sollergebnis= 1, Pfad: c, d, e (mittelgraue Pfeile) • N= 2 => Sollergebnis= 2, Pfad: c, g, h, i, j, k, l (dunkelgraue Pfeile) • N= 1 => Sollergebnis= 1, Pfad: c, g, f, e (restliche Pfeile) Dieser Test stellt sicher, dass keine Zweige existieren, die nie ausgeführt wurden. Kombinationen von Zweigen und komplexere Bedingungen werden nicht berücksichtigt. Schleifen werden nicht ausreichend getestet. Der Zweigsüberdeckungstest enthält vollständig den Anweisungsüberdeckungstest und gilt als das minimale Testkriterium. 2.2.3 Pfadüberdeckungstest Der Pfadüberdeckungstest deckt alle Pfade zwischen Ausgangspunkt und Endpunkt ab. Das bedeutet, dass hier auch alle Schleifen beachtet werden. Zwei Pfade gelten als gleich, wenn die Anweisungen paarweise identisch und die Länge des Pfades gleich ist. • Beispiel: Fakultät berechnen Abbildung 1 Programmgraph Testfälle: • N= -1 => Sollergebnis= -1, Pfad: a, b • N= 0 => Sollergebnis= 1, Pfad: c, d, e • N= 1 => Sollergebnis= 1, Pfad: c, g, f, e • N= 2 => Sollergebnis= 2, Pfad: c, g, h, i, j, k, l • N=3 => Sollergebnis= 6, -8- Kapitel 2 : Einführung ins Testen Pfad: c, g, h, i, j, k, j, k, l • N=4 ... • .... Dieses ist das mächtigste der beschriebenen Testverfahren, er enthält vollständig den zuvor beschriebenen Zweigüberdeckungstest. Er ist leider nicht praktikabel; insbesondere auf Grund der entstehenden Testfallanzahl. Die Anzahl der Pfade expandiert bei verschiedenen Bedingungen innerhalb des Schleifenkörpers exponentiell. Es ist daher oft nicht möglich, alle entstehende Testfälle auszuführen. Um dieses Problem zu lösen, wurden zwei Unterarten dieses Tests definiert. Das Ziel dabei ist, Schleifen ausreichend, aber nicht vollständig (mit allen möglichen Pfaden) zu testen. 2.2.3.1 Boundary-interior Pfadtest Dieser ist eine eingeschränkte, schwächere Variante des Pfadüberdeckungstests. Beim Testen der Schleifen wird auf die Überprüfung der Pfade verzichtet, die durch mehr als einmalige Schleifenwiederholung entstehen. Für jede Schleife entstehen dabei zwei Gruppen von Pfaden: 1. Grenztest (boundary test) Hier werden alle Pfade ausgeführt, die die Schleife zwar betreten, sie aber nicht wiederholen. 2. Test des Schleifeninneren (innerior test) Hier werden alle Pfade ausgeführt, die genau eine Wiederholung der Schleife enthalten. 2.2.3.2 Strukturierter Pfadtest Dieser Test ist eine Verallgemeinerung des boundary-interior Tests. Hierbei werden alle Pfade der innersten Schleife nicht häufiger, als k- mal ausgeführt. 1. Der Grenztest findet wie beschrieben statt. 2. Beim Test des Schleifeninneren werden alle Pfade ausgeführt, die höchstens k Wiederholungen der Schleife enthalten. 2.2.4 Bedingungsüberdeckungstest Im Bedingungsüberdeckungstest werden die Bedingungen in den Wiederholungs- und Auswahlstrukturen zur Definition der Testfälle herangezogen. Bei der Testdefinition spielt die Definition der atomaren Bedingung eine große, wichtige Rolle. [Bal98] „Eine atomare Bedingung ist eine Bedingung, die keine untergeordneten Bedingungen enthält.“ [Bal98] Dieser Testart hat drei Ausprägungen, die im Folgenden beschrieben werden. 2.2.4.1 Einfacher Bedingungsüberdeckungstest Alle atomaren Bedingungen müssen mindestens einmal den Wahrheitswert true und einmal den Wert false annehmen. • Beispiel 1: Aufteilung der Bedingung in atomaren Bedingungen von ( ((a<5) ODER (a>12)) UND -9- Kapitel 2 : Einführung ins Testen (b<=3) ) Die atomaren Bedingungen hier wären (a<5), (a>12) und (b<=3). • Beispiel 2: Bestimmen der Testfälle für die Bedingung ( (a>5) UND (b= =1) ). Die atomaren Bedingungen wären (a>5) und (b= =1). Damit würden die folgenden zwei Testfälle ausreichen: • a=5 (false), b=1 (true) => Gesamtbedingung false • a=6 (true), b=0 (false) => Gesamtbedingung false Wie am Beispiel 2 leicht erkennbar ist, enthält diese Testart nicht den Zweigsüberdeckungstest (da nicht beide Pfade false und true abgedeckt wurden) und reicht damit nicht als minimales Testkriterium aus. 2.2.4.2 Mehrfacher Bedingungsüberdeckungstest Bei dieser Testart werden alle Variationen aus den atomaren Bedingungen gebildet. Bei n atomaren Bedingungen ergibt das eine Testanzahl von 2n. • Beispiel:Bestimmen der Testfälle für die Bedingung ( (a>5) UND (b= =1) ). Die atomaren Bedingungen seien (a>5) und (b= =1). Damit würden sich 22= 4 Tesfälle ergeben. Diese könnten die Folgenden sein: • a=5 (false), b=0 (false) => Gesamtbedingung false • a=5 (false), b=1 (true) => Gesamtbedingung false • a=6 (true), b=0 (false) => Gesamtbedingung false • a=6 (true), b=1 (true) => Gesamtbedingung true Diese Testart enthält den Zweigsüberdeckungstest und kann so als minimales Testkriterium benutzt werden. Sie ist aufwendig zu realisieren und setzt die Identifikation von nicht möglichen Bedingungskombinationen heraus. Da fehlende Kombinationen nicht unbedingt als Fehler im Programm zu verstehen sind, ist die Testbeurteilung dieser Methode schwierig. 2.2.4.3 Minimal mehrfacher Bedingungsüberdeckungstest Jede Bedingung (ob atomar oder nicht) muss mindestens einmal den Wahrheitswert true und einmal den Wert false annehmen. • Beispiel: Bestimmen der Testfälle für die Bedingung ( (a>5) UND (b= =1) ) Die atomare Bedingungen wären (a>5) und (b= =1). Damit würden die folgenden zwei Testfälle ausreichen: • a=5 (false), b=0 (false) => Gesamtbedingung false • a=6 (true), b=1 (true) => Gesamtbedingung true Dieser Test enthält den Zweigsüberdeckungstest, und deckt damit auch das minimale Testkriterium ab. Er ist eine sinnvolle Erweiterung des Zweigsüberdeckungstests, da durch diese Testart mehr Fehler aufgedeckt werden können. - 10 - Kapitel 2 : Einführung ins Testen 2.2.5 Zusammenfassung Es wurden viele Verfahren entwickelt um „white- box Testen“ anwendbar und finanzierbar zu machen. Eine Übersicht dafür bietet Abbildung 3 Kategorien des "white- box Testens". Abbildung 3 Kategorien des "white- box Testens" Auf dieser Abbildung ist leicht zu erkennen, welche Testverfahren welche Mächtigkeit aufweisen. Um mindestens das minimale Testkriterium zu erreichen, muss ein Testverfahren gewählt werden, das über dem Zweigsüberdeckungstest liegt (bzw. den Zweigüberdeckungstest erhält). Es ist dabei weiterhin zu beachten, dass auch der mächtigste Test, der Pfadüberdeckungstest, keine Fehlerfreiheit garantiert. Gründe dafür können sein: [Wal90] • Das Programm entspricht nicht der Spezifikation. • Fehlende Pfade im Programm. 2.3 Black- box Testen Beim „black- box“ Testen steht dem Tester nur die Spezifikation der Anwendung zur Verfügung. Aus der Spezifikation werden die Testfälle generiert bzw. abgeleitet. Den Code kennt der Tester nicht oder vorhandene Codekenntnisse werden nicht benutzt. Das heißt also, dass nur die äußere Struktur getestet wird und nicht die interne Umsetzung. [Bal98] Um alle Fehler zu finden, sollte man einen vollständigen Eingabetest durchführen. Diese Testart verlangt, dass das Programm mit allen möglichen (insbesondere auch mit ungültigen Eingaben) getestet wird. • Beispiel: Multiplikation von zwei ganzen Zahlwerten - 11 - Kapitel 2 : Einführung ins Testen Hier hätte man die Testfälle: • Ganze Zahl, Ganze Zahl => gültige Eingabe • Integer, Kommazahl => ungültige Eingabe • Kommazahl, Kommazahl => ungültige Eingabe • Zeichenkette, Zahl => ungültige Eingabe • ... Es ist leicht einzusehen, dass diese Methode schon bei einfachen Programmen einen zu großen Zeitaufwand verlangt und dadurch natürlich sehr hohe Kosten verursacht. Es werden also Mechanismen gebraucht, um eine „sinnvolle“ Menge der Testfälle auszuwählen. Als „sinnvollen“ Testfall werden die Testabläufe angesehen, die mit großer Wahrscheinlichkeit einen Fehler aufdecken könnten. Erwartete Kenntnisse des Testers: • Spezifikation der Anwendung • möglichst keine Programmiersprache-, Programmierkentnisse • Fehleranalyse • Benutzbarkeits-, Ablauf-, Menschenfehleranalyse • Kundenerwartung 2.3.1 Funktionsabdeckung Bei dieser Testart werden die Funktionen auf ihr Vorhandensein und Funktionalität geprüft. Es wird dabei auf das Normalverhalten des Testobjekts getestet. Keine spezielle Werte, Ausnahmefälle, etc. [Wal90] Allgemeine Vorgehensweise: 1. Anhand konkreter Anwendungsfälle die Funktionen des Testobjekts identifizieren. 2. Für jede Funktion eine Ein- und Ausgabespezifikation erstellen. 3. Testfälle definieren, so dass jede Funktion mindestens einmal abgedeckt wird. Um diese Testfallerzeugung zu veranschaulichen, wird als Hilfsmittel die sogenannte funktionale Testfallmatrix erzeugt. Die einzelnen Zeilen geben die Funktionen zum Testen an, die Spalten die auszuführenden Testfälle. Sie kann helfen die Testfallanzahl zu minimieren. - 12 - Kapitel 2 : Einführung ins Testen Funktion Testfälle 1 Kundenstamm initialisieren 2 3 x x 4 5 6 x Kundenstamm aktualisieren x Kundenstamm ausgeben Kundenstamm löschen x x x x x x Abbildung 4 Funktionale Testfallmatrix • Beispiel: Minimierung der Testfälle Abbildung 4 Funktionale Testfallmatrix Anhand der Testfallmatrix muss pro Zeile nur ein „x“ erscheinen. => beim Weglassen der Testfälle 4, 5, 6 ist dieses Kriterium immer noch erfüllt. 2.3.2 Funktionale Äquivalenzklassenbildung Hier werden Definitionsbereich, Wertebereich in Äquivalenzklassen zerlegt. Dabei wird angenommen, dass Elemente in einer Äquivalenzklasse gleich reagieren. Es sollte nach der Zerlegung aus jeder Klasse ein beliebiger Testfall getestet werden. Allgemeine Vorgehensweise: 1. Bestimmung der Äquivalenzklassen (sowohl für den Definitions- als auch für den Wertebereich) 2. Bestimmung der Testfälle (Wahl eines Vertreters aus jeder Äquivalenzklasse.) 3. Prüfung auf Vollständigkeit von den Äquivalenzklassen (Die Äquivalenzklassen dürfen sich auch überschneiden, sind also nicht im strengen, mathematischen Sinne zu verstehen.) Die Äquivalenzklassenbildung ist ein geeignetes Verfahren um aus Spezifikationen geeignete Testfälle abzuleiten. Es werden nur einzelne Eingaben oder Ausgaben betrachtet. Wechselbeziehungen und Abhängigkeiten zwischen den Werten werden nicht kontrolliert. • Beispiel: Fakultät von einer ganzen Zahl zwischen 0 und 10 Hier hätte man die Äquivalenzklassen und damit Testfälle: • 0 <= Zahl <= 10 (z.B. 6) => gültige Eingabe • Zahl < 0 (z.B. -4) => ungültige Eingabe • Zahl > 10 (z.B. 13) => ungültige Eingabe 2.3.3 Grenzwertanalyse Grenzwertanalyse ist eine Erweiterung der funktionalen Äquivalenzbildung. Hier werden Definitionsbereich und Wertebereich auch in Äquivalenzklassen aufgeteilt. Die Auswahl der - 13 - Kapitel 2 : Einführung ins Testen Testfälle ist nicht beliebig, wie bei der funktionalen Äquivalenzbildung, es werden stattdessen die Grenzen der Äquivalenzklassen getestet. Dieses Verfahren beruht auf der Erkenntnis, dass an den Grenzen häufiger Fehler auftreten, als bei „normalen“ Werten. Allgemeine Vorgehensweise: 1. Bestimmung der Äquivalenzklassen (sowohl für den Definitions- als auch für den Wertebereich) 2. Bestimmung der Testfälle (Nehmen der Grenzwerte in jede Äquivalenzklasse.) 3. Prüfung auf Vollständigkeit der Äquivalenzklassen Die Grenzwertanalyse ist nur dann sinnvoll, wenn die Elemente auf eine natürliche Weise geordnet werden können. Anders formuliert heißt das, dass die Grenzen der Äquivalenzklassen feststellbar sind. • Beispiel: Fakultät von einer ganzen Zahl zwischen 0 und 10 Hier hätte man die Äquivalenzklassen und damit Testfälle: • 0 <= Zahl <= 10 (0 und 10) => gültige Eingabe • Zahl < 0 (-1) => ungültige Eingabe • Zahl > 10 (11) => ungültige Eingabe 2.3.4 Ursache- Wirkungsgraph Ursache- Wirkungsgraph ist eine Methode, die sich nicht nur auf Ein- und Ausgaben konzentriert, wie Äquivalenzklassenbildung oder Grenzwertanalyse. „Ursache- Wirkungsgraph ist ein ungerichteter Graph. Die Knoten bezeichnen die Ursachen und Wirkungen, wobei eine Ursache mit deren Wirkung durch eine Kante verbunden wird. Die Markierungen der Kanten stammen aus der Boole´schen Algebra.“ [Bal98] Hier sind noch ein paar Ergänzungen zu dieser Definition nötig. Eine Ursache ist: eine Eingabebedingung oder eine Äquivalenzklasse von Eingabebedingungen. Eine Wirkung ist: eine Ausgabebedingung, eine Äquivalenzklasse von Ausgabebedingungen, ein Zustandsübergang oder ein Ereignis. Die Markierungen der Kanten können folgende Zeichen sein: Identität, Oder, Und, Negation. Allgemeine Vorgehensweise: 1. Spezifikation wird in einen Graph übersetzt. 2. Der Graph wird in eine Entscheidungstabelle übertragen. 3. Jede Spalte der Tabelle definiert einen Testfall. Ein Vorteil dieser Methode ist , dass eine Kombination von Eingabewerten betrachtet wird. Der Nachteil ist, dass für komplexe Spezifikationen ein Graph schwierig zu erstellen und dadurch sehr fehleranfällig ist. - 14 - Kapitel 2 : Einführung ins Testen • Beispiel: Eine einfache Transaktion Die Eingabemaske der Transaktion besitzt zwei Eingabewerte. Die Spezifikation der Transaktion: • 1. Wert = A oder B und 2. Wert = Ziffer => Update einer Datei • 1. Wert nicht korrekt => Fehlermeldung E12 • 2.Wert kein Ziffer => Fehlermeldung E13 Diese Spezifikation kann den folgenden Graph übersetzen. Siehe Abbildung 5 UrsacheWirkungsgraph. Abbildung 5 Ursache- Wirkungsgraph Aus dem Graphen wird nun die Entscheidungstabelle abgeleitet. Da das Nichterfüllen der OderBindung von den Ursachen 1.Wert=A, 1.Wert= B die gleiche Wirkung aufweist können diese in der Tabelle zusammengezogen werden. Siehe Abbildung 6 Entscheidungstabelle zum UrsacheWirkungsgraph. Testfall 1 Testfall 2 Testfall 3 Testfall 4 0 0 1 1 2.Wert=Ziffer 0 1 0 1 Update - - - x E12 x x - - E13 x - x - 1.Wert=A Ursachen Wirkungen 1.Wert=B Abbildung 6 Entscheidungstabelle zum Ursache- Wirkungsgraph 2.3.5 Zufallstest Beim Zufallstest werden die Eingabedaten per Zufallsgenerator erzeugt und mit den so erzeugten Werten getestet. • Beispiel: Fakultät von einer ganzen Zahl zwischen 0 und 10 Generierte Tests wären zum Beispiel: • Wert = 4 =>gültige Eingabe - 15 - Kapitel 2 : Einführung ins Testen • Wert = 7 =>gültige Eingabe • Wert = -4 , => ungültige Eingabe • ... Obwohl Zufallstests keinen sehr großen Wirkungsgrad aufweisen, sind sie doch ein sehr wichtiger Zusatz zu der Teststrategie. Die Gründe dafür sind psychologisch bedingt. Wenn ein Programmierer seine Arbeit testet oder die Tester im selben Team arbeiten, sind sie eher motiviert zu zeigen, dass die Software funktioniert. Dieses Phänomen bewirkt, dass sie unterbewusst Tests definieren, die mit großer Wahrscheinlichkeit erfolgreich ablaufen und daher eher keine Fehler aufdecken. 2.3.6 Fehlererwartung Dieses Verfahren beruht allein und einzig auf den Erfahrungen und der Intuition des Testers. Er weiß schon aus früheren Erfahrungen bzw. aus Kenntnissen von ähnlichen Modulen bzw. Anwendungen, wo mit größter Wahrscheinlichkeit Fehler auftreten können. Es können zwar mit diesem Testverfahren viele der Probleme aufgedeckt werden (je nach Erfahrungsgrad), man sollte es aber mit anderen Verfahren kombinieren. • Beispiel: Fakultät von einer ganzen Zahl zwischen 0 und 10 Intuitive Tests wären zum Beispiel: • Wert = 0, da es oft ein Problemfall ist =>gültige Eingabe • Wert = 1, da es oft ein Problemfall ist =>gültige Eingabe • Wert = -1, da negative Zahlen auch oft problematisch sind => ungültige Eingabe 2.3.7 Zusammenfassung Es ist erkennbar, dass die Güte des „black- box“ Testen von der Güte der Spezifikation und einer sorgfältigen Testfallauswahl abhängt. Beim „black-box“ Testen können fehlende Funktionen aufgedeckt werden. Auch bei guter Kombinationen der vorgestellten „black-box“ Testmethoden kann keine Fehlerfreiheit erreicht werden. Gründe dafür können sein: [Bal89] • Wenig Vertrauen in die Bestimmung von Äquivalenzklassen (bei der funktionalen Äquivalenzbildung bzw. Grenzwertanalyse). • Hohe Anforderungen an die Qualifikation des Tester (siehe z.B. Ursache-Wirkungsgraph). 2.4 Tests im Software-Entwicklungsprozess Da sowohl die „black-box“ Tests als auch die „white-box“ Tests ihre Vor- und Nachteile haben, sollten beide Kategorien gemischt und miteinander ergänzt angewandt werden ,um ein möglichst optimales Ergebnis zu erreichen. Außerdem sollte Testen nicht nur am Ende des SoftwareEntwicklungsprozesses eingeplant werden, sondern ein projektbegleitendes Ereignis sein. Wie das in der Praxis aussieht, soll in den nächsten Kapiteln erklärt werden. 2.4.1 Modultest Unter Modultest wird der Test der kleinsten Programmiereinheiten, der Module verstanden. Das - 16 - Kapitel 2 : Einführung ins Testen Testen der Module wird im Allgemeinen von seinen Entwicklern durchgeführt, andere, unabhängige Tester sind meist nicht vertreten. Voraussetzung(en): • Modulspezifikation (Was- Beschreibung) => „black-box Testen“ • Feinentwurf (Wie- Beschreibung) => „white-box Testen“ Typische Fehler, die entdeckt werden: • fehlende Pfade • Berechnungsfehler • Domain Fehler (Fehler, die dadurch entstehen, dass falsche Pfade durchlaufen werden.) 2.4.2 Integrationstest Der Integrationstest prüft die fehlerfreie Zusammenarbeit von Systemkomponenten. Es wird dabei mit wenigen Modulen angefangen. Wenn die Tests dafür funktioniert haben, werden neue Module hinzugefügt bis das System komplettiert ist. Diese Testart wird meistens auch von den Entwicklern der Komponenten durchgeführt. Allerdings ist hier schon eine engere Zusammenarbeit der Tester erwünscht als beim Modultest. Voraussetzung(en): • erfolgreicher Modultest von einbezogenen Komponenten • Schnittstellenspezifikation zwischen Komponenten (Was- Beschreibung) => „black-box Testen“ • Feinentwuf (Wie- Beschreibung) => „white-box Testen“ Typische Fehler, die entdeckt werden: • interne / externe Schnittstellenfehler 2.4.3 Systemtest Beim Systemtesten geht es darum, das Gesamtsystem einerseits auf seine funktionalen Leistungen, andererseits auf seine Leistungsfähigkeit zu testen. Systemtests sollten von einer unabhängigen Testgruppe (nicht von den Entwicklern) durchgeführt werden. Dieser Test soll intern in der Entwicklerfirma für die Qualitätsprüfung und Akzeptanz der Gesamtsoftware sorgen. Die Kunden bzw. Auftragsgeber sind typischerweise bei dieser Prüfungsart nicht dabei. Voraussetzung(en): • erfolgreicher Modultests und Integrationstest • Spezifikation des Systems (Was- Beschreibung) => „black-box Testen“ Typische Fehler, die entdeckt werden: • fehlende Funktionalität • nicht erfüllte Qualitätsziele (Performance, ...) Beim Systemtest sind folgende Testarten zu unterscheiden: - 17 - Kapitel 2 : Einführung ins Testen 2.4.3.1 Funktionstest Die Testfälle werden vollständig aus dem Pflichtenheft abgeleitet. Es wird geprüft, ob die geforderten Funktionen vorhanden sind und ob sie korrekt umgesetzt wurden. Dazu gehört unter Anderem auch das Testen der Benutzeroberfläche. 2.4.3.2 Leistungstest Leistungstests sollen die Leistungsfähigkeit des Systems zeigen. Es gibt folgende vier Unterarten: • Massentest Bei Massentests wird das System mit Daten bis zur Leistungsgrenze gefüllt. Dabei wird geprüft, ob die Anwendung eine große Menge Daten mit vordefinierten Werten richtig verarbeiten kann. Diese Testart ist z.B. sehr wichtig für Datenbanken. • Zeittest Bei Zeittests wird die Einhaltung von zeitlichen Restriktionen getestet. Die speziellen Zeitanforderungen können im Pflichtenheft oder in den Spezifikationen beschrieben sein. Diese Testart wird oft mit dem Massentest kombiniert und spielt bei Anwendungen mit einer Datenbankanbindung eine große Rolle. • Lasttest Der Lasttest geht noch weiter. Es wird geprüft, wie das System auf Ausfall von Software- , Hardwarekomponenten, Betrieb mit maximaler Benutzeranzahl oder Eintreffen ungewöhnlicher, widersprüchlicher Daten reagiert. • Stresstest Der Stresstest ist die härteste Variante des Leistungstests. Hier werden die vordefinierten Grenzen des Systems bewußt überschritten. Das kann man z.B. durch Ressourcenentzug ( z.B. weniger Arbeitsspeicher) erreichen. Es soll überprüft werden, wie sich das System bei Überschreitung der Grenzen verhält, und ob es nach Rückgang der Last in den Normalzustand zurückkehrt. 2.4.3.3 Benutzbarkeitstest Bei diesem Testart wird nachgeprüft, ob die Software die Anforderungen der Benutzerschnittstellen erfüllt. Diese könnten beispielsweise sein, ob die Bedienbarkeit der Oberfläche stimmt, die Fehlermeldungen aussagekräftig sind, die Hilfen gut erreichbar und leicht nutzbar sind. Insgesamt soll damit also ein bessere Akzeptanz beim Kunden für die Software geschaffen werden. 2.4.3.4 Sicherheitstest Die Sicherheitstests sollten auch schon während der Entwicklung ausgeführt werden. Diese Tests sollen die Sicherheit des Systems laut Spezifikation, bzw. Pflichtenheft erfüllen. Typischerweise gehören dazu, Sicherung und Übertragung von Passworten, schützen der Datenbank, Zugriffsrechte auf verschiedenen Ebenen. 2.4.3.5 Interoperabilitätstest Da heutzutage kaum noch ein System alleinstehend (standalone) ist, muss auch die Kommunikation und Datenübertragung zu anderen Systemen getestet werden. - 18 - Kapitel 2 : Einführung ins Testen 2.4.3.6 Regressionstest Regressionstest kann ein Beliebiger der vorher beschriebenen Testarten sein. Er hat die zusätzlichen Eigenschaft, dass die Testausführung gespeichert wird und daher jederzeit erneut ausgeführt werden kann. • Automatisierte Regressionstests Automatisiertes Testen wird gebraucht, damit das Testen der Software nicht die Überhand im Projekt gewinnt. Es macht die Software nicht sicherer, hat jedoch trotzdem einige Vorteile gegenüber manuellem Testen. Vorteile: • existierendes Programm erneut testen ist schnell, mit gar keinen oder nur wenigen Änderungen an den Testfällen verbunden • mehr Tests und häufiger ausführbar, als ohne Automatisierung möglich wäre • Last / Stresstest leicht machbar • ermüdende Dateneingaben entfallen • verschiedene Systeme, Systemkonfigurationen sind kein Problem mehr • Zeitspanne für Testphase wird verkleinert Nachteile: • Automatisierung macht wenig Sinn, sofern keine Testphase üblich ist oder kein Testen eingeplant wurde • löst nicht alle Probleme der Software • man wägt sich oft in falscher Sicherheit • es werden im Schnitt nicht mehr Fehler gefunden als ohne Automatisierung • Ablauf des Testens ist zwar automatisiert, aber die Ergebnisse müssen immer noch manuell überprüft werden • Entwurf der Testfälle bleibt weiterhin manuell 2.4.4 Abnahmetest Das Ziel beim Abnahmetesten besteht darin, dass das Vertrauen in das Produkt beim Kunden oder Auftraggeber gestärkt wird. Es soll also dem Kunden zeigen, dass das Produkt seinen Anforderungen entspricht. Es wird dabei hauptsächlich eine Mischung aus den Testarten Leistungstest, Funktionstest und Benutzbarkeitstest angewandt. Der Auftragsgeber ist beim Testen dabei, bzw. er selbst führt diese Tests durch. Voraussetzung(en): • erfolgreiche Modultests, Integrationstests und Systemtest • Spezifikation des Systems, insbesondere Benutzerschnittstellen (Was- Beschreibung) => „blackbox Testen“ • Anforderungsspezifikation (beschreibt welche Qualitätsstandards die Software erfüllen soll) => - 19 - Kapitel 2 : Einführung ins Testen „black-box Testen“ Typische Fehler, die entdeckt werden: • Fehler im Zusammenhang mit den normalen Betriebsbedingungen (Betriebssystem, Betriebsort, Betriebshardware, ...) 2.4.5 Zusammenfassung Abbildung 7 Kategorien von Testaufgaben Die im vorherigen Kapitel beschriebenen Testarten sind ein wichtiger Aspekt zum Organisieren des Testens. Um dafür nochmals einen Überblick zu geben wird auf Abbildung 7 Kategorien von Testaufgaben hingewiesen. Es sollte nicht vergessen werden, dass Testen nicht nur aus der Auswahl der Testfälle besteht, sondern einer viel größeren Organisation bedarf. Diese Organisation sollte idealerweise aus 50-60% Testplanphase bestehen. Der Testplan legt fest, was wann, wieviel und wie genau getestet werden soll. Daher spielt er eine zentrale Rolle im Testprozess. Wie die genaue Planung des Testprozesses erfolgen sollte, wird im [Wal90] beschrieben. - 20 - Kapitel 3 : Einführung Software Komponenten 3 Einführung Software Komponenten Um ein besseres Verständnis für Plugins zu bekommen, müssen wir zuerst klären, was eine Komponente ist. Zu diesem Zweck werden wir in diesem Kapitel versuchen eine Definition von Komponenten zu geben. Danach werden wir die Vorteile bzw. Nachteile, die bei der Verwendung von Komponenten auftreten kurz beleuchten. Nachdem wir dann die Begriffe geklärt haben, werden wir im nächsten Kapitel dann genauer auf die spezielle Komponente, das Plugin, eingehen. 3.1 Definition Eine sehr kurze und vereinfachte Definition gibt Sametinger in [Sam97]: „Components are artifacts that we clearly identify in our software system. They have an interface, encapsulated internal details and are documented separately.“ Das grundlegende Ziel von Komponenten ist es, sie zu nehmen und in ein Software System zu integrieren ohne sie neu implementieren zu müssen. Dies unterscheidet Komponenten von z.B. Algorithmen, beschrieben in einem Buch. Wir können diese Algorithmen nicht einfach in unser Softwaresystem integrieren. Wir müssen sie erst noch implementieren. Gleiches gilt auch für Design Patterns. Diese beschreiben, wie man bestimmte Probleme lösen kann. Sie sind also in dieser Art mit Algorithmen vergleichbar, aber sie müssen erst noch implementiert werden. Einen Schritt weiter gehen dann schon Anwendungs-Frameworks. Das Framework ist nicht eine einzige Komponente, sondern besteht aus vielen einzelnen Komponenten, die von uns bei der Implementierung verwendet werden können. Als Ganzes folgt das Anwendungs-Framework einem oder mehreren Designpatterns. Es ist nicht direkt eine Komponente, sondern eher ein Vorgehensmodell mit konkreter Teilimplementation. Durch Benutzen der vom Framework zu Verfügung gestellten Klassen, werden die Designpatterns in die neue Anwendung übernommen. Damit wir Komponenten eindeutiger identifizieren können, gibt Sametinger noch eine präzisere Definition an. „Reusable software components are self-contained, clearly identifiable artefacts that describe and/or perform specific functions and have a clear interface, appropriate documentation and a defined reuse status.“ Im Detail soll dies bedeuten. • Unabhängigkeit von Anderen (self-containedness) Die Komponente sollte bei ihrer Verwendung unabhängig von anderen Komponenten sein. Ist sie abhängig von anderen Komponenten, so muss die Sammlung der ganzen Komponenten als eine Komponente angesehen werden, wobei die eine Komponente als Schnittstelle nach Außen dient. • Identifizierung (identification) Die Komponente muss eindeutig identifizierbar sein. Sie sollte nicht verteilt über mehrere Stellen und nicht vermischt mit anderen Teilen von Software und Dokumentation sein. • Funktionalität (functionality) Sie beschreiben und führen eine bestimmte Funktion aus. Diese Funktionalität ist eindeutig. • Schnittstelle (interface) Die Komponenten besitzen eine klare Schnittstelle nach Außen. Diese Schnittstelle versteckt alle - 21 - Kapitel 3 : Einführung Software Komponenten internen Details, die für die Wiederverwendung nicht wichtig sind. • Dokumentation (documentation) Eine Komponente muss gut dokumentiert sein. Die beste Komponente nutzt nichts, wenn sie nicht ausreichend dokumentiert wurde. Aus der Dokumentation muss ersichtlich sein, für welche Probleme man diese Komponente verwenden kann, wie sie angepasst und in die neue Umgebung integriert wird. • Wiederverwendungs Status (reuse status) Unter dem Wiederverwendungsstatus werden Informationen verstanden, wie z.B. wem gehört die Komponente und wer pflegt sie; wen kann man bei Problemen ansprechen und wie ist die Qualität der Komponente. Dies ist besonders wichtig, wenn Komponenten z.B. über Firmen- oder Abteilungsgrenzen hinweg genutzt werden. Nach dieser allgemeinen Definition können wir eine große Anzahl an Komponenten haben, wie z.B. Funktionen, Klassen, Anwendungen und vieles mehr und auch als Komponente identifizieren. 3.2 Verwendung Da wir nun ein grobes Bild von Komponenten haben, wollen wir klären, warum wir solche verwenden wollen und welche Vor- bzw. Nachteile uns dadurch entstehen. Durch die Verwendung von Komponenten können nicht alle Probleme in der Entwicklung von Software gelöst werden, es entstehen aber positive Effekte, was die Kosten, Produktivität, Funktionalität, Qualität, Zuverlässigkeit, Portabilität, Effizienz und Wartbarkeit der Software angeht. Ein Nachteil, gerade bei kleineren Projekten, ist der größere Overhead, der durch die Verwendung entsteht. 3.2.1 Vorteile Eine ausführliche Übersicht der Vorteile, die bei der Verwendung von Komponenten enstehen, zählt Sametinger in [Sam97] auf. Wir werden hier versuchen auf die unserer Meinung nach Wichtigsten genauer einzugehen. Sametinger teilt dabei die Vorteile in drei Kategorien ein: Qualitätsverbesserungen, Aufwandsverringerung und andere Vorteile. 3.2.1.1 Qualitätsverbesserung • Qualität Wird eine Komponente häufiger verwendet, werden Fehler eher gefunden und können behoben werden. Die Komponente kann dadurch qualitativ besser werden. Dies setzt jedoch die Verwaltung und Wartung der Komponente voraus und wird nicht durch einfaches Benutzen der Komponente erreicht. • Produktivität Es gibt eine Steigerung der Produktivität, da weniger Funktionalität entwickelt und getestet werden muss. Dies ist allerdings nicht der Fall, wenn es um die Erstentwicklung von neuen Komponenten geht, da hier erst mehr Zeit investiert werden muss. Dort macht sich die Steigerung der Produktivität erst zu einem späteren Zeitraum bemerkbar. • Zuverlässigkeit Werden gut getestete Komponenten bei der Entwicklung von Software verwendet, so wird die - 22 - Kapitel 3 : Einführung Software Komponenten Zuverlässigkeit der Software gesteigert. 3.2.1.2 Auffwandsverringerung • Reduzierung von redundanter Arbeit und Entwicklungszeit Durch die Verwendung von Komponenten kann die redundante Entwicklung von Teilen der Software verhindert werden. Dazu zählen z.B. Oberflächenschnittstellen, Kommunikation oder grundlegende Algorithmen. Wenn solche Teile als Komponenten vorliegen, reduziert sich die Entwicklung, die verwendete Zeit und die Kosten. • Wartungskosten Werden bewährte Komponenten verwendet, können weniger Fehler in der Software erwartet werden. Daraus resultiert, dass ein geringerer Teil der Software auch gewartet werden muss. Allerdings sollten die Komponenten von einer Gruppe gewartet werden und nicht in jedem Softwaresystem getrennt. • Einarbeitungszeit Die Einarbeitungszeit von Entwicklern, die neu in ein Projekt kommen, verringert sich, da sie nur noch die verwendeten Schnittstellen der Komponenten verstehen müssen. Desweiteren lernen sie mit der Zeit die Komponenten für ihre Entwicklungszwecke kennen und können so schneller ein neues Softwaresystem auf Basis dieser Komponenten erstellen. 3.2.1.3 Andere Vorteile • Schnelle Prototypentwicklung Mit Komponenten können schneller Prototypen erstellt werden. Dies ermöglicht es schon früh in der Entwicklung, Rückmeldung vom Kunden zu bekommen und versteckte Anforderungen zu entdecken. • Erfahrungsaustausch und -weitergabe Entwickler, die gut konstruierte Komponenten verwenden, können vom verwendeten Design lernen und dies beim Entwurf ihres Softwaresystems berücksichtigen. Dazu müssen sie nicht unbedingt die interne Struktur der Komponente kennenlernen; oft reicht es schon aus, die Schnittstelle zu verstehen. 3.2.2 Nachteile Den bisher aufgezählten Vorteilen stehen natürlich auch Nachteile gegenüber. Auf einige dieser Nachteile soll in diesem Abschnitt etwas genauer eingegangen werden. Auch hier sei angemerkt, das es in [Sam97] ausführlichere Aufzählung und Erläuterung gibt. Sametinger teilt die Nachteile, die bei der Verwendung von Komponenten auftreten, in drei Kategorien ein. 3.2.2.1 Leitende und organisatorische Es reicht nicht einfach aus, Komponenten bei der Softwareentwicklung zu benutzen, es muss auch vom Management unterstützt werden. Ohne die Unterstützung durch höhere Positionen wird sich die Verwendung von Komponenten nicht durchsetzen. Gleiches gilt auch für das Projektmanagement; wenn hier nicht gleich von Beginn an an die Wiederverwendbarkeit gedacht wird, wird sie nicht stattfinden. Es müssten z.B. Strukturen geschaffen werden, die die erstellten Komponenten verwalten und warten. - 23 - Kapitel 3 : Einführung Software Komponenten 3.2.2.2 Wirtschaftliche Um wiederverwendbare Komponenten zu erstellen, müssen gerade am Anfang höhere Kosten in Kauf genommen werden. Dazu zählen Kosten, wie z.B. eine Komponente wiederverwendbar zu machen, sie wiederzuverwenden und einen Prozess zu definieren bzw. zu implementieren, der die Wiederverwendung umsetzt. Diese Kosten amortisieren sich meist erst Jahre später und lohnen sich nicht für Komponenten, die nur einmal Verwendung finden. 3.2.2.3 Konzeptuelle und technische Es ist ein großes Problem, Komponenten für die Wiederverwendung zu finden, wenn nicht z.B. eine Verwaltungsinstanz existiert, die es ermöglicht, gezielt zu suchen. Auch wenn man Zugriff auf viel Software hat, bedeutet dies leider nicht, dass diese auch wiederverwendbar ist. Selten ist Software so geschrieben, das Andere diese wiederverwenden können. Häufig ist es dann sogar teurer diese Software an eigene Bedürfnisse anzupassen, als sie neu zu entwickeln. Ein großes Problem ist auch die Qualität der Komponenten. Stimmt diese nicht, wird auch das daraus entstandene System nicht qualitativ hochwertig sein. Es ist deswegen wichtig, die Qualität und Funktion einer Komponente genau zu bestimmen, um dann zu entscheiden, ob diese wirklich Verwendung finden soll. 3.3 Zusammenfassung Die Verwendung von Komponenten ermöglicht es, neue Software auf Basis Bestehender zu entwickeln. Allerdings ist dies nur durchführbar, wenn es schon von Anfang an in der Planung berücksichtigt wird. Wie gezeigt wurde, ist das auch mit höheren Initialkosten verbunden, welche sich erst sehr viel später bezahlt machen. Wird jedoch der Prozess der Wiederverwendbarkeit richtig umgesetzt, so wird dies vor allem die Qualität und Robustheit der Software steigern. Es wurde auch ersichtlich, das nur die Wiederverwendung von Software nicht automatisch ausreicht um gute neue Systeme zu erstellen. Es müssen auch die entsprechenden organisatorischen Strukturen für komponentenbasiertes Entwickeln geschaffen werden. - 24 - Kapitel 4 : Einführung Plugins 4 Einführung Plugins Im vorherigen Kapitel haben wir uns mit der Komponente als Allgemeines beschäftigt und Begriffe und Definitionen geklärt. Wir haben die Vor- bzw. Nachteile beleuchtet, die bei der Verwendung entstehen können. In diesem Kapitel wollen wir nun auf eine spezielle Art von Komponente eingehen, das Plugin. Dabei besteht die Aufgabe eines Plugins darin, die Funktionalität einer bestehenden Software bzw. Komponente zu erweitern oder zu verändern. Wir werden als Erstes versuchen, eine genauere Definition des Begriffes Plugin zu geben. Im Anschluß daran wollen wir das verwendete Pluginkonzept von Eclipse näher erläutern, welches dann auch im erstellten Prototyp Verwendung findet. 4.1 Definition In der heutigen Zeit gibt es viele Anwendungen die angeben „pluginfähig“ zu sein. Dabei gibt es keine genauere Definition des Begriffes. Die Hersteller der Software gehen davon aus, dass der bildliche Vergleich mit dem „Hereinstecken von Software (to plug in) ausreicht und eine genaue Definition des Begriffes überflüssig macht. Eine Definition von Plugin bietet [Mmv03]: „Plugins sind Ergänzungen zu einer Applikation, die von dieser vorgesehen sind, die sie aber nicht selbst mitbringen kann oder will. Ein Plugin deckt dabei eine fachliche Funktion so vollständig ab, dass keine andere Komponente des Systems irgendetwas spezifisches darüber wissen müsste. Für die dazu nötigen Schnittstellen ist die Applikation verantwortlich.“ Plugins sind also Komponenten, die ein schon bestehendes Softwaresystem erweitern und dazu die von der Anwendung zur Verfügung gestellten Schnittstellen verwenden. Diese Schnittstellen dienen als Vertrag zwischen Anwendung und Plugin. Diese Definition erklärt uns aber noch nicht wann eine Komponente ein Plugin ist, da jede Komponente ein System erweitert. In [Sch03] wird eine zusätzliche Defninition gegeben. „Plugins sind Komponenten die das Verhalten einer oder mehrerer anderer Komponenten im System verändern. Dies geschieht über die von diesem zur Verfügung gestellten Schnittstellen.“ Ein Plugin erweitert also nicht nur das Gesamtsystem an sich, sondern kann auch noch über die Schnittstellen das Verhalten oder die Funktion von anderen Plugins erweitern und verändern. Damit werden Plugins immer von der Komponente abhängig sein, die sie erweitern. Um eine Implementierung von Plugins zu ermöglichen, müssen die Schnittstellen der entsprechenden Komponenten freigelegt und beschrieben sein. Ein weiteres Kriterium besteht darin, dass Komponenten eine grundlegende Funktion anbieten und nicht in anderen Komponenten bekannt sind. Die Kommunikation der Komponenten untereinander wird durch die Plattform geregelt, auf der sie laufen. Ein Plugin dagegen wird von einem Komponentensystem verwaltet. Dieses regelt das Registrieren, Laden und Entfernen von Komponenten. Da das Plugin in den Komponenten bekannt ist, die es erweitert, können diese auch direkt mit diesem Nachrichten austauschen, ohne den Umweg über die Kommunikation der Plattform - 25 - Kapitel 4 : Einführung Plugins zu nehmen. Je nach System kann es sich dabei um eine dynamisches oder statisches Komponentensystem handeln. Der grundlegende Unterschied liegt im Verwalten der Komponenten. Bei einem dynamischen System können Plugins auch während der Laufzeit hinzugefügt bzw. entfernt werden. Dies schließt jedoch gegenseitige Abhängigkeiten von Plugins aus. Bei einem statischen System werden die Plugins beim Start registriert und je nach Mechanismus schon initialisiert und geladen. Ein Plugin ist also eine spezialisierte Form einer Komponente, die ein System um eine sehr spezialisierte Funktion erweitert. Dabei erweitert es nicht nur das System an sich, sondern auch die darin schon befindlichen anderen Komponenten. Im nächsten Abschnitt werden wir uns näher mit dem statischen Pluginsystem Eclipse beschäftigen. Dabei werden wir uns genauer die zugrundeliegende Architektur anschauen sowie die Mechanismen die verwendet werden, um Plugins zu verwalten und zu laden. 4.2 Eclipse Eclipse ist eine Plattform zur Entwicklung von Integrated Development Enviroments (IDE). Sie wird seit November 2001 über [Ecl04] vertrieben. Entwickelt und unterstützt wird sie von einem losen Konsortium von großen und kleinen Firmen wie IBM, Borland, Sybase, RedHat, SuSE und vielen mehr. Sie wird unter einer Common Public Licens (CPL) vertrieben und kann frei benutzt werden. Zur Zeit ist sie in der Version 2.1.3 erhältlich. Version 3.0 ist gegenwärtig nur als Betaversion vorhanden. Bei Eclipse handelt es sich um ein statisches Plugin-Verwaltungssystem. Es bietet an sich nur eine kleine Grundfunktionalität und Mechanismen zum Verwalten und Laden von Plugins an. In den folgenden Abschnitten wollen wir näher auf die Architektur von Eclipse eingehen und den Pluginmechanismus ausführlicher erläutern. 4.2.1 Architektur Die Plattform an sich besteht nur aus einem sehr kleinen Kern, der sogenannten „Plattform Runtime“. Sie stellt Mechanismen zum Laden und Verwalten der Plugins zur Verfügung. Auch legt sie Regeln fest, wie Plugins miteinander kommunizieren und sich gegenseitig erweitern können. Andere Funktionalität, wie z.B. eine IDE zum Bearbeiten von Java, müssen erst durch Andere implementiert werden. Wir betrachten nun im Folgenden die einzelnen Plattformkomponenten etwas genauer. Zur Übersicht sei auf Abbildung 8 verwiesen, die eine grobe bildliche Verdeutlichung der Architektur von Eclipse darstellt. Eine sehr ausführliche Beschreibung der einzelnen Bestandteile ist auch in [Ecl03a] zu finden. - 26 - Kapitel 4 : Einführung Plugins Eclipse Plattform New Tool Workbench Help JFace SWT New Tool Team Workspace New Tool Platform Runtime Abbildung: 8 Eclipse Plattform Architekur 4.2.1.1 Plattform Runtime Dies ist der Kern von Eclipse. Er stellt die Funktionalität zum Verwalten der Plugins zur Verfügung. Plugins können über diesen Kern auf eine Fülle von Informationen zugreifen, die sie für ihren Ausführungskontext benötigen. Um ein schnelles Laden der Umgebung zu ermöglichen, werden zum Beginn nicht alle Plugins automatisch gestartet. Allerdings werden ihre Metabeschreibungen beim Hochfahren eingelesen, um ihre Schnittstellen auch Anderen bekannt geben zu können. Erst wenn die Funktionalität eines Plugins direkt gefordert wird, wird dessen Code auch ausgeführt. Dies vermeidet einen Overhead beim Laden und Ausführen der Umgebung. Alle weiteren Teile der Plattform sind als Plugins konzipiert und bieten über wohldefinierte Schnittstellen die Möglichkeit für Erweiterungen durch andere Plugins an. Sie gehören aber noch direkt zur Plattform, da sie die Grundfunktionalität der Umgebung realisieren. 4.2.1.2 Workspace Der Workspace ist die abstrakte Form der Datenablage im Dateisystem des darunterliegenden Operationsystems. Dabei besteht der Workspace aus einem oder mehreren Projekten, die jeweils auf ein spezifisches Verzeichnis im Dateisystem verweisen. Die Verzeichnisse können überall im Dateisystem sitzen, wobei standardmäßig ein sogenanntes Workspace Root-Verzeichnis existiert. Abbildung 9 soll dies verdeutlichen. - 27 - Kapitel 4 : Einführung Plugins IWorkspace IProject (Porjekt1) IFolder IFile IFile IProject (Projekt2) c:/workspace/projekt1 c:/workspace/projekt1/folder c:/workspace/projekt1/folder/file2.txt c:/workspace/projekt1/file1.txt c:/myProject IFile c:/myProject/file1.txt IFile c:/myProject/file2.txt Abbildung: 9 Workspace Resourcemapping Die in einem Projekt enthaltenen Dateien sind über die definierten Schnittstellen des Workspaces für Plugins zugänglich. Plugins greifen dabei über sogenannte Resources auf die darunterliegenden Objekte zu und können deren Verhalten erweitern. Über den „Project Nature Mechanismus“ können Plugins Projekte personalisieren. Man könnte auch sagen, das Projekt wird einer Kategorie zugeordnet, die einen bestimmten Aufbau erwartet oder ein bestimmtes Verhalten voraussetzt. Durch das Anhängen einer „Nature“ an einem Projekt kann gekennzeichnet werden, das es sich um ein HTML Projekt handelt, das statische Seiten einer Webpräsenz enthält. Ein Projekt kann dabei mehrere Natures besitzen. Dies ermöglicht es, Projekte mit mehreren Plugins bzw. Tools zu benutzen, ohne dass diese voneinander Bescheid wissen müssen. 4.2.1.3 Workbench Die Workbench stellt die Oberfläche von Eclipse dar. Sie bietet Schnittstellen zum einfachen Erweitern der Oberfläche an. Die Schnittstellen zum Darstellen der Oberfläche sind dabei in zwei Teile gegliedert, welche das Erstellen von Oberflächenelementen ermöglichen. Desweiteren stellt sie die Grundoberfläche von Eclipse dar. In diese werden die Oberflächenerweiterungen der Plugin hineingesetzt. Die wichtigsten Erweiterungspunkte stellen dabei die Viewer und Editoren dar. Editoren ermöglichen das Öffnen, Ändern und Speichern von Daten. Viewer zeigen Informationen über die Objekte an, die momentan vom Benutzer bearbeitet werden. Sie dienen also z.B. als Unterstützung von Editoren, um eine weitere Sicht auf die Daten zu haben. Eine etwas kurze Übersicht der wichtigsten möglichen Erweiterungspunkte sehen sie in Tabelle 1 oder ausführlicher in [Sha03]. - 28 - Kapitel 4 : Einführung Plugins Zweck Erweiterungspunkt Workbench Menü und Toolbar org.eclipse.ui.actionSet Editor Menü und Toolbar org.eclipse.ui.editorActions Wizards für File -> New Menü org.eclipse.ui.newWizards Eigenschaftsseiten für Objekte org.eclipse.ui.propertyPages Neue Editoren für bestimmte Objekte org.eclipse.ui.editors Hilfe unter Menü Help -> Help Contents org.eclipse.ui.help Neue Views org.eclipse.ui.views Tabelle: 1 Erweiterungspunkte von Eclipse SWT (Standard Widget Toolkit) Das SWT bietet eine vom Betriebssystem unabhängige Schnittstelle an. Diese ermöglicht es auf die nativen Grafikelemente des darunterliegenden Oberflächensystems zu zugreifen. Für Elemente, die eine Implementierung im Grafiksystem des Betriebssystems besitzen, wird diese Implementierung genutzt. Erst wenn es keine Implementierung gibt, wird diese anderweitig emuliert. Als Beispiel gibt es z.B. die Werkzeugleiste. Diese benutzt unter Windows die native Implementation, unter Motif wird eine Emulation des Toolbars realisiert. Dadurch kann eine Reihe von Windowselementen zur Verfügung gestellt werden und nicht wie beim AWT nur der kleinste gemeinsame Nenner. Auch wird dadurch auf den entsprechenden Plattformen ein Plattformtypisches Aussehen erreicht. JFace JFace bietet eine plattformunabhängige Schnittstelle für allgemeine Aufgaben, die die Oberflächen betreffen. Die zwei wichtigsten sind Actions und Viewer. Actions: Diese enthalten Kommandos zur Ausführung, ohne genau zu spezifizieren, wo sie in der Oberfläche aufgerufen werden können. Dabei kennt jede Aktion ihre Oberflächeneigenschaften. Dazu gehören z.B. Label, Icon und ToolTip. Dadurch wird es möglich, die gleiche Aktion an mehreren Stellen einfach zu benutzen. Viewers: Diese stellen eine höhere Abstraktionsebene zu Standard-Oberflächenelementen, wie z.B. Listen und Bäumen dar. Sie ermöglichen das einfache Benutzen dieser Elemente, ohne einen großen Programmieraufwand zu betreiben. Viewers werden dabei durch einen sogenannten Content Provider und Label Provider konfiguriert. Der Content Provider weiß dabei, wie die Modellelemente in Beziehung zu den entsprechenden Viewerelmenten stehen und reagiert auf Änderungen im Modell. Der Label Provider weiß, wie die Elemente im Viewer grafisch dargestellt werden müssen. Zusätzlich können auch noch Filter und Sortierer angegeben werden. Werden Elemente im Viewer ausgewählt, so werden die interessierten Klienten entsprechend benachrichtigt. Die Abhängigkeiten sind in Abbildung 10 nochmals verdeutlicht. - 29 - Kapitel 4 : Einführung Plugins Sorter Content Provider Filter Viewer Label Provider Model Abbildung: 10 Model-View-Controller 4.2.1.4 Team Eclipse bietet eine einheitliche Schnittstelle, um neue Team Repository Provider in die IDE zu integrieren. Dabei werden sowohl pessimistische wie auch optimistische Modelle von Repositories unterstützt. Damit sich Anwender nicht in jede Team Repository Software neu einarbeiten müssen, gibt es Platzhalter für bestimmte Aktionen, Ansichten, usw, die vom repository Provider nur noch implementiert werden müssen. Dies ermöglicht ein ungefähr gleiches Aussehen und eine leichtere Verwendung von verschiedener Repository Software für Anwender. In der Eclipse Standardversion gibt es schon eine standardmäßige Unterstützung für CVS. Dabei kann auf ein CVS sowohl per psserver oder ssh Protokoll zugegriffen werden. 4.2.1.5 Help Das in Eclipse integrierte Hilfekonzept ermöglicht es, dem Anwender zu jedem Plugin eine strukturierte Hilfe anzubieten. Dabei wird die Hilfe in zwei Bereiche geteilt. Zum einen eine XMLStruktur, die eine Navigation in der Hilfe ermöglicht, zum anderen die Hilfedateien selbst im HTML Format. Dieses Konzept hat den Vorteil, dass schon bestehende Hilfen leicht in Eclipse integriert werden können und nicht neu geschrieben werden müssen. Die Navigation in der Hilfe ist durch die Baumansicht auch für den Anwender leicht verständlich und verwendbar. Um auch in der Oberfläche schnell kontextabhängig Hilfe anbieten zu können, kann für jedes Oberflächenelement eine Kontexthilfe angeboten werden, die beim Drücken von F1 erscheint. Diese wird auch in einer XML Datei definiert und gibt kurze Tips und verweist auf entsprechende Kapitel oder Seiten in der Hilfe. - 30 - Kapitel 4 : Einführung Plugins Durch dieses Konzept kann leicht eine durchgängige Hilfe angeboten werden. Da jedes Plugin seine Hilfe in eine bestehende Hilfe integrieren kann, ist sie leicht wartbar und erweiterbar. 4.2.2 Plugin-Model In den vorherigen Abschnitten haben wir geklärt, was ein Plugin ist und welche grobe Architektur Eclipse besitzt. In diesem Abschnitt werden wir uns etwas näher das Plugin Konzept und die technische Umsetzung in Eclipse anschauen. Dabei werden wir auf die Struktur des Plugins eingehen und einige einfache Beispiele geben. Für eine ausführlichere Information zu diesem Thema sei auf [Bol03] und [Ecl03a] verwiesen. Da es sich bei Eclipse um ein statisches Pluginsystem handelt, stehen nur Plugins zur Verfügung, die vor dem Start in einem dafür vorgesehen Verzeichnis abgelegt wurden. Es gibt zwar Bestrebungen auch das dynamische Laden von Plugins zu ermöglichen, diese sind aber noch nicht fertig. Genaueres ist unter [Equi04] nachzulesen. Ein Plugin ist eine Einheit, die eine bestimmte Funktionalität der Umgebung hinzufügt. Es kann dabei gänzlich neue Funktionalität hinzufügen oder bereits Vorhandene erweitern. Es wird im Pluginverzeichnis unter einem eindeutigen Namen, der auch als Referenzierung dient, installiert. Jedes Plugin besitzt dabei einen Erben der Pluginklasse von Eclipse (org.eclipse.core.runtime.Plugin). Dabei müssen alle Plugins von dieser Klasse abgeleitet werden. Diese Pluginklasse ist für die Konfiguration und Steuerung des Plugins verantwortlich. Zusätzlich zur Pluginklasse gibt es die Datei plugin.xml, welche Metainformationen enthält, die Eclipse zum Starten des Plugins benötigt. Der minimale Aufbau dieser Datei ist in Listing 1 zu erkennen. <?xml version="1.0" encoding="UTF-8"?> <plugin name="JUnit Testing Framework" id="org.junit" version="3.7" provider-name="Eclipse.org"> <runtime> <library name="junit.jar"> <export name="*"/> </library> </runtime> </plugin> Listing: 1 Minimale plugin.xml Durch diese Manifestdatei ist es Eclipse möglich das Plugin zu laden und seine Informationen in der Pluginregistry verfügbar zu machen. Wir werden nun nicht näher auf die Teile dieser Datei eingehen, für Interessierte sei auf [Bol03] verwiesen. Mit Hilfe dieser Informationen ist es nun Eclipse möglich, bei Bedarf, eine Instanz des Plugins zu erzeugen. Wichtig dabei ist noch, dass nur Eclipse Instanzen von Plugins erzeugen darf. Bisher unterscheiden sich die Plugins von Eclipse nicht wesentlich von der Definition von Komponenten. Eclipse bietet jedoch einen Mechanismus, der es Komponenten erlaubt, sich gegenseitig zu erweitern. Diese Eigenschaft macht die Komponenten von Eclipse zu Plugins. In - 31 - Kapitel 4 : Einführung Plugins diesem Modell kann ein Plugin in zwei verschiedenen Verhältnissen zu einem Anderen stehen. • Abhängigkeit: Es gibt dabei die Rollen des abhängigen Plugins und des erforderlichen Plugins. Dabei unterstützt das erforderliche Plugin die Funktionen des abhängigen Plugins • Erweiterung: Dort gibt es die Rollen des Host-Plugin und des Erweiterungs-Plugins. Dabei wird die Funktionalität des Host-Plugins durch das Erweiterungs-Plugins erweitert. Diese zwei Beziehungstypen werden wir nun etwas genauer betrachten. 4.2.2.1 Abhängigkeiten Ist ein Plugin von einem anderen Plugin abhängig, so wird dies in der Manifestdatei festgehalten. Diese Abhängigkeit gilt dann sowohl für Kompilierzeiten, als auch für die Ausführungszeit. Eclipse stellt dabei sicher und überprüft, ob alle erforderlichen Plugins vorhanden sind, die für die Ausführung benötigt werden. Während der Kompilierung wird der Klassenpfad von Eclipse so erweitert, das alle benötigten Bibliotheken zur Verfügung stehen und das Plugin kompiliert werden kann. Ein Beispiel für eine Abhängigkeit sehen sie in Listing 2. <?xml version="1.0" encoding="UTF-8"?> <plugin id="com.webtest.ui" name="WebTest UI" version="1.0.0"> <runtime> <library name="webtestui.jar"/> </runtime> <requires> <import plugin="org.eclipse.ui"/> </requires> </plugin> Listing: 2 Plugin Abhängigkeit Abhängigkeiten werden durch das <requires>-Element angegeben. Dadurch wird kenntlich gemacht, dass das Plugin in Abhängigkeit zum org.eclipse.ui basis Plugin steht. Während der Lauf- und Kompilierungzeit wird dann von Eclipse sichergestellt, dass die Dateien bzw. Bibliotheken des Plugins vorhanden sind. 4.2.2.2 Erweiterungen Durch den Erweiterungsmechanismus in Eclipse ist es möglich vorhandene Plugins mit zusätzlicher Funktionalität anzureichern. Das zu erweiternde Plugin beschreibt dabei seine Erweiterungspunkte in einem XML-Schema. In diesem wird beschrieben, welche Informationen für die Erweiterung benötigt werden. Ein Verweis auf dieses Schema wird dann in der plugin.xml eingetragen. Im Listing 3 sehen wir, wie das org.eclipse.ui Plugin einen Erweiterungspunkt für Menüeinträge definiert. Das Plugin, welches nun neue Menüeinträge in die Menüleiste von Eclipse eintragen möchte, muss diesen Erweiterungspunkt benutzen. Dazu verweist es in seiner plugin.xml auf diesen Erweiterungspunkt und gibt die im Schema benötigten und optional definierten Informationen an. - 32 - Kapitel 4 : Einführung Plugins <?xml version="1.0" encoding="UTF-8"?> <plugin id="org.eclipse.ui" name="Eclipse UI" version="2.1.0" provider-name="Eclipse.org" class="org.eclipse.ui.internal.UIPlugin"> <extension-point id="actionSets" name="Action Sets" schema="schema/actionSets.exsd"/> <!-- Other specifications omitted. --> </plugin> Listing: 3 Einbindung Erweiterungsschema Bei den meisten Erweiterungspunkten muss auch noch zusätzlich eine Klasse angegeben werden, welche die Funktionalität der Erweiterung kapselt. Dabei ist häufig eine vorgegebene Schnittstelle zu <plugin id="org.eclipse.help.ui" name="Help System UI" version="2.1.0" provider-name="Eclipse.org" class="org.eclipse.help.ui.internal.WorkbenchHelpPlugin"> <!-- ... --> <!-- Action Sets --> <extension point="org.eclipse.ui.actionSets"> <actionSet label="Help" visible="true" id="org.eclipse.help.internal.ui.HelpActionSet"> <action label="&Help Contents" icon="icons/view.gif" helpContextId="org.eclipse.help.ui.helpContentsMenu" tooltip="Open Help Contents" class="org.eclipse.help.ui.internal.HelpContentsAction" menubarPath="help/helpEnd" id="org.eclipse.help.internal.ui.HelpAction"> </action> <!-- ... other actionSet elements --> </actionSet> </extension> <!-- ... --> </plugin> Listing: 4 Erweiterung verwenden - 33 - Kapitel 4 : Einführung Plugins verwenden oder von einer abstrakten Klasse zu erben. In Listing 4 sehen wir, wie das Plugin org.eclipse.help.ui einen Erweiterungspunkt verwendet. Es verweist dabei auf den Erweiterungspunkt des org.eclipse.ui Plugins und gibt die im Schema definierten Informationen an. Diese Erweiterung sieht vor, dass ein neuer Menüeintrag im Menü Help angeboten wird. Die auszuführende Funktion wird dabei in der Klasse HelpContentActions definiert. Diese implementiert die vom Plugin geforderte Schnittstelle für diese Erweiterung. Das Schema und die Schnittstelle bzw. Klasse dienen als Vertrag zwischen dem erweiternden Plugin und dem Plugin, das erweitert wird. Sie stellen sicher, dass die geforderten Informationen vorhanden sind und die festgelegten Schnittstellen bedient werden. 4.2.2.3 Spätes Laden In diesem Abschnitt wollen wir kurz auf einen wichtigen Aspekt beim Laden von Plugins eingehen. Es handelt sich dabei um das verzögerte Laden von Plugins. Wird die Funktionalität eines Plugins benötigt, so wird nur der momentan erforderliche Code geladen. An die Stellen, wo dieses Plugin von anderen Plugins erweitert wird, werden erst einmal sogenannte Proxy- oder Platzhalter Objekte gesetzt. Diese besitzen keine Funktionalität und sind somit klein in ihrem Speicher- und Rechenbedarf. Erst wenn die Funktionalität vom Anwender gefordert wird, wird an die Stelle des Proxy-Objektes der richtige Code bzw. das Objekt gesetzt, das die Funktion ausführt. Eine genauere Erklärung des Proxy-Musters ist in [Gam95] zu finden. Mit Hilfe dieses Mechanismus soll eine Überlastung des Systems vermieden und schnellere Ladezeiten der Plugins erreicht werden. Ein gutes Beispiel für die Verwendung von Proxy-Objekten sind z.B. die Menüeinträge der Menüleiste. Diese Menüs werden zuerst nur mit Hilfe von Proxy-Objekten erstellt. Erst wenn der Anwender konkret einen Menüpunkt auswählt, wird die dafür angegebene konkrete Klasse geladen und ausgeführt. Das Proxy-Objekt an sich enthält nur Beschriftungstext, Icon, etc., also alle Daten die für eine Darstellung im Menü benötigt werden. Diese Menge an Daten kann schnell geladen und auch leicht im Speicher gehalten werden. 4.3 Vorteile Durch Eclipse ist es leicht möglich, eigene Entwicklungsumgebungen zu erstellen bzw. durch den bereitgestellten Pluginmechanismus vorhandene zu erweitern und damit an die eigenen Bedürfnisse anzupassen. Mit dem in Eclipse verwendete Designkonzept für die Oberfläche wird dabei ein einheitliches Look&Feel erreicht, das es dem Anwender erleichtert sich in den neuen Werkzeugen zurechtzufinden. Die Interaktion bzw. Kooperation der verschiedenen Werkzeuge wird durch das Pluginsystem vereinfacht und erleichtert. Diese Zusammenarbeit mit getrennten Anwendungen zu realisieren, wäre nur sehr umständlich bis gar nicht möglich. 4.4 Nachteile Die Nachteile lassen sich dabei in folgenden Punkten beschreiben. • Keine Unterstützung von dynamischen Komponenten In der Eclipse Plattform können nur statische Plugins verwendet werden. Dies bedeutet, während der Laufzeit können keine Plugins hinzu geladen oder entfernt werden. Hierzu muss die Umgebung erst beendet und neu gestartet werden. Mit dem equinox-Projekt wird zwar an einer dynamischen Lösung gearbeitet, diese ist aber noch nicht in Eclipse integriert. - 34 - Kapitel 4 : Einführung Plugins • Größerer Entwicklungsaufwand Bei kleinen Erweiterungen der Eclipse-Plattform ist der Entwicklungsaufwand relativ groß, da sich erst in die Dokumentation eingearbeitet werden muss und viele Dateien für ein Plugin existieren müssen. Dem entgegen zu wirken versucht aber die in Eclipse existierende Plugin Development Environment PDE, welche mit Werkzeugen das Erstellen von Plugins erleichtert. • Neues Window-Toolkit Die Entwickler müssen sich in ein neues Window-Toolkit einarbeiten, da Eclipse intern mit dem SWT arbeitet (s. Seite 29: SWT (Standard Widget Toolkit)). Dieses unterscheidet sich in der Verwendung von den bekannten Window-Toolkits in Java wie AWT und Swing. Zwar können diese auch in Eclipse verwendet werden, die damit erzeugten Werkzeuge integrieren sich aber nicht so gut in die Umgebung. • Geschwindigkeit Das starten der Eclipse Umgebung kann bei der Verwendung von vielen Plugins relativ lange dauern, da bei jedem Start erst alle Plugins registriert werden müssen. Dazu werden alle PluginManifestdateien in den einzelnen Pluginverzeichnissen eingelesen. Dies kann dazu führen, dass ein Start länger als 30 Sekunden dauert. Des Weiteren wird relativ viel Speicher für die Verwaltung der Plugins benötigt. Zusätzlich können schlecht programmierte Plugins, welche die Ressourcen nicht wieder freigeben, die Laufzeit noch weiter verschlechtern. Die im Abschnitt „Spätes Laden„ auf Seite 34 beschriebene Methode, soll diesem schlechten Laufzeitverhalten entgegen wirken. 4.5 Zusammenfassung Trotz der zuvor genannten Nachteile, eignet sich Eclipse sehr gut dafür, neue Werkzeuge zu entwickeln bzw. Vorhandene zu erweitern. Dies wird insbesondere durch das sehr gute Konzept des Plugin-Mechanismus ermöglicht. Desweiteren wird durch das Oberflächenkonzept eine sehr einheitliche Oberfläche der verschiedenen Werkzeuge, was Aussehen und Funktionalität angeht, erreicht. Der Anwender kann somit schneller mit den verschiedenen Werkzeugen produktiv arbeiten, da sich der Einarbeitungsaufwand verringert. Durch das große Konsortium von Firmen die die Entwicklergemeinde von Eclipse unterstützen, ist die Weiterentwicklung von Eclipse gut gesichert und es stellt kein Problem dar, Hilfe bzw. Support für die Plattform zu bekommen. Auch gibt es schon ein reichhaltiges Angebot von freien und kostenpflichtigen Plugins, die es einem ermöglichen sich Eclipse an die eigenen Bedürfnisse anzupassen. - 35 - Kapitel 5 : Planung Testausführer 5 Planung Testausführer In diesem Kapitel werden die Vorüberlegungen zur Entwicklung des Testausführers beschrieben. Es wurden erst Begriffe, wie Webanwendung, HTML und XML definiert. Diese Definitionen sind nötig um ein Basis für die Begründung unserer Teststruktur zu geben. Da die Simulation des Browsers eine zentrale Rolle in der Planung spielt, wird diese gesondert diskutiert. Als Nächstes wird erläutert, in welchem Bereich die geplante Software zur Anwendung kommt und nach welchen Kriterien sie entwickelt wurde. Dem folgt schließlich die Beschreibung der Teststruktur, auf die die Anwendung ausgelegt wurde. Diese Struktur kommt in beiden Teilen der Diplomarbeit zum Tragen. 5.1 Vorüberlegungen Es sollte ein Testwerkzeug zum „black-box“ Regressionstesten von Webanwendungen entwickelt werden. Was ist aber überhaupt eine Webanwendung? Webanwendung wird im Wikipedia [Wiki04] so definiert: „Eine Webanwendung ist eine Anwendung, die auf einem Webserver ausgeführt und dann in einem Browser dargestellt wird.“ Dabei kann der Browser (Benutzeroberfäche einer Webanwendung) irgendwo aus dem Netzwerk heraus, die Webanwendung aufrufen. Die Sprache für die Oberfläche, die in dem Browser angezeigt wird, ist hauptsächlich HTML (Hypertext Markup Language). Die Webanwendungen werden im Browser über eine URL aufgerufen. Um so eine Anwendung „black-box“ Testen zu können, muss natürlich die Möglichkeit gegeben sein, die Testfälle dafür zu beschreiben. Beim „black-box“ Testen besteht diese Beschreibung typischerweise aus Ein- Ausgabe Wertepaaren. Da jede Webanwendung eine Browserdarstellung hat, liegt es nahe, dass die Definition der Testfälle auch darauf basieren soll. Die Darstellung im Browser wird normalerweise über die Sprache HTML beschrieben. Wir können also die Testfallbeschreibung auch an die Sprache HTML anlehnen. Im Weiteren soll auf die Wiederholbarkeit des Tests großen Wert gelegt werden. Das Hauptproblem ist also, Tests so zu speichern, dass sie jederzeit wieder ausführbar sind. Die Lösung dafür ist XML (Extensible Markup Language). 5.1.1 HTML Um in einer Weboberfläche, genannt Browser irgendetwas darzustellen, wird HTML (Hypertext Markup Language) [Html01] benutzt. Die Definition von HTML ist: „HTML ist eine Auszeichnungssprache (Markup Language), die die logischen Bestandteile eines textorientierten Dokuments beschreibt.“ Als Auszeichnungssprache bietet HTML die Möglichkeit, typische Elemente eines textorientierten Dokuments, wie Überschriften, Textabsätze, Listen, Tabellen oder Grafikreferenzen, als solche auszuzeichnen. Diese Auszeichnung erfolgt im Rahmen von sogenannten Elementtypdefinitionen. Ein Element hat die folgende Gestalt: - 36 - Kapitel 5 : Planung Testausführer <tagname attributename=“attributevalue“>tagcontent</tagname> Allgemeine Definition von einem Element: 1. Start Tag: entspricht dem Muster <tagname>. 2. Attribute mit entsprechenden Werten: entspricht dem Muster attributename=“attributvalue“. Die Attribute müssen im Start Tag enthalten sein. 3. Inhalt des Elements: Entspricht dem Muster eines beliebigen Textes zwischen Start Tag und End Tag. Der Inhalt muss sich zwischen Start Tag und End Tag befinden. 4. End Tag: entspricht dem Muster </tagname>. Der Elementtyp ist der Text zwischen den spitzen Klammern (in dem Fall also „tagname“). In HTML sind die Elementtypen fest vorgeschrieben. Es ist nicht möglich, bei Bedarf weitere Elementtypen zu definieren. Die Verschachtelung ist auch festgelegt und nicht änderbar. 5.1.2 XML Da wir in dem Dokument sehr oft den Begriff XML benutzen, soll hier definiert und erklärt werden, was XML überhaupt ist. XML Definition von [Kun98]: „XML ist ein Metasprache für Definieren von Dokumententypen.“ Als Nächtes stellt sich natürlich die Frage, was überhaupt eine Metasprache bzw. ein Dokumententyp ist. Die Metasprache kann man auch als Beschreibungssprache bezeichnen. Das heißt für die Definition, dass XML eine Sprache ist, die das Definieren von Dokumententypen beschreibt. Um Dokumententypen erklären zu können, muss erst der Begriff Elemententyp erklärt werden. Die Erklärung für den Elemententyp, findet man in dem Kapitel HTML. Ein Dokumenttyp kann man nun folgenderweise definieren: „Der Dokumenttyp zeigt an, welche Elemententypen in welcher Weise ineinander verschachtelt sind.“ Nachdem nun alle Begriffe erklärt wurden, kann man die Definition von XML zusammenfassen: „XML beschreibt, welche Elemententypen in welcher Struktur in dem Dokument vorkommen dürfen.“ In XML dürfen also die Elemententypen und ihre Struktur untereinander definiert werden. Es ist daher leicht einzusehen, dass HTML ein spezieller XML Dokumententyp ist, denn: „HTML beschreibt, welche Elemententypen in welcher Struktur in dem HTML Dokument vorkommen dürfen.“ Die Entscheidung für XML ist aus den folgenden Gründen sinnvoll: • XML ist konform zu HTML. • Tests sollen ohne Programmierkenntnisse oder speziellen Softwarekenntnisse erstellt werden können. - 37 - Kapitel 5 : Planung Testausführer • Tests sollen auch von Menschen lesbar sein. • Die Testbeschreibung muss gut strukturiert und maschinell verarbeitbar sein. • Es existiert eine große Anzahl Werkzeuge für XML Verarbeitung, wie • Erstellen, Editieren von XML Dateien • Validieren von XML Dateien Gewählte Werkzeuge zum XML Verarbeiten • Commons Digester (Apache Software Foundations) • Xerces (Apache Software Foundations) 5.2 Simulation des Browserzugriffs Da es um automatisiertes Testen einer Webanwendung geht, steht die Simulation des Browsers an zentraler Stelle. Wie soll es möglich sein auf eine Weboberfläche zu zugreifen, wenn sie nicht „per Hand“ gesteuert werden soll? Die Antwort ist natürlich: durch eine Programmiersprache. Es gibt eine große Auswahl von Werkzeugen, mit deren Hilfe auf Weboberflächen per Programmiersprache (Java) zugegriffen werden kann. Diese Werkzeuge modellieren und simulieren den Ablauf in einem Webbrowser. Die Entwicklung wurde mit dem Werkzeug HttpUnit angefangen, wir mussten aber später auf HtmlUnit umsteigen. Der Grund dafür war die fehlende Funktionalität und schwierige Erweiterungsmöglichkeit (bedingt durch die interne Klassenstruktur) von HttpUnit. So ist also HtmlUnit bei uns zum Einsatz gekommen. Junit wird hier nur diskutiert, weil einige der zunächst beschriebenen Anwendungen Junit, oder Teile davon, als Basis benutzen. Typischerweise kann die Fehlerbehandlung von Junit überall benutzt werden. Junit Junit [Link02] ist ein kleines, mächtiges „open source“ Framework zur Automatisierung von Java Unit Tests. Geschrieben wurde er in der Programmiersprache Java. Vorteile: • Programmiersprache ist gleich Testsprache, dies erleichtert das Schreiben der Tests. • Trennung von Anwendungs- und Testcode. Testfälle stehen in eigener Hierarchie, nicht gemischt mit dem tatsächlichen Code. • Unabhängigkeit der Testfälle voneinander. Für jede Testmethode (Testfall) wird eine Vorkonfiguration (setUp()- Methode) und Nachkonfiguration (tearDown()- Methode) vorgenommen. • Tesfälle können beliebig in Testsuites (Testsammlungen) zusammengefasst werden. • Erkennen des Testergebnisses mit einem Blick. Dazu dienen die Assert – Methoden, die eine eindeutige Überprüfung des Soll- Istwertes bewerkstelligt. • Es gibt viele Erweiterungen, die weitere Funktionalität zur Verfügung stellen. Siehe dafür - 38 - Kapitel 5 : Planung Testausführer [Junit04]. Nachteile: • Es müssen zusätzliche Methoden für das Testen geschrieben werden. Durch mehr Code entstehen mehr Fehlermöglichkeiten. • Nur für Modultest gut geeignet. • Keine Möglichkeit andere Testarten, als Unit Tests auszuführen. 5.2.1 HttpUnit Erweiterung vom Testframework Junit. HttpUnit stellt Werkzeuge zum Zugreifen verschiedenster Elemente auf einer Weboberfläche zur Verfügung. Es basiert auf dem „Request- Response“ (FrageAntwort) Verfahren. • Beispiel: Testprogramm „x“ 1. Google Seite aufmachen. 2. Schreibe in dem Textfeld mit dem Namen „q“ den Wert „HttpUnit“. 3. Drücke Knopf mit den Namen „btnG“. 4. Suche den Verweis mit dem Namen „HttpUnit“. 5. Klicke den gefundenen Verweis an. 6. Überprüfe ob der Titel „HttpUnit“ ist. 7. Suche Verweis mit dem Namen „User's Manual“. import import import import import junit.framework.TestCase; com.meterware.httpunit.WebResponse; com.meterware.httpunit.WebConversation; com.meterware.httpunit.WebForm; com.meterware.httpunit.WebRequest; public class SearchExample extends TestCase { public void testSearch() throws Exception { WebConversation wc = new WebConversation(); WebResponse resp = wc.getResponse ( "http://www.google.com"); WebForm form = resp.getForms()[0]; form.setParameter("q", "HttpUnit"); WebRequest req = form.getRequest("btnG"); resp = wc.getResponse(req); assertNotNull(resp.getLinkWith("HttpUnit")); resp = resp.getLinkWith("HttpUnit").click(); assertEquals(resp.getTitle(), "HttpUnit"); assertNotNull(resp.getLinkWith("User's Manual")); } - 39 - Kapitel 5 : Planung Testausführer } Vorteile: • ausgereiftes, länger existierendes Testframework • bei „standard“-Anwendung sehr gut brauchbar (kein Automatisierungswunsch) • gute Frameunterstützung • ausgereifte JavaScript Unterstütztung Nachteile: • keine direkte Möglichkeit HTML Elemente durch ein beliebiges Attribut zu finden • keine oder kaum Unterscheidung in der Behandlungsweise zwischen verschiedenen HTML Elementen • keine gute Unterstützung vom HTML Element „checkbox“ • schlecht erweiterbar, da zu viele „private class“, „inner class“ vorhanden • viele Klassen wurden nicht oder nicht genügend dokumentiert 5.2.2 HtmlUnit Ähnlich, wie HttpUnit erlaubt HtmlUnit auch das Zugreifen auf Webseiten auf HTML Basis. Sie basiert aber auf der Behandlung von HTML Seiten. • Beispiel: Testprogramm „x“ (siehe auch HttpUnit Beispiel) import import import import import import import import java.net.URL; junit.framework.TestCase; com.gargoylesoftware.htmlunit.WebClient; com.gargoylesoftware.htmlunit.HtmlAnchor; com.gargoylesoftware.htmlunit.HtmlForm; com.gargoylesoftware.htmlunit.HtmlPage; com.gargoylesoftware.htmlunit.HtmlSubmitInput; com.gargoylesoftware.htmlunit.HtmlTextInput; public class SearchExample extends TestCase { public void testSearch() throws Exception { WebClient wc = new WebClient(); URL url = new URL("http://www.google.com"); HtmlPage page = (HtmlPage) wc.getPage(url); HtmlForm form = (HtmlForm) page.getAllForms().get(0); HtmlTextInput text = (HtmlTextInput) form.getInputByName("q"); text.setValueAttribute("HttpUnit"); HtmlSubmitInput button = (HtmlSubmitInput) form.getButtonsByName("btnG"); page = (HtmlPage) button.click(); assertNotNull(page.getAnchorByName("HttpUnit")); - 40 - Kapitel 5 : Planung Testausführer HtmlAnchor link = page.getAnchorByName("HttpUnit"); page = (HtmlPage) link.click(); assertEquals(page.getTitleText(),"HttpUnit"); assertNotNull(page.getAnchorByName("User's Manual")); } } Vorteile: • Innerer Aufbau gut strukturiert, daher leicht erweiterbar • Möglichkeit, verschiedene Browser (Stöberer) Versionen anzugeben • HTML Elemente werden auch intern unterschieden => Möglichkeit zur verschiedenen Behandlung Nachteile: • relativ unbekannt in Fachkreisen • keine Dokumentation vorhanden, außer der Projektseite • schlechtere Frameunterstützung • JavaScript Unterstützung sehr rudimentär 5.2.3 JwebUnit Erweiterung von Junit und HttpUnit. JwebUnit vereinfacht die Testdefinition von HttpUnit und führt neue Assert- Methoden ein. • Beispiel: Testprogramm „x“ import net.sourceforge.jwebunit.WebTestCase; public class JWebUnitSearchExample extends WebTestCase { public JWebUnitSearchExample(String name) { super(name); } public void setUp() { getTestContext().setBaseUrl("http://www.google.com"); } public void testSearch() { beginAt("/"); setFormElement("q", "httpunit"); submit("btnG"); clickLinkWithText("HttpUnit"); assertTitleEquals("HttpUnit"); assertLinkPresentWithText("User's Manual"); } - 41 - Kapitel 5 : Planung Testausführer } Vorteile: • sehr klein => sehr gut überschaubar • sehr leicht benutzbar • Zugriffsmöglichkeit auf die HttpUnit Schnittstelle für erweiterte Funktionalität Nachteile: • basiert auf HttpUnit, daher dieselben Nachteile vorhanden 5.3 Anwendungsbereich Das zu implementierende Testwerkzeug soll im „black- box“ Testbereich Anwendung finden. Diese Testart kann in jedem Schritt des Software- Entwicklungsprozesses herangezogen werden. Siehe Abbildung 11 Anwendbarkeit von "black-box" Tests. „white- box“ Testen ist mit dem Testwerkzeug Anforderungen spezifizieren „black-box“ Abnahmetest System spezifizieren „black-box“ (Sub)System entwerfen „white-box“ „black-box“ Integrationstest Modul entwerfen „white-box“ „black-box“ Modultest Systemtest Kodieren Abbildung 11 Anwendbarkeit von "black-box" Tests nicht möglich. Das Hauptaugenmerk liegt auf Regressionstests von Webanwendungen. Diese Testart ermöglicht es, nach Änderungen bzw. Korrekturen der Webanwendung zu prüfen, ob weiterhin die vorher spezifizierte Funktionalität gegeben ist. Wir haben uns dabei auf zwei Testarten spezialisiert. • Funktionstest • Massentest Bedingt ausführbar sind die Testarten: • Zeittest - 42 - Kapitel 5 : Planung Testausführer • Interoperabilitätstest • Benutzbarkeitstest • Lasttest Welche Testfälle angewandt werden und wie die Testdaten dazu erzeugt werden, bleibt weiterhin die Aufgabe des Testers. Die Methoden, wie die Testfälle systematisch ausgewählt werden können, wurde in dem Kapitel „Black-box Testen“ beschrieben. Die intuitivste Möglichkeit zur Auswahl der Testfälle für Funktionstest wäre die Funktionsabdeckung. Die wichtigste Bedingung und Einschränkung bei jedem Test ist, dass das Testwerkzeug die Webanwendung nur auf HTML (Hyper Text Markup Language) Ebene testen kann. Diese Ebene beinhaltet alles, was in der Oberfläche der Anwendung erscheint bzw. die internen Zustände, die in der HTML Seite gehalten werden (z.B. Informationen in cookies, header). Zusammenfassend kann man also sagen: „Es kann alles mit dem Testwerkzeug getestet werden, was man sieht!“ 5.4 Anforderungen Bei der Konzeption des Testwerkzeugs werden die folgenden Kriterien an die Software gesetzt. • Wiederverwendbarkeit von Testdefinitionen. Die auszuführenden bzw. bereits ausgeführten Tests müssen gespeichert werden und ohne zusätzlichen Aufwand wieder ausführbar sein. • Möglichkeit Module zu definieren. Module sind Testablaufausschnitte, die beliebig oft in beliebig viele Tests eingebunden werden können. In dem Modul können statt fester Testwerte auch Variablen vorhanden sein, diese sollten beim Einbinden in den entsprechenden Testablauf angegeben werden. Sehr gut geeignet z.B. für den Login-Vorgang. • Möglichkeit zur Testdatengenerierung. Es soll eine Schnittstelle definiert werden die es ermöglicht, Testdaten mit den vorgegebenen, erlaubten Inhalten zu definieren. • Unterscheidung von Fehlertypen und Konzept zur Behandlung. Es sollen verschiedene Fehlertypen definiert werden und ihre Rolle und Behandlung während (z.B. Abbrechen des Testfalls) und nach Ablauf des Tests (z.B. Weiterreichung der Fehler an den Entwicklern) festgelegt werden. • Tests müssen leicht definierbar sein. Die Tests müssen leicht und ohne Programmierkenntnisse definierbar sein. • Graphische Benutzeroberfläche soll vorhanden sein. Die graphische Benutzeroberfläche soll das Arbeiten mit dem Testwerkzeug erleichtern. Sie soll Unterstützung und Hilfe leisten bei der Definition von verschiedenen Testarten, Modulen, Testzusammenfassung etc. Die Auswertung von Fehlern soll vereinfacht werden. • Loggen des Testablaufs. - 43 - Kapitel 5 : Planung Testausführer Es soll eine Schnittstelle definiert werden, die es erlaubt eigene Logger einzubinden. Diese wird benötigt, damit beispielsweise Loggen direkt in die entsprechende Datenbank möglich wird. • Extrahieren von fehlgelaufenen Tests. Die fehlerhaften Tests sollten extrahiert werden, damit sie direkt an den verantwortlichen Entwickler zur Korrektur weitergereicht werden können. • Möglichkeit Tests zusammenzufassen. Diese Möglichkeit soll gegeben sein, damit nicht alle Tests einzeln gestartet werden müssen. So wird es beispielweise ermöglicht, die Tests nachts ablaufen zu lassen. 5.5 Teststruktur Da unsere Anwendung XML (Extensible Markup Language)– basiert sein soll, wurde als erstes die Struktur dafür festgelegt. Dabei hat sich die folgende Struktur ergeben: • Es gibt drei Arten von XML Dateien. • XML Datei für die Zusammenfassung von Tests, wird in späterer Testsammlung genannt. • XML Datei für die Testdefinition, wird im späteren Test genannt. • XML Datei für ein Modul, wird im späteren Modul genannt. • Testsammlung dient zur Konfiguration des Testablaufs und zum Zusammenfassen von Testdateien. Bei der Konfiguration können die Attribute, wie Hostadresse, Logger, HTML Ablaufschreiber und einzubindende eigene JAR (Java Archive) [Som98] Dateien angegeben werden. Bei der Zusammenfassung kann man in die Testsammlung sowohl andere Testsammlungen, als auch Tests einfügen. • Test dient zur Definition eines Testablaufs. Hier wird angegeben, an welcher genauen Adresse der Test gestartet werden soll und welche HTML Elemente in welcher Reihenfolge bearbeitet werden sollen. Das Bearbeiten der HTML Elemente umfasst in erster Linie die Funktionen wie Vorhandensein, Nichtvorhandensein des Elements, Drücken des Elements, Setzen des Elements, Überprüfen des Elementenstatus. Ein Test kann Module erhalten. • Modul erhält die Definition eines Moduls. Dieses erlaubt, dass ein Teil des Testablaufs in eine neue XML Datei ausgelagert wird. In dem Modul können dabei für die Werte Platzhalter (Variablen) eingebunden werden. Der Wert dieser Platzhalter wird erst beim Einbinden in den entsprechenden Tests angegeben. Im Modul werden keine weiteren XML Dateien eingebunden. Zusammenfassend entsteht also eine hierarchische Struktur von XML Dateien, die folgenden Regeln genügt: Testsammlung:: ( Testsammlung| Test)* Test:: (Module)* • Beispiel: Abbildung 12 XML Struktur des Entwicklungsprozesses - 44 - Kapitel 5 : Planung Testausführer Abbildung 12 XML Struktur des Entwicklungsprozesses Bei der Abbildung 12 XML Struktur des Entwicklungsprozesses entsprechen die Knoten einzelnen XML Dateien. Der Pfeil zeigt an, dass die Datei (am Ende des Pfeiles) in die Datei (am Anfang des Pfeiles) per Referenz eingebunden wurde. Bei der Erstellung solcher XML Hierarchien sollte eine Voraussetzung besonders beachtet werden. „Der entstehende Graph darf nicht zyklisch sein!“ Die Abarbeitung dieser XML Struktur läuft folgendermaßen ab (angefangen beim „root“- Knoten): • Ausführung eines Testsammlungsknotens 1. Laden der Testsammlungsdatei. 2. Konfigurieren der Testsammlung. 3. Ausführen des Sammlungsteils (Kinderelemente werden der Reihe nach abgearbeitet). • Ausführung eines Testknotens Die Testdatei wird geladen und Schritt für Schritt ausgeführt. Falls Module erhalten sind, werden sie im Test geladen und mit ausgeführt. • Ausführung eines Modulknotens: Die Moduledatei wird geladen und, in den Testablauf eingebunden, ausgeführt. - 45 - Kapitel 5 : Planung Testausführer ➔ Testsammlung (System) ➔ Testsammlung (Schnittstellen) ➔ Testsammlung (Module) ➔ Test 2 ➔ Test 3 ➔ Test 4 ➔ Modul 1 ➔ Testsammlung (Abnahme) ➔ Testsammlung (Schnittstellen) ➔ Testsammlung (Module) ➔ Test 2 ➔ Test 3 ➔ Test 4 ➔ Modul 1 ➔ Test 5 ➔ Modul 1 ➔ Test 6 ➔ Modul 1 ➔ Test 1 Nach diesen Regelwerk wird die Abarbeitungsreihenfolge in der Abbildung 12 XML Struktur des Entwicklungsprozesses gezeigt. - 46 - Kapitel 6 : Planung Plugin 6 Planung Plugin In diesem Abschnitt sollen die Vorüberlegungen zur Planung des Plugins und die Entscheidungen verdeutlicht werden. Dazu werden wir erst die Vorüberlegungen bzw. Ansprüche die wir an das Plugin haben aufzählen. Danach gehen wir kurz auf die Planung in der Zusammenarbeit mit dem Testausführer ein. 6.1 Vorüberlegung Das beste Werkzeug zum Ausführen automatisierter Tests nutzt nichts, wenn eine geeignete Oberfläche zum Bearbeiten der Tests fehlt. Es war deshalb von Anfang an unser Ziel und Bestreben, dem Anwender ein Werkzeug in die Hände zu geben, mit dem er die Testfälle leicht und einfach Erzeugen, Verwalten und Bearbeiten kann. Wie im vorherigen Abschnitt erläutert, werden wir XML zum Speichern der Testfälle benutzen. Dies hat zwar den Vorteil, das die Testfälle auch vom Anwender direkt ohne Werkzeugunterstützung gelesen werden können, aber gerade bei sehr großen und vielen Dateien verliert man dabei schnell den Überblick. Deswegen ist eine abstraktere Sicht auf die Daten nötig, welche durch unser Plugin realisiert werden soll. Folgende Punkte sollen dabei berücksichtigt werden: 1. In den unterschiedlichen Sichten soll weiterhin direkt auf der XML Struktur gearbeitet werden. 2. Ein direktes bearbeiten der XML Struktur soll weiterhin möglich sein, aber auch dabei soll der Anwender mit Hilfen unterstützt werden (z.B. durch Code Completion). 3. Der Anwender soll in allen Ansichten Hilfen zum momentanen Problem einfach erreichen können. 4. Die vorhandene Hilfe sollte übersichtlich und durchsuchbar sein. 5. Das Werkzeug soll ihm ein einfaches Navigieren in den Testfällen ermöglichen und die Abhängigkeiten der Testfälle untereinander leicht erkennen lassen. 6. Es sollte eine Unterstützung zum Refactoring geben. Dies bedeutet z.B. nach dem Verschieben oder Umbenennen von Testfällen, sollte dies automatisch in allen abhängigen Testfällen vom Werkzeug erledigt werden. 7. Das Ausführen der Testfälle soll schnell und einfach sein. 8. Die Darstellung der Testergebnisse soll übersichtlich und das Auffinden von fehlgeschlagenen Tests schnell sein. 9. Ein Extrahieren von fehlgeschlagenen Testfällen sollte möglich sein, damit diese an Entwickler weitergegeben werden können. 10.Das Verwenden von anderen Werkzeugen sollte möglich bzw. schon vorgesehen sein. Da wir schon häufiger mit der Eclipse IDE gearbeitet hatten, wussten wir, das diese für viele der oben genannten Punkte Unterstützung bietet. Deshalb haben wir uns entschieden, das Werkzeug zum Bearbeiten der Testfälle als Eclipse Plugin zu schreiben. Zwar hätte man auch eine komplett eigene Anwendung schreiben können, dies würde aber einen viel größeren Entwicklungsaufwand bedeuten. Zum anderen wäre die Zusammenarbeit mit anderen Werkzeugen erschwert worden. Im dem folgenden Abschnitt wollen wir kurz beleuchten, in wie fern Eclipse die zuvor genannten Anforderungen unterstützt oder auf andere bzw. selbst zu entwickelnde Werkzeuge zurückgegriffen - 47 - Kapitel 6 : Planung Plugin werden muss. 6.1.1 XML Unterstützung Eclipse selbst bietet nicht direkt eine Unterstützung zum internen Gebrauch von XML-Strukturen an. Diese kann aber durch die Verwendung diverser Werkzeuge bzw. Bibliotheken ausgeglichen werden. Da in Eclipse selbst das Model-View-Controller Konzept zum Tragen kommt, ist es auch nicht schwierig diesen Punkt umzusetzen. Bei Texteditoren kommt eine Erweiterung dieses Musters zum Einsatz. Dabei wird ein sogenannter Dokumentverwalter zwischen dem Editor und dem Dokumentenmodell gesetzt. Dieser regelt dann die Zugriffe auf das Modell bzw. meldet Änderungen zwischen Editor und Dokument weiter. An das Modell des Dokumentes wird noch ein Partitionierer gehängt. Dieser teilt automatisch bei jeder Änderung des Modells das Dokument in nicht überlappende Partitionen auf. Dafür wird ein Textscanner verwendet, der mit entsprechenden Regeln Controller View AbstractTextEditor StyledText Model Document DocumentProvider RuleBasedPartitioner Rule Rule Rule Abbildung 13 Eclipse: Model-View-Controller bestückt ist. Eine Übersicht der Abhängigkeiten sehen sie in Abbildung 13. Zum Abbilden der XML Struktur auf ein internes Objektmodell sollen der XML Parser Xerces, sowie Digester zum Einsatz kommen. Bei Xerces handelt es sich um einen von der Apache Software Foundation entwickelten XML Parser. Wir werden die SAX-Variante des Parser zum Einlesen der Struktur und für das Validieren der Dokumente gegen eine DTD (Document Type Definition) verwenden. Digester ist ein von der Apache Software Foundation entwickelter Aufsatz für SAX-Parser, der es vereinfacht XML-Elemente auf Javaobjekte abzubilden. Dabei wird der Digester mit Regeln konfiguriert, die festlegen, wie XML-Elemente auf Objekte abgebildet werden. Die fertige Objektstruktur besteht dann schon aus den von uns benötigten Objekten und muss nicht erst noch umständlich z.B. aus der DOM-Struktur erstellt werden. Eine Beispiel für eine Abbildung der - 48 - Kapitel 6 : Planung Plugin Objektstruktur XML-Dokument Root Element1 Element3 Digester Element2 Text = ... ... <root> <element1/> <element2> <element3>...</element3> </element2> <element1/> </root> Element1 Abbildung 14 Digester XML- / Objektstruktur Objektstruktur zeigen wir in der Abbildung 49. Für das Verarbeiten der DTD kommt ein DTD Parser zum Einsatz. Dieser überführt die DTD in eine interne Objektstruktur, die dann zum Erhalten von Informationen über die DTD befragt werden kann. Dazu gehört z.B. welche Elmente als Kindelemente in einem Elternelement erlaubt sind. Diese Information wird für die Codevervollständigung im Texteditor benötigt. 6.1.2 Editoren Die Editoren zum Bearbeiten der Tests und Testsammlungen sollen eine abstraktere Sicht auf die Daten bieten. Es soll dem Anwender aber weiterhin möglich sein, auch die XML Daten direkt zu bearbeiten. Dies kann in Eclipse mit den sogenannten Multipage Editoren erreicht werden. Multipage Editoren sind Editoren die aus mehreren Seiten bestehen, die auf verschiedenen Registerkarten angeordnet sind. Ein Beispiel hierfür, ist der Plugin Editor im PDE (siehe auch Abbildung 15 und Abbildung 16). Der Plugin Editor bietet eine strukturierte Ansicht der XML Daten verteilt auf Abbildung 15 Eclipse: PDE Editor mehrere Registerkarten. Diese Sicht vereinfacht das Bearbeiten der Daten und bietet die Möglichkeit, Hilfen direkt durch selbsterklärende Feldnamen oder entsprechend aufzurufende Dialoge anzubieten. - 49 - Kapitel 6 : Planung Plugin Gerade bei sehr komplexen XML Daten sind solche Darstellungen für den Anwender hilfreich. Abbildung 16 Eclipse: PDE Editor Registerkarten Damit weiterhin eine direkte Bearbeitung der XML Daten möglich bleibt, wird im PDE Editor die Registerkarte Source angeboten (siehe auch Abbildung 16). Hier steht dem Anwender ein einfacher XML-Editor zur Verfügung. Da die Dateien mit jedem gewöhnlichen Texteditor oder XML-Editor bearbeitet werden können, ist diese Ansicht auch nötig, wenn die Daten nicht mehr der DTD entsprechen und deshalb nicht in ein internes Modell überführt werden können. Dann kann nur noch der Texteditor angezeigt werden. Dem Anwender werden durch entsprechende Marker gezeigt, wo es Probleme gibt, um ein schnelles Beheben der Fehler zu ermöglichen. Diese Art von Editoren wird durch das Eclipse Framework unterstützt. Es gibt entsprechende Schnittstellen, die ein implementieren von Multipage Editoren vorsehen. 6.1.3 Navigation und Ansichten Die Daten, die zu einem Test gehören (dazu gehören Testdefinitionen, Testsammlungen, Module, usw.), sollen dem Anwender in einer übersichtlichen und leicht verständlichen Darstellung angezeigt werden, die ihm ein einfaches Navigieren erlauben. Die von Eclipse verwendete Strukturierung der Daten soll dabei übernommen werden. Dazu sollen alle zusammengehörigen Daten in ein Projekt als Dateien abgelegt werden. Dies ermöglicht das Verwenden der schon in Eclipse enthaltenen Ansichten zum Navigieren auf den Daten, wie den Navigator oder den Package Explorer. Des Weiteren können diese Ansichten durch den Pluginmechanismus auch leicht mit zusätzlicher Funktionalität erweitert werden. Die Verwendung von schon vorhandenen bzw. bekannten Ansichten erleichtert den Anwendern das Benutzen des Werkeuges. Dies gilt insbesondere für Anwender, die schon vorher Eclipse für andere Zwecke benutzt haben. Es verringert auch den Implementierungsaufwand, der betrieben werden muss, um diese Ansichten zu erstellen. Um eigene Implementierungen so klein wie möglich zu halten, sollen die schon vorhandenen Ansichten nur erweitert werden. Dies betrifft hauptsächlich die Ansichten der Navigatoren und Eigenschaften. 6.1.3.1 Navigatoren Die Navigatoren stellen die Projektstruktur dar. Die neuen Datenobjekte, wie Testdefinition oder Testsammlung, müssen in dem Navigator gekennzeichnet werden. D.h. sie haben eindeutige Icons, welche erkennen lassen, um was es sich handelt. Des Weiteren müssen die Kontextmenüs in den Navigatoren auf diesen Objekten, um die Aktionen erweitert werden, die auf ihnen ausführbar sind. Dazu gehört z.B. das Starten eines Tests. Ein Beispiel für einen schon in der Eclipse Standardinstallation vorhanden Navigator sehen wir in Abbildung 17. In ihm werden die vorhanden Ressourcen im Workspace angezeigt. Der Pluginmechanismus in Eclipse erleichtert die zuvor aufgeführten Änderungen bzw. Erweiterungen. Von einer Implementierung eigener Navigatoren kann vorerst abgesehen werden, da die Funktionalität der Vorhandenen ausreicht. - 50 - Kapitel 6 : Planung Plugin Abbildung 17 Eclipse: Navigator für Resourcen 6.1.3.2 Ansicht der Eigenschaften Die Ansicht der Eigenschaften erlaubt es Informationen über bestimmte Objekte darzustellen und zu bearbeiten. Ein Beispiel für Eigenschaften eines Dateiobjektes sehen sie in Abbildung 18. Dort werden die Eigenschaften eines Dateiobjektes dargestellt, das in der Navigatoransicht ausgewählt Abbildung 18 Eclipse: Ansicht der Eigenschaften wurde. Für unser Werkzeug wollen wir die Eigenschaftenansicht dazu verwenden, dem Anwender das schnelle und übersichtliche Bearbeiten bzw. Ansehen von Objekteigenschaften zu ermöglichen. Dies wird durch die in Eclipse bereitgestellte Schnittstelle begünstigt, die es erlaubt für alle Objekte die über die Oberfläche selektierbar sind, Eigenschaften zu definieren. 6.1.4 Darstellung der Testergebnisse Die Darstellung der Testergebnisse eines Laufes wird durch den verwendeten Logger geregelt. Als Logger setzen wir dafür Log4j ein und ermöglichen es dem Anwender selbst anzugeben, was, wie und wohin geloggt werden soll. Wir haben deswegen nicht direkt einen Einfluß auf die Darstellung - 51 - Kapitel 6 : Planung Plugin der Loggergebnisse. Die Ergebnisse könnten z.B. in eine HTML- oder XML-Datei geschrieben werden, welche dann zur weiteren Auswertung genutzt werden kann. Abbildung 19 Eclipse: Anischt JUnit Allerdings wollen wir eine Ansicht implementieren, die nach einem Testlauf alle aufgetretenen Fehlermeldungen anzeigt und ein schnelles Auffinden der entsprechenden Testfälle ermöglicht, in denen diese aufgetreten sind. Das Aussehen der Ansicht soll sich dabei an die in Eclipse enthaltene Ansicht von Junit, wie in Abbildung 19 zu sehen, anlehnen. 6.1.5 Hilfe Um dem Anwender das Verwenden des Werkzeuges zu erleichtern, muss ihm in allen Bereichen eine Hilfe zu Verfügung stehen. Diese sollte ihn mit kurzen Erläuterungen bzw. mit Verweisen auf nähere Erklärungen unterstützen. Das Navigieren in dieser Hilfe sollte übersichtlich und einfach sein. Diese Voraussetzungen werden bestens von der Eclipse Plattform erfüllt. Sie enthält ein integriertes Hilfesystem, das erlaubt, in allen graphischen Oberflächenelemten eine kontextsensitive Hilfe Abbildung 20 Eclipse: Kontexthilfe anzubieten. Der Anwender kann diese jederzeit mit Drücken von F1 aufrufen. Es erscheint dann eine - 52 - Kapitel 6 : Planung Plugin Kontexthilfe, die eine kurze Erklärung beinhalten kann oder noch Verweise auf ausführlichere Themen besitzt. Ein Beispiel dafür sehen sie in der Abbildung 20. Dieses Beispiel zeigt die Kontexthilfe in der Eigenschaftenansicht an. Sie gibt eine kurze Erläuterung der Funktion der Ansicht und verweist auf Kapitel in der Onlinehilfe. Dieses Kapitel kann der Anwender durch Anklicken der Links direkt öffnen. Abbildung 21 Eclipse: Onlinehilfe Die Onlinehilfe von Eclipse wird in sogenannte Bücher (Books) unterteilt. Dabei ist es meist so, dass ein Buch zu einem Werkzeug oder Plugin von Eclipse gehört. Die Bücher sind dann in entsprechende Sektionen unterteilt. Diese sind praktisch Verweise auf entsprechende Dateien, in denen die Hilfe gespeichert ist. Als Beispiel zeigen wir in Abbildung 21 die allgemeine Hilfe für das Verwenden von Eclipse. Neben dem Darstellen der Onlinehilfe, bietet Eclipse auch gleich eine Funktion zum Durchsuchen nach Schlagwörtern. Dazu kommt eine in Eclipse vorhandene Suchmaschine zum Einsatz, die alle Dokumente nach den Schlagwörtern durchsucht und nach Relevanz sortiert. Eclipse bietet also reichhaltige Unterstützung was das Erstellen und Verwenden von Hilfe angeht und es muss nicht auf Werkzeuge von Dritten oder auf eigene Implementierungen zurückgegriffen werden. 6.1.6 Refactoring Eine direkte Unterstützung für Refactoring gibt es in Eclipse nicht. Allerdings können die Aktionen leicht in die schon vorhandenen Menüs eingepflegt werden. Ein Überschreiben von Aktionen für bestimmte Objekttypen ist auch leicht möglich. So könnten z.B. beim Umbenennen oder Verschieben von Testfällen automatisch alle Referenzen in den Testsammlungen auch angepasst werden. Als Beispiel soll hier einmal das Refactoring des Java Plugins genannt sein, welches den in Abbildung 22 gezeigten Dialog beim Umbennen von Klassen anbietet. - 53 - Kapitel 6 : Planung Plugin Abbildung 22 Eclipse: Java Rename Dialog 6.1.7 Andere Werkzeuge Durch den Pluginmechanismus von Eclipse steht dem Verwenden von anderen Werkzeugen nichts im Wege. Gibt es entsprechende Plugins, können diese einfach integriert werden und stehen ab sofort dem Anwender zur Verfügung. Schon in der Standardinstallation enthält Eclipse nützliche Plugins, wie z.B. das CVS Plugin. Mit diesem ist es möglich, jegliche Art von Projekt in einem CVS zu führen, ohne auf zusätzliche Werkzeuge außerhalb von Eclipse angewiesen zu sein. Zum anderen hat das den Vorteil, dass auf jeder Plattform, auf der Eclipse läuft, die Umgebung und Werkzeuge gleich bedient werden. Die Verwendung von verschiedenen Werkzeugen entfällt somit, wie z.B. bei allein stehenden CVS Klienten auf Unix und Windows. Das Angebot an Plugins für diverse Anwendungsbereiche ist groß. Es reicht von klompletten IDEs für andere Programmiersprachen (z.B. Java, Perl oder C/C++), über Datenbankverwaltungen (z.B. für MySQL, Oracle, usw.), UML-Werkzeugen, HTML- und XML-Editoren und vieles mehr. Eine genaue Aufzählung würde den Rahmen sprengen, es sei aber auf die [Ecl04] Literatur verwiesen. Dort stehen mehrere Links auf Seiten, die Plugins anbieten. Durch die Eclipse-Plattform ist es dem Entwickler möglich alle seine benötigten Werkzeuge unter einem Dach zu haben. Ein Wechseln zwischen vielen verschiedenen Werkzeugen entfällt. Zum Anderen ist der Aufbau und die Verwendung der Werkzeuge häufig gleich oder zumindest sehr ähnlich, da versucht wird, bei der Entwicklung der Plugins sich an die von Eclipse vorgegebenen Designregeln zu halten. Dies verringert den Einarbeitungsaufwand und erhöht die Produktivität des Anwenders bei der Verwendung der Werkzeuge. 6.1.8 Zusammenfassung Viele der in der Vorüberlegung genannten Ansprüche bzw. Vorgaben können wir mit Hilfe der Eclipse Plattform abdecken. Diese beinhaltet entweder schon fertige Werkzeuge oder bietet Schnittstellen und Frameworks an, die ein einfaches Implementieren der benötigten Funktion - 54 - Kapitel 6 : Planung Plugin ermöglichen. Bei der Verarbeitung von XML und DTD müssen wir auf andere Werkzeuge und Bibliotheken ausweichen. Für die Erstellung des Prototypen werden hierfür hauptsächlich Produkte der Apache Software Foundation Verwendung finden, da diese frei zugänglich sind und häufig auch genügend Dokumentation im Internet zu finden ist. Andere Werkzeuge, die auch noch zum Bearbeiten verwendet werden könnten (z.B. zum Auswerten von Log4J Daten), können durch Plugins von Dritten durch den Anwender nachträglich, je nach Bedarf, installiert werden. - 55 - Kapitel 7 : Umsetzung Testausführer 7 Umsetzung Testausführer Dieses Kapitel beinhaltet die Umsetzung des Testausführers. Es wird als Erstes die Architektur behandelt, dann auf die einzelnen Komponenten dieser eingegangen. Dabei wird erklärt, welche Komponente welche Aufgabe und Rolle in der Anwendung hat. Nachher werden die Strukturen der einzelnen XML Dateien im Detail erläutert. Da in dem Testausführer von Anfang an Möglichkeiten zur Erweiterung der Funktionalität eingeplant (und auch implementiert) wurden, werden diese im abschließenden Teil des Kapitels unter dem Titel „Schnittstellen“ beschrieben. 7.1 Architektur Hier wird nur die Architektur des Testausführers ( englisch: TestRunner) erklärt. Diese wurde in im Kasten dargestellt. Die Pfeile zeigen den Informationsfluss zu und von dieser Komponente. Eclipse Oberfläche Testausführer Steuerung Konfiguration Fehler HTML Elemente HTML <html> HTML fjk kf<html> ff fd fd HTML fff fjk ghfn <html> kf hgk ff fdofd u iz f adsgf fjk kfhgk ff fd fffzfghfn o fd hgk o u</html> izfffzfghfn f adsgf u iz zf f adsgf </html> </html> LOG dfgr f r r dfgrt gtg rstg <rs dfgdfb erdber erdrd erhz g rerere dds e Abbildung 23 Architektur des Testausführers Wie schon erwähnt wurde, werden die Definitionen der Testsammlungen, Tests und Module im Dateiformat XML gehalten. Der Testausführer kann nur mit einer Testsammlung aufgerufen werden. Der Ablauf sieht so aus: 1. Der Testausführer wird aufgerufen. Dieser Aufruf kann, muss aber nicht von der Eclipse Oberfläche her erfolgen. Es müssen dabei die folgenden Parameter übergeben werden: • Arbeitsverzeichnis: Dieser ist ein absoluter Pfad, der ein Arbeitsverzeichnis für die Testsammlung definiert. Gedacht ist er dafür, dass alle weiteren Pfadangaben in dieser Testsammlung relativ zu diesem Arbeitsverzeichnis angegeben werden können. • Pfad zur ersten Testsammlung: Dieser Pfad gibt an, wo die Testsammlung, die ausgeführt werden soll, sich befindet. Die Angabe kann absolut oder relativ zu dem Arbeitsverzeichnis erfolgen. 2. Testausführer führt die übergebene XML Struktur aus. - 56 - Kapitel 7 : Umsetzung Testausführer 3. Falls angegeben, werden die Dateien für die HTML Testverfolgung und die Log- Datei geschrieben. 4. Die während der Ausführung gesammelten Fehler werden als Liste an den Aufrufer zurückgeliefert. 7.1.1 Konfiguration Diese Komponente ist verantwortlich für die richtige Konfiguration bei der Ausführung von Tests. Die Konfiguration hat zwei Hauptteile: 7.1.1.1 Konfiguration des Parsers Dieser Teil der Konfiguration wird in sogenannten DTD (Document Type Definition) Dateien festgelegt. In den DTD Dateien wird angeben, welche Kombinationen von Tags in den XML Dateien erlaubt werden. Diese Struktur wird vor dem Parsen überprüft. Den Vorgang der Überprüfung nennt man „validieren“. Die Konfiguration der Dateistruktur kann nicht vom Benutzer angegeben werden, sie ist für alle Testabläufe gleich. 7.1.1.2 Konfiguration der Testsammlung Die Konfiguration der Testsammlung wird in der XML Definitionsdatei der entsprechenden Testsammlung festgelegt. Sie kann, vielmehr muss, von dem Benutzer definiert sein. Hier kann man Optionen festlegen, wie etwa, ob geloggt werden soll und, falls ja, mit welchem Logger der Vorgang beschrieben werden soll. Eine nähere Beschreibung der Konfiguration erfolgt in der Beschreibung der Testsammlungsdatei. Die Ausführung der Konfiguration passiert direkt nach dem erfolgreichen Parsen der Testsammlungsdatei. 7.1.2 Steuerung Wie schon der Name sagt, ist diese Komponente verantwortlich für die Steuerung des Ablaufs in dem Testausführer. Dieser umfaßt die Steuerung aller Abläufe, wie Laden, Validieren, Parsen, Ausführen von XML Dateien, Schreiben von Ausgabedateien etc.. Wie man vielleicht hier schon erkennen kann, spielen bei der Steuerung die XML Dateien eine zentrale Rolle. Sie geben an, was, wann und wie ausgeführt werden soll. Insgesamt ist also festzustellen: „Ausgeführt wird nur das, was in den XML Dateien definiert wurde. Nicht mehr und nicht weniger.“ Beiläufig sei erwähnt, dass die Ausführung der XML Dateien immer dieses ungefähre Schema verfolgt: 1. Laden: Erfolgt immer erst, wenn die entsprechende Datei gebraucht wird. Das hat den Vorteil, dass Arbeitsspeicher gespart wird, da nie mehr im Arbeitsspeicher gehalten wird, als nötig. Nachteil des Verfahrens ist, dass dieselbe Datei evtl. mehrmals geladen wird. Es kann also eine längere Ausführungszeit bedingen. 2. Validieren: Nach dem erfolgreichen Ladevorgang, wird die XML Datei gegen ihre DTD validiert. Das heißt, es wird überprüft, ob alle in der DTD definierten Regeln in der XML Datei erfüllt sind. 3. Parsen: Dach einem gelungenen Validieren (sprich: tatsächlich alle Regeln erfüllt), wird die Datei geparst und auf der vordefinierten internen Klassen- bzw. Objektstruktur abgebildet. Zum Parsen - 57 - Kapitel 7 : Umsetzung Testausführer und Abbilden wird Commons Digester von Apache Foundations verwendet. Für jeden verschiedenen Tag in den XML Dateien ist eine eigene Klasse verantwortlich. Diese Klasse stellt die Methoden zum erfolgreichen Parsen und Ausführen der XML Struktur zur Verfügung. 4. Ausführen: Falls das Parsen auch richtig verlaufen ist, wird die XML Datei ausgeführt. Dazu werden die geparsten Informationen aus den XML Dateien benutzt. Falls diese Information fehlt oder falsche Daten enthält, wird typischerweise die Ausführung der Datei (und der ganzen Hierarchie darunter) abgebrochen und ein Fehler geworfen. Ein Ausnahme dabei ist die Konfiguration der Testsammlung. In diesem Fall wird der Fehler nur abgefangen, in die Fehlerliste geschoben und dann mit der Ausführung fortgefahren. 7.1.3 HTML Elemente In dieser Komponente sind die Klassen zusammengefasst, an denen die einzelnen HTML Elemente abgebildet wurden. Dabei steht jedem unterstützten HTML Tag eine eigene Klasse zur Verfügung. Die implementierten HTML Tags sind: • <a> Verweis; mit Hilfe dieses Elements ist ein Sprung von einer Stelle der Anwendung zur einer Anderen möglich. Der Sprung kann innerhalb der selben Seite, Anwendung oder außerhalb der Anwendung erfolgen. Die Sprungadresse kann sowohl relativ (zur Seitenadresse), als auch absolut angegeben werden. • <button> Klickknopf ist ein Knopf, der mit bestimmten Aktionen verbunden werden kann; z.B. Abschicken eines Formulars, Sprung usw.... Dieser Knopf ist flexibler als herkömmliche Knöpfe, denn er darf auch einen definierten Inhalt haben, etwa eine Grafik. Der Nachteil ist, dass diese Sorte Knopf nur von neueren Browsern unterstützt wird. • <form> Formular definiert einen Bereich der HTML Seite, der zum Weiterbearbeiten mit den ausgefüllten Daten verschickt werden kann. • <frame> Frame definiert ein Ansichtfenster in der Seite. Es werden typischerweise mehrere Frames in einer Seite definiert. • <input> Jegliche Art von (Eingabe-) Felder. • type=“button“ Klickknopf ist ein Knopf, der mit bestimmten Aktionen verbunden werden kann; z.B. Abschicken eines Formulars, Sprung usw....; Dieser ist die ältere Variante des Klickknopfes. Sein Vorteil liegt darin, dass er auch mit älteren Browser nutzbar ist. • type=“checkbox“ Mehrfachauswahl ist eine Gruppe von ankreuzbaren Quadraten, bei denen der Anwender keines, eines oder mehrere auswählen kann. Die Werte von ausgewählten Checkboxen werden beim Absenden des Formulars mit übertragen. • type=“file“ Datei aufladen. Diese Sorte Formularelement erlaubt dem Anwender, eine Datei von seinem lokalen Rechner zusammen mit dem Formular zu übertragen. Wenn ein CGI-Script die ankommenden Formulardaten auf dem Server-Rechner verarbeitet, ist es dadurch möglich, dem Anwender das Uploaden (Hochladen) von Dateien auf den Server-Rechner zu ermöglichen. • type=“image“ Optischer Klickknopf, mit Hilfe dieses Elements ist es möglich, innerhalb von Formularen eine Grafik als Absendeknopf zu definieren. • type=“password“ Passwort Feld, ist das Feld für die Eingabe eines Passworts. Der Unterschied - 58 - Kapitel 7 : Umsetzung Testausführer zu normalen Eingaben ist , dass auf der Oberfläche nur Sternchen statt der Einträge erscheinen. • type=“radio“ Einfachauswahl ist eine Gruppe von beschrifteten Knöpfen, von denen der Anwender einen auswählen kann. Es kann immer nur einer der Knöpfe ausgewählt sein. Der Wert des ausgewählten Knopfes wird beim Absenden des Formulars mit übertragen. • type=“reset“ Zurücksetzen-Knopf erlaubt es, ein teils oder voll ausgefülltes Formular auf seine Anfangswerte zurückzusetzen. Die Anfangswerte entsprechen typischerweise den in der HTML Seite definierten Defaultwerten. • type=“submit“ Abschicken-Knopf ist ein Knopf mit dessen Hilfe ein ausgefülltes Formular zum Weiterverarbeiten abgeschickt werden kann. • type=“text“ Texteingabefeld erlaubt die Eingabe von beliebigen Zeichen in beliebiger Länge, falls nicht anders definiert. • <select> Auswahlbox erlaubt es dem Anwender eine Liste mit festen Einträgen anzubieten, aus der er einen oder mehrere Einträge auswählen kann. Der Text des ausgewählten Eintrags wird übertragen, wenn der Anwender das Formular abschickt. • <textarea> Textbox dient als mehrzeiliges Eingabefeld zur Aufnahme von Kommentaren, Nachrichten usw.. Es ist im Weiteren auch möglich, einen beliebigen Text anzugeben, der in der Seite gesucht werden soll. So ist beispielsweise ein Auffinden der Titel etc. auch kein Problem. Die Klassen haben in der Testausführung mehrere Rollen. Jede Klasse stellt die Methoden zum Parsen, Ausführen und Ausgabe des bestimmten HTML Elements zur Verfügung. 7.1.4 Fehler Diese Komponente definiert verschiedene Fehlertypen und sammelt sie während der Testausführung. Die Sammlung erfolgt an einer zentralen Stelle der Anwendung. Beim Beenden der Ausführung wird die Fehlersammlung an den Aufrufer zurückgeliefert. Dieser kann sie dann weiterbearbeiten. Wenn der Aufrufer die Eclipse- Anwendung ist, werden sie aufbereitet und an den entsprechenden Stellen in den XML Dateien markiert. Es werden grundsätzlich drei Fehlerarten unterschieden: 7.1.4.1 Abgleichfehler im Testablauf Diese Fehlerart taucht dann und nur dann auf, wenn ein in einer XML Datei definierter SOLLZustand nicht dem tatsächlichen aus der HTML Seite ausgelesenen IST- Zustand entspricht. Dieser kann sein: • Gesuchtes HTML Element ist nicht vorhanden. • Wert des HTML Elements ist falsch. Dabei wird typischerweise der Vergleichsoperator „ist gleich“ benutzt. 7.1.4.2 Fehler im Testablauf Diese Fehlerart umfasst alle Fehler des Testablaufs, die nicht in die Kategorie des Abgleichfehlers fallen. Dies sind meistens Fehler, die beim Validieren, Parsen der Testdatei entstehen, aber auch - 59 - Kapitel 7 : Umsetzung Testausführer eventuelle unerwartete Fehler. 7.1.4.3 Fehler im Testsammlungsablauf Diese Fehlerart ist verantwortlich für alle Fehler, die während der Ausführung einer Testsammlung passieren. Das sind meistens Konfigurationsfehler, Fehler beim Validieren, Parsen der Testsammlungsdatei und auch unerwartete Fehler. 7.2 Testsammlungsdatei 7.2.1 Definition Die XML Datei Testsammlung definiert die Konfiguration und die Reihenfolge der zu ausführenden Tests bzw. anderer Testsammlungen. Diese Art der XML Datei ist die Einzige, die direkt zum Ausführen aufgerufen werden kann, ohne eine Einbettung in eine andere Datei. Sie ist also sozusagen die Startdatei für die auszuführenden Testfälle. 7.2.2 Ausführung Bei der Ausführung muss man unterscheiden zwischen der Ausführung der ersten Testsammlung (Root Knoten) und anderer Testsammlungen (Zwischen-, Endknoten). Siehe: Kapitel „Planung des Testausführers“. Um die erste Testsammlung auszuführen, muss die Methode runTestCollection() in der Klasse TestCollectionRunner.java aufgerufen werden. Diese Methode veranlaßt dann die Testsammlungsdatei und alle anderen im <collection> Teil eingefügten weiteren Dateien (Testsammlungsdateien, Testdateien) auszuführen. Die Methode runTestCollection() hat zwei Parameter: 1. testcollectionPath: Ist vom Typ String, der den Pfad zur ersten Testsammlungsdatei angibt. Die Pfadangabe kann absolut oder relativ zum Arbeitsverzeichnis erfolgen. Das Arbeitsverzeichnis wird in dem folgenden Parameter gesetzt werden. 2. workingDirectory: Dieser Parameter ist auch vom Typ String, der den Pfad zu dem Arbeitsverzeichnis der aktuellen Testsammlung angibt. Dieser Pfad muss absolut sein. Ab diesem Punkt ist der Ablauf bei jeder Testsammlung identisch. 1. Testsammlungsdatei wird gegen ihre DTD validiert. 2. Testsammlung wird geparst. 3. Testsammlung wird ausgeführt. 1. Konfigurationen <configuration> werden gesetzt. 2. Sammlung <collection> wird der Reihe nach abgearbeitet. 7.2.3 Fehlerbehandlung Bei der Ausführung einer Testsammlung gibt es nur einen Fehlertyp. Intern werden aber zwei Arten von Fehlern unterschieden: - 60 - Kapitel 7 : Umsetzung Testausführer 7.2.3.1 Konfigurationsfehler Diese sind, wie schon der Name sagt, Fehler die während der Konfiguration der Testsammlung auftreten können. Dieses betrifft die Konfiguration des Loggers (Tag <loggerentry>), der HTML Testverfolgung (Tag <htmltrace>) und die Einbindung von JAR Dateien (Tag <library>). Es gilt nicht für die Definition der Hostadresse (Tag <host>). Beim Vorkommen solcher Fehler wird die Ausführung der Testsammlung fortgesetzt. Das ist nötig, damit die Testsammlungsdatei bei Konfigurationen, die nicht dringend erforderlich sind, trotzdem ordnungsgemäß ausgeführt werden kann (bis auf den Teil, der von der Konfiguration betroffen wird). Durch die Behandlung dieser Fehler kann passieren, dass: • nicht oder nur teils mitgeloggt wird (<loggerentry>) • keine HTML Testverfolgung mitgeschrieben wird (<htmltrace>) • bestimmte Testdateien nicht ausgeführt werden können; auf Grund fehlender Klassendateien (<library>) Generell soll dadurch verhindert werden, dass große Teile der Testhierarchie wegen eines Konfigurationsfehlers nicht ausgeführt werden. 7.2.3.2 Sonstige Fehler Das sind alle anderen Fehler, bei denen die Ausführung der Testsammlung abgebrochen wird. In diesem Fall wird die gesammte Testhierarchie unterhalb dieses Knotens nicht ausgeführt. Dies entspricht also einem Fehler, bei dessen Auftritt keine (richtige) Ausführung der Testsammlung garantiert werden kann. • SAXParseException => XML Moduldatei ist invalid (entspricht nicht der Definition der DTD), XML Testdatei ist invalid • NullPointerException => unbekannte Ursache (entweder Fehler in der Testsoftware oder nicht abgefangene Ausnahmesituation) 7.2.4 Beispiel In diesem Beispiel wird eine mögliche Definition für eine Testsammlungsdatei gegeben. Im Konfigurationsteil wurden folgende Einstellungen für die Testsammlung gesetzt: • Hostadresse: „http://localhost:8080/“ • Loggen: ja, mit der Konfiguration in der „htmlLogger.properties“ Datei • HTML Testverfolgung: ja, unter dem Ordner „c:/test0/test/“ • JAR Datei „test.jar“ wurde in die Anwendung geladen Dabei wurden die folgenden Dateien in der Testsammlung zusammengefasst: • „testInputCheckbox.xml“ Testdatei mit relativer Pfadangabe • „testcollection1.xml“ Testsammlungsdatei mit relativer Pfadangabe • „testSelectOne.xml“ Testdatei mit absoluter Pfadangabe - 61 - Kapitel 7 : Umsetzung Testausführer • „testSelectMultiple.xml“ Testdatei mit absoluter Pfadangabe • „testcollection2.xml“ Testsammlungsdatei mit absoluter Pfadangabe <?xml version="1.0"?> <!DOCTYPE testcollection PUBLIC "-//WebTest//DTD Collection 1.0//EN" "Collection.dtd"> <testcollection> <configuration> <host address="http://localhost:8080/"/> <loggerentry path="/logger/properties/htmlLogger.properties" enabled="on" /> <htmltrace path="c:/test0/test/" enabled="on"/> <library path="c:/test0/test.jar"/> </configuration> <collection> <testentry path="/tests/testInputCheckbox.xml"/> <collectionentry path="/testcollection/testcollection1.xml"/> <testentry path="c:/test0/tests/testSelectOne.xml"/> <testentry path="c:/test0/tests/testSelectMultiple.xml"/> <collectionentry path="c:/test0/testcollection/testcollection2.xml"/> </collection> </testcollection> 7.3 Testdatei 7.3.1 Definition Die Testdatei beschreibt den Testablauf eines Testfalls. Sie kann nicht selbständig ausgeführt werden. Sie muss eingebettet in den <collection> Teil einer Testsammlungsdatei eingebunden sein. Es können zwei Arten von Testdateien definiert werden: • einfacher Funktionstest • Massentest 7.3.2 Ausführung Eine Testdatei kann immer nur in Verbindung mit einer Testsammlungsdatei ausgeführt werden. Der Ablauf sieht so aus: 1. Beim Auffinden eines <testentry> Tags, wird unter dem Attribut „path“ angegebenen Pfad die Testdatei gegen seine DTD validiert. 2. Nach erfolgreichem Validieren wird die Datei geparst und auf die Objektstruktur abgebildet. - 62 - Kapitel 7 : Umsetzung Testausführer 3. Wenn die Testdatei erfolgreich eingelesen wurde, wird mit der eigentlichen Ausführung begonnen. • Testdatei wird Schritt für Schritt ausgeführt. Dabei entspricht ein Schritt einem <step> Tag. • Ein Schritt besteht aus: 1. Aufmachen der entsprechenden HTML Seite. 2. Ausführen des <input> Teils. Dieser Teil dient in erster Linie dem Bearbeiten der HTML Seite. Erst wird dabei das Vorhandensein des Feldes geprüft, dann werden die Elemente der Reihe nach abgearbeitet. Das Bearbeiten der HTML Elemente umfasst typischerweise Setzen eines Wertes, Klicken eines Feldes. Zusammenfassend kann man das als die Veränderung des internen Zustands der HTML Seite nennen. 3. Ausführen des <output> Teils. Dieser Teil dient zur Kontrolle der erwarteten Ergebnisse. Diese Kontrolle besteht erstmal aus der Kontrolle, ob das entsprechende Element in der Ergebnisseite erschienen ist oder nicht. Des Weiteren wird der interne Zustand des Elements kontrolliert. Dabei wird der interne IST- Wert des Feldes durch „ist gleich“ Operator mit dem SOLL- Wert verglichen. Der IST- Wert entspricht dem Wert in der HTML Seite, der SOLL- Wert wurde in der Testdatei definiert. 7.3.3 Fehlerbehandlung Es gibt zwei Arten von Fehlern, die während der Ausführung einer Testdatei auftreten können. Bei einem Fehlerfall ist es aus drei verschiedenen Quellen möglich, die Stelle zu lokalisieren: • Liste der Fehler (Rückgabewert an den Testaufrufer) • Logger Ausgabe (Datei, Konsole, etc., je nach Definition) • HTML Testverfolgung 7.3.3.1 Abgleichfehler Diese Fehlerart bestimmt, ob der vordefinierte Testablauf das gewünschte, vordefinierte Ergebnis geliefert hat oder nicht. Dieser Fehler kann ausschließlich in der Ausführung des <output> Teils der Testdatei, bei der Kontrolle der gelieferten Werte, auftreten. Bei einem erfolgreichen Test darf kein solcher Fehler zurückgeliefert werden. Im Fehlerfall wird die Ausführung der Testdatei gestoppt. Um diesen Fehler beheben zu können, gibt es zwei Möglichkeiten: • Testdatei wurde falsch definiert => Korrektur der Testdefinition • Testdatei wurde richtig definiert => Korrektur der Anwendung 7.3.3.2 Sonstige Fehler Diese Fehlerart umfasst alle anderen Fehler, die während der Ausführung der Testdatei passieren. Im Fehlerfall wird auch hier die Ausführung der gesamten Testdatei angehalten. Da der Fehler viele Ursachen haben kann, ist es auch schwieriger, herauszufinden woran es lag und - 63 - Kapitel 7 : Umsetzung Testausführer dementsprechend eine Korrektur vorzunehmen. Es wird hier versucht eine Hilfestellung für Beheben solcher Fehler zu geben. • UnknownHostException => Hostadresse ist falsch in der Testsammlungsdatei, URL ist falsch in der Testdatei, keine Internetanbindung vorhanden • SAXParseException => XML Moduldatei ist invalid (entspricht nicht der Definition der DTD), XML Testdatei ist invalid • NullPointerException => unbekannte Ursache (entweder Fehler in der Testsoftware oder nicht abgefangene Ausnahmesituation) 7.3.4 Beispiel Das Beispiel beschreibt den folgenden einfachen Testfall: 1. Einloggen mit dem Login „test“ und Passwort „test“. Überprüfen, ob der Login- Vorgang erfolgreich verlaufen ist. 2. Drücken des Verweises „Weiter!“ um an die Übersichtsseite zu kommen. Kontrolle, ob die Übersichtsseite geöffnet wurde. 3. Drücken des Verweises „anlegen“, damit ein neuer Kunde angelegt werden kann; Kontrolle, ob die Seite mit dem Titel „Neuer Kunde anlegen“ geöffnet wurde. 4. Anlegen eines neuen Kunden mit dem Vornamen „Tekla“, Nachnamen „Kiss“ und Bemerkung „Testkunde“. Kontrolle ob die Daten an die Datenverarbeitungsseite mit dem Titel „Neuer Kunde Daten“ weitergeleitet wurden. 5. Zurück zur Übersichtsseite mit dem Verweis „Zurück zur Übersicht!“. <?xml version="1.0"?> <!DOCTYPE test PUBLIC "-//WebTest//DTD Test 1.0//EN" "Test.dtd"> <test id="0" name="test1" url="regressionstest/index.html"> <step id="0"> <input> <form/> <inputText name="Login" value="test"/> <inputPassword name="Passwort" value="test"/> <inputSubmit value="Absenden"/> </input> <output> <message>Login erfolgreich!</message> <a>Weiter!</a> </output> </step> <step id="1"> <input> <a>Weiter!</a> </input> <output> - 64 - Kapitel 7 : Umsetzung Testausführer <message>Übersicht</message> </output> </step> <step id="2"> <input> <a>anlegen</a> </input> <output> <message>Neuer Kunde anlegen</message> </output> </step> <step id="3"> <input> <form/> <inputText name="Vorname" value="Kiss"/> <inputText name="Zuname" value="Tekla"/> <textarea name="Text">Testkunde</textarea> <inputSubmit value="Absenden"/> </input> <output> <message>Neuer Kunde Daten</message> </output> </step> <step id="4"> <input> <a>Zurück zur Übersicht!</a> </input> <output> </output> </step> </test> 7.4 Moduldatei 7.4.1 Definition Eine Moduldatei definiert einen Ausschnitt aus einem Testablauf, wo einige der Werte nicht fest, sondern variabel angegeben werden. Dies ermöglicht es, denselben Ablauf in mehrere Testdateien einzubinden, also eine Auslagerung von häufig benutzten Sequenzen. Die Wertvergabe an den Variablen in dem Modul erfolgt beim Einbinden in der entsprechenden Testdatei. 7.4.2 Ausführung Die Ausführung folgt dem Schema: 1. Beim Auffinden eines <moduleentry> Tags in einer Testdatei, wird die Moduldatei unter dem im Attribut „path“ angegebenen Pfad gegen ihre DTD validiert. - 65 - Kapitel 7 : Umsetzung Testausführer 2. Nach anschließendem Validieren wird die Moduldatei geparst und auf die Objektstruktur abgebildet. 3. Wenn die Moduldatei erfolgreich eingelesen wurde, werden die <variable> Tags des <moduleentry> Tags (Variablen der Moduldatei) eingelesen und an einer zentralen Stelle hinterlegt. 4. Nun wird die Moduldatei Schritt <step> für Schritt ausgeführt, wie eine normale Testdatei. Beim Benutzen der Werte wird immer erst nachgeschaut, ob es sich um eine Variable handelt. Falls es eine ist, wird der entsprechender Wert gesetzt. 7.4.3 Fehlerbehandlung Die Moduldateien haben kein eigenes Fehlerbehandlungsprinzip. Wenn bei der Ausführung des Moduls etwas schiefläuft, wird dieser Fehler an den Test, der das Modul aufgerufen hat, zurückgeliefert. Die weitere Vorgehensweise gleicht der, als ob dieser Fehler direkt während der Ausführung der Testdatei vorgekommen wäre. 7.4.4 Beispiel In dem Beispiel wird ein Formular mit Vor- und Nachnamen ausgeführt. Dann wird es mit dem Abschickknopf mit dem id submit verschickt. Anschließend wird in der nächsten Seite kontrolliert, ob die Daten richtig übernommen wurden. <?xml version="1.0"?> <!DOCTYPE module PUBLIC "-//WebTest//DTD Module 1.0//EN" "Module.dtd"> <module> <step id="1"> <input> <form/> <inputText name="Vorname" value="$vorname"/> <inputText name="Zuname" value="$zuname"/> <inputSubmit id="submit"/> </input> <output> <message>$vorname</message> <message>$zuname</message> </output> </step> </module> 7.5 Schnittstellen Es gibt in der Anwendung momentan drei Schnittstellen, die das Einfügen eigener Programmcodes bzw. Konfigurationen in das Programm erlauben. 7.5.1 Assert Diese Schnittstelle erlaubt es, eigene Kontrollmethoden für das Abgleichen zwischen SOLLElement (Element definiert in einer XML Datei) und IST- Element (Element aus der HTML Datei) - 66 - Kapitel 7 : Umsetzung Testausführer zu implementieren. Mit Hilfe der Schnittstelle können von den Elementen beliebige Attribute und der Wert ausgelesen und bearbeitet werden. Es wäre also beispielweise möglich, die Adresse eines Verweises zu überprüfen. Um so eine Methode selbst zu schreiben, muss man die AssertInterface.java implementieren. Das vordefinierte Abgleichen ist das Abgleichen auf Gleichheit von Elementwerten. Falls es sich um ein HTML Element handelt das keinen Wert besitzt, wird im Normalfall keine Kontrolle ausgeführt. 7.5.1.1 Technische Beschreibung Name der Schnittstelle: public interface AssertInterface Methode(n): public void controlHtmlElement(AssertObject currentObject, A AssertObject expectedObject, Hashtable args) throws Exception; Die Methode hat drei Argumente: • currentObject: hier wird das IST Objekt aus der HTML Seite an die Methode übergeben. • expectedObject: dieses ist das SOLL Objekt, das in der XML Datei definiert wurde. • args: sind weitere Argumente, die beim Abgleichen übergeben werden können. Diese können auch in der XML Datei gesetzt werden in Form von <argument> Tags. Die Klasse AssertObject gehört zur Assertschnittstelle und dient der Vereinfachung des Abfragens der Elementwerte und Attributwerte. Name der Klasse: public class AssertObject Methode(n): public String getAttributeValue(String attributeName); Die Methode getAttributeValue() sorgt dafür, dass der Wert von einem beliebigen Attribut abgefragt werden kann. Falls das Attribut nicht existiert, wird eine leere Zeichenkette zurückgeliefert. Beispiel: <a href=“www.irgendwo.com“></a> public String getText(); Die Methode getText() ermöglicht es, den Wert eines Elements abzufragen. Der Wert ist der Text zwischen den schließenden und öffnenden Klammern des selben Elements. Beispiel: <a>Link</a> public Vector getOptions(); Die Methode gibt alle Optionen zum Elementtyp namens <select> zurück. Die Optionen werden in einem Vektor gesammelt. Ihre Werte können dann völlig normal über die zwei vorher vorgestellten - 67 - Kapitel 7 : Umsetzung Testausführer Methoden abgefragt werden. 7.5.1.2 Beispiel In dem Beispiel wird überprüft, ob es sich um eine gültige deutsche Postleitzahl handelt. Die Zahl wurde dabei in einem Textfeld namens plz angegeben. Die Postleitzahl wird hierbei als gültig definiert, falls: 1. Sie fünfstellig ist. 2. Sie nur die Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 enthält. Ausschnitt aus der XML Definition: <assert classname="parser.allocator.assert.AssertIstGueltigPLZ"> <argument name=“land“>DE</argument> <inputText name=“plz“/> </assert> Die implementierende Klasse: package parser.allocator.assert; import java.util.Hashtable; import junit.framework.TestCase; public class AssertIstGueltigPLZ implements AssertInterface { public void controlHtmlElement(AssertObject currentObject, AssertObject expectedObject, Hashtable args) throws Exception { String currentPLZ= currentObject.getAttributeValue("value"); String land = (String)args.get("land"); if(land.equalsIgnoreCase("DE")){ pruefeDeutschePLZ(currentPLZ); } } private void pruefeDeutschePLZ(String currentPLZ) { String plzZeichen = "0123456789"; // PLZ ist fünfstellig if(currentPLZ.length()!=5){ TestCase.fail("PLZ muss fuenfstellig sein."); } // PLZ erhält nur die Ziffern 0,1,2,3,4,5,6,7,8,9 for(int i=0; i<currentPLZ.length(); i++){ String aktuellerZiffer = currentPLZ.substring(i,i+1); int index = plzZeichen.indexOf(aktuellerZiffer); - 68 - Kapitel 7 : Umsetzung Testausführer if(index<0){ TestCase.fail("PLZ darf nur Zahlen erhalten."); } } } } 7.5.2 Massentest Die Schnittstelle Massentest erlaubt es, eigene Eingabequellen mit eigenen Formaten für die Ausführung von Massendaten zu haben. Diese Eingabequelle kann eine beliebige Datei beispielweise XML, HTML, TEXT usw. sein, aber auch Datenbanken, Tabellen oder ein Zufallsgenerator etc. Es wäre also möglich, die Daten für die Massentests direkt aus der Spezifikation bzw. aus der Datenbank zu lesen. Nötig dafür ist lediglich das Implementieren der Schnittstelle RepeatInterface, das diese Eingabequelle für den internen Ablauf datensatzweise weitergibt. 7.5.2.1 Technische Beschreibung Name der Schnittstelle: public interface RepeatInterface Methode(n): public void setUp(Hashtable args) throws Exception; Die Methode setUp() ist eine allgemeine Methode, die es ermöglicht ein Initalisieren durchzuführen, ehe der erste Datensatz gelesen wird. Beispielsweise kann man hier die Verbindung zur Datenbank herstellen oder die Datei öffnen, aus der die Daten gelesen werden sollen. public boolean hasNext() throws Exception; Die Methode hasNext() zeigt an, ob noch weitere Datensätze zum Lesen und Weiterreichen für den Testausführer da sind. Sie dient also zur Steuerung des Lese- und Weiterreichungsvorgangs. Falls true, wird der nächste Datensatz mit der Methode next() gelesen und weitergereicht. Falls false, wird das Massentest beendet, und die Methode tearDown() aufgerufen. public Hashtable next() throws Exception; Die Methode next() ist verantwortlich für das Lesen und die entspechende Konvertierung des nächsten Datensatzes. public void tearDown() throws Exception; Die Methode tearDown() ist das Gegenstück zur setUp() Methode. Diese wird ausgeführt nachdem alle Datensätze gelesen und weitergereicht wurden. Eine mögliche Anwendung der Methode wäre zum Beispiel das Schließen der Datenbankverbindung bzw. der Datei. - 69 - Kapitel 7 : Umsetzung Testausführer 7.5.2.2 Beispiel In diesem Beispiel werden die Massendaten in einer Textdatei gehalten. Der Pfad zu dieser Datei wird als Argument mit den Namen filename übergeben. Das Format der Datei muss folgende Konventionen haben: $Variablenname0=Variablenwert0; $Variablenname1=Variablenwert1; usw. • Die Textdatei: $vorname=Tekla; $zuname=Kiss; $text=Wie geht es denn so ????? $vorname=Alexander; $zuname=Grahl; $text=Danke, danke, ... • Ausschnitt aus der XML Definition: <repeat classname="parser.allocator.masstest.MyRepeat"> <argument name="filename">C:/tekla/test/MyFile.txt</argument> <step id="1"> <input> <form/> <inputText name="vorname" value="$vorname"/> <inputText name="zuname" value="$zuname"/> <textarea name="Text">$text</textarea> <inputSubmit id="submit"/> </input> <output> <message>JSP</message> </output> </step> <prepare> <step> <input> <a>Startseite</a> </input> <output> <a>InputResetSubmit</a> </output> </step> <step> <input> <a>InputResetSubmit</a> </input> <output> </output> </step> </prepare> </repeat> • Die implementierende Klasse: - 70 - Kapitel 7 : Umsetzung Testausführer import import import import import java.io.BufferedReader; java.io.File; java.io.FileReader; java.io.IOException; java.util.Hashtable; public class MyRepeat implements RepeatInterface { private String line = "___"; private BufferedReader fin = null; private int i=0; public void setUp(Hashtable args) throws Exception { String filename = (String) args.get("filename"); File file = new File(filename); System.out.println("file: "+file); FileReader reader = new FileReader(file); System.out.println("Reader erstellt!"); fin = new BufferedReader(reader); line = fin.readLine(); } public boolean hasNext() { boolean res = false; if(line!=null){ res = true; } return res; } public Hashtable next() throws IOException{ System.out.println("File String at "+i+" !\n"+line); Hashtable hash = new Hashtable(); createVariables(line,hash); i++; line = fin.readLine(); return hash; } private void createVariables(String line, Hashtable hash) { if(line!=null && !line.trim().equals("")){ if(line.indexOf("$")>=0){ - 71 - Kapitel 7 : Umsetzung Testausführer int indexEqual = line.indexOf("="); String variableName = line.substring(0,indexEqual).trim (); int indexEnd = line.indexOf(";"); if(indexEnd<0){ String variableValue = line.substring (indexEqual+1).trim(); hash.put(variableName,variableValue); createVariables("",hash); } else{ String variableValue = line.substring (indexEqual+1,indexEnd).trim(); hash.put(variableName,variableValue); String recLine = line.substring(indexEnd+1); createVariables(recLine,hash); } } } } public void tearDown() throws IOException { fin.close(); fin = null; } } 7.5.3 Logger Diese Schnittstelle wird nicht mit Java Programmen angesteuert, wie die zwei davor diskutierten. Bei der Software wurde das Loggen mit LOG4J realisiert [Log4j04]. Hier wird die Möglichkeit geboten, eigene Logger für den Testausführer in Form von Java Properties Dateien zu definieren. 7.5.3.1 Technische Beschreibung Eine Beschreibung dafür, wie Logger in so einer Form beschrieben werden können, findet man in [Sin01]. 7.5.3.2 Beispiel Ein Logger, der alles in ein HTML Dokument schreibt unter den Pfad c:/tekla/test/test.html. Ausgegeben werden nur die Logeinträge, die mindestens auf der Stufe INFO stehen. • Der HTML Logger, als .properties Datei log4j.logger.htmlLogger= INFO, htmlLoggerAppender log4j.appender.htmlLoggerAppender=org.apache.log4j.RollingFileAppender log4j.appender.htmlLoggerAppender.layout=org.apache.log4j.HTMLLayout log4j.appender.htmlLoggerAppender.Append=false - 72 - Kapitel 7 : Umsetzung Testausführer log4j.appender.htmlLoggerAppender.File=C:/tekla/test/test.html - 73 - Kapitel 8 : Umsetzung Plugin 8 Umsetzung Plugin In diesem Kapitel wollen wir uns näher mit der Umsetzung des Plugins beschäftigen. Dazu werden wir zuerst einen Überblick über die grobe Gesamtarchitektur des Plugins geben und das Zusammenspiel der einzelnen Komponenten betrachten. Dabei werden wir auch genauer auf den internen Aufbau der einzelnen Plugins eingehen. Kurz werden wir auch auf die Funktion von "Features" und die "Update Site" eingehen, da sie es vereinfachen, Plugins bereitzustellen und zu installieren. 8.1 Architektur Wir wollen nun auf die grobe Architektur des Plugins eingehen. Eine visuelle Übersicht des Aufbaus des Plugins ist in Abbildung 24 zu sehen. Ein wichtiger Aspekt der Architektur des Plugins ist, dass es völlig getrennt vom Testausführer ist. Dies ermöglicht auch ohne das Plugin Tests auszuführen. Eclipse WebTest Feature Help Plugin UI Plugin Editor Plugin Core Plugin Testausführer Abbildung 24 Architektur WebTest Plugin Der Testausführer bietet hierfür eine Schnittstelle die auch vom Plugin genutzt wird. Somit könnte der Testausführer auch in anderen Umgebungen genutzt werden. Das Plugin an sich kann nur in der Eclipse Umgebung ausgeführt werden. Es wurde hierzu in einem - 74 - Kapitel 8 : Umsetzung Plugin sogenannten Feature zusammengefasst. Dieses bündelt die einzelnen Plugin-Teile und lässt sie nach außen als ein Plugin erscheinen. Eine genauere Erklärung wird im folgenden Abschnitt gegeben. Das Plugin an sich wurde zwecks besserer Übersicht und Wartbarkeit in vier Pluginteile gegliedert. Die einzelnen Teile stehen dabei in einer gewissen Abhängigkeit, wie Abbildung 24 zeigen soll. Das Core Plugin stellt gewisse Grundfunktionalitäten zur Verfügung, die von den darüberliegenden Plugins, dem UI Plugin und dem Editor Plugin, genutzt werden. Das UI Plugin realisiert allgemeine Oberflächenelemente und Funktionen. Dazu gehören z.B. Navigatorenansichten oder Menüeinträge zum Ausfühen der Tests. Das Editor Plugin beinhaltet alles, was zur Oberfläche und Funktionalität der Editoren gebraucht wird. Das sind die Editoren an sich, aber auch z.B. Seiten zum Konfigurieren der Editoren oder zum Darstellen der Eigenschaften von selektierten Elementen in den Editoren. Das Help Plugin beinhaltet alle Hilfe-Dateien und stellt diese dem UI Plugin und dem Editor Plugin zur Verfügung. Diese Plugins verweisen dann über die Kontexthilfe auf die entsprechenden Kapitel, welche dann im Helpbrowser von Eclipse geöffnet werden. Da alle Hilfedateien an einem Ort gebündelt liegen, ist ein einfaches Bearbeiten und Pflegen dieser möglich. Zusätzlich wird dadurch auch die Übersetzung der Hilfedateien in mehrere Sprachen und das Bereitstellen von Mehrsprachlichkeit in der Anwendung erleichtert. 8.2 Plugin Struktur Nachdem wir nun einen groben Überblick über die Struktur des Plugins haben, wollen wir im folgenden Abschnitt näher auf die einzelnen Plugin-Teile eingehen. Dabei werden wir am Ende des Abschnittes auch kurz den Installationsprozess des Plugins in Eclipse über eine Update Site betrachten. Die Trennung der Plugin-Teile wurde durch ihre Funktion bestimmt. Dadurch soll eine bessere Übersicht im Code erreicht und die Wartbarkeit bzw. Programmierung vereinfacht werden. Zusätzlich wird es ermöglicht, auch im Funktionsumfang eingeschränkte Versionen des Plugins bereitzustellen. Dies könnte z.B. eine Version sein, die nur das Ausführen und Auswerten der Tests über Eclipse zuläßt. Des Weiteren können so leicht zusätzliche Funktionen in eigenständigen Plugins hinzugefügt werden. Ein zusätzliches Plugin könnte z.B. die Testgenerierung an der vorhandenen Webanwendung realisieren. Die nachträgliche Installation solch eines Plugins ist durch die Eclipse Umgebung leicht möglich. 8.2.1 Feature Bevor wir auf die einzelnen Plugin-Teile eingehen, wollen wir kurz die Funktion und den Aufbau des Features erläutern. Der Feature-Mechanismus in Eclipse soll dabei primär drei Funktionen erfüllen. 1. Neue Funktionalität in Eclipse installieren 2. Das Aktualisieren von bereits vorhandenen Plugins 3. Kontrollieren, welche Plugins beim Start von Eclipse vorhanden sind Es wäre zwar möglich die Plugins dem Anwender als ZIP-Archive bereitzustellen, welche er in das Plugin-Verzeichnis von Eclipse entpacken müsste; durch den Feature Mechanismus kann aber eine kontrolliertere Installation erfolgen. Der Update-Manager in Eclipse verwendet Feature Beschreibungen z.B. um festzustellen, dass alle benötigten Plugins vorhanden sind. Nur wenn die definierten Vorbedingungen erfüllt sind, lässt er eine Installation zu. Auch das nachträgliche - 75 - Kapitel 8 : Umsetzung Plugin Installieren von zusätzlichen Plugins bzw. von Aktualisierungen wird durch Features und den Update Manager vereinfacht; gerade dadurch können Fehlerkorrekturen schnell und effektiv verteilt werden. Bei uns wird das Feature momentan nur zum Bündeln der Plugins und zum vereinfachten Installieren in Eclipse verwendet (s.a. Abbildung 25). Dabei stellt es sicher, dass bei der Installation alle benötigten Plugins der Eclipse Plattform vorhanden sind. Nur dann wird eine Installation unserer Anwendung zugelassen. Bei der Installation werden alle Plugin-Teile unserer Anwendung Bisher Feature Nächste Version Feature (primär) Core UI Editor Help Core UI Help Feature (optional) Editor Help Feature (optional) Online Help Abbildung 25 Verwendung von Features heruntergeladen und automatisch im Plugin-Verzeichnis von Eclipse intalliert. Bei späteren Versionen unserer Anwendung kann über eine feinere Gliederung des Features nachgedacht werden. So könnte man bestimmte Teile in Unter-Features gruppieren und dann optional installierbar machen. Dies würde es dem Anwender ermöglichen, nur die Teile installieren zu lassen, die er momentan für seine Arbeit benötigt. Damit könnte einem Überladen der Anwendung mit Funktionalität, wie man sie von anderen Softwareprodukten her kennt, entgegengewirkt werden. Die Übersicht in Abbildung 25 soll hierbei als Beispiel für eine mögliche Aufteilung dienen. 8.2.2 Kern Das Kern Plugin stellt Grundfunktionalität zum Verarbeiten von XML zur Verfügung. Er bietet eine an die Bedürfnisse unserer Anwendung angepasste, vereinfachte Schnittstelle an, die es den anderen Plugin-Teilen ermöglicht, schnell und effektiv auf XML zu arbeiten. Zusätzlich beinhaltet es zur Zeit alle Bibliotheken, die von den anderen Plugins benötigt werden. Im Folgenden werden wir nun näher die angebotene Funktionalität betrachten und die verwendeten Bibliotheken auflisten. 8.2.2.1 Modell Das Modell stellt Klassen zur internen Verarbeitung zur Verfügung. Die Elemente der XML Dateien werden dabei auf diese Klassen abgebildet. Die daraus erzeugte Struktur ermöglicht ein schnelles und - 76 - Kapitel 8 : Umsetzung Plugin einfaches Navigieren auf den Elementen. Die Methoden getElementPath und getElementByPath unterstützen dabei das Auffinden von bestimmten Elementen. Ersteres gibt dabei den Pfad des Elementes vom Wurzelelement zurück, Letzteres ermöglicht es, ein Element durch einen Pfad zu finden. Zusätzlich stellt es Mechanismen bereit, die Änderungen an der Struktur jedem angemeldeten Interessenten meldet. Dabei wird zwecks differenzierter Verarbeitung zwischen vier verschiedenen Ereignissen unterschieden: 1. Attribut-Ereignisse, wenn sich der Wert eines Attributes geändert oder gelöscht wurde. 2. Kind-Ereignisse, wenn ein Kindelement entfernt oder hinzugefügt wurde. 3. Inhalt-Ereignisse, wenn sich der Inhalt eines Elementes ändert. 4. Modell-Ereignisse, wenn sich das Wurzelelement des Modells ändert. Alle Interessenten melden sich dabei nicht direkt beim Element als Zuhörer an, sondern beim Modell. Dieses erhält alle Nachrichten seiner Elemente und leitet sie an die Zuhörer weiter. Werden neue Elemente in die Struktur eingefügt, melden sie sich automatisch am Modell an. Gleiches gilt auch für das Löschen von Elementen; sie werden automatisch am Modell abgemeldet. Dies vereinfacht es den Interessenten auf Änderungen zu reagieren, da sie sich nur am Modell anmelden müssen. Ab da werden ihnen alle Änderungen mitgeteilt. Ein häufiges An- und Abmelden entfällt bei ihnen. Durch die im Ereignis enthaltenen Informationen können die Interessenten dann feststellen, ob dieses Ereignis für sie wichtig ist. 8.2.2.2 Parser Der Parser stellt Klassen zum Überführen der XML Struktur in die zuvor genannte Objektstruktur bereit. Dafür wird eine Instanz von Digester verwendet, die über entsprechende Regeln konfiguriert wird. Die Regeln werden dabei dynamisch aus der DTD durch den RulesConfigurator generiert und der Digester Instanz übergeben. Eine genauere Beschreibung des Regelmechanismus von Digester ist unter [Dig04] zu finden. Diese Vorgehensweise hat den Vorteil, dass kein Code angepasst werden muss, sollten sich Änderungen an der DTD ergeben. Dies vereinfacht die Wartbarkeit der Anwendung und erleichtert das spätere Einpflegen von Erweiterungen. 8.2.2.3 XML In diesem Paket werden Klassen bereitgestellt die das einfache Validieren von XML Dateien gegen DTDs ermöglichen. Dabei wird die interne Konfiguration des XML Parsers, die zum Validieren nötig ist, nach außen versteckt. Anwendungen können so einfach und schnell überprüfen lassen, ob der momentane XML Text den DTDs der Anwendung gerecht wird und auf Fehlermeldungen durch das Validieren entsprechend reagieren. Als XML Parser wird hierfür der SAX Parser des Xerces von Apache verwendet, da dieser auch von Digester benötigt wird. Da wir in unserer Anwendung keine parallelen Abläufe haben, was das Verarbeiten von XML Strukturen angeht, brauchen wir nur eine Instanz des Parsers zu erzeugen. Ein Verwalter regelt dabei das Erzeugen und Verteilen der Instanz in der Anwendung. Wird die Instanz nicht mehr gebraucht, wird sie automatisch durch den Verwalter entsorgt. Dies verringert den Speicheraufwand und verbessert die Geschwindigkeit unserer Anwendung. - 77 - Kapitel 8 : Umsetzung Plugin 8.2.2.4 DTD Hier befinden sich die DTDs, welche die Struktur unserer XML Dateien beschreiben. Zusätzlich gibt es Klassen, die das Verarbeiten der DTDs vereinfachen und so die Informationen, die in ihnen enthalten sind, bereitstellen. Diese Informationen werden z.B. vom Parser zum Generieren der Regeln benötigt. Auch die Quellcode-Editoren benötigen diese Informationen zum Bereitstellen der Codevervollständigung und Kontexthilfe. <!-- #host Host address of the server, where your webapplication is running. Has to be set in every collection. Yet the parent value is not accessible. --> <!ELEMENT host EMPTY> <!-- #[email protected] Networkaddress of the server. Example: "http://www.myserver.com" If your server is running on a different port than the default port, attach the port to the address with ":". Example: "http://www.myserver.com:8080". --> <!ATTLIST host address CDATA #REQUIRED> Listing 5 DTD Kommentar Beispiel Die Texte der Kontexthilfe für die einzelnen Elemente und deren Attribute wurden von uns direkt, als besonders gekennzeichnete Kommentare, in die einzelnen DTDs eingepflegt (ähnlich wie JavaDoc Kommentare). Einen Auszug aus einer DTD mit enthaltenen Kommentaren sehen sie in Listing 5. Dadurch wird die Pflege der Kontexthilfe vereinfacht, da bei Änderungen von Elementen diese gleich mit angepasst werden kann. Ein Arbeiten über mehrere Dateien entfällt. Die Kommentare werden vom DTD Parser extrahiert und den entsprechenden Elementen und Attributen zugeordnet. Sie können dann leicht abgefragt und für Hilfen herangezogen werden. Aus diesen Kommentaren könnte die DTD Dokumentation auch direkt erzeugt werden. Die dazu nötigen Programme müssten allerdings noch implementiert werden. 8.2.2.5 Bibliotheken In diesem Abschnitt wollen wir kurz klären, welche fremden Bibliotheken zu welchem Zweck bei unserem Plugin eingesetzt werden. Digester Digester wird benutzt, um die XML Elemente auf entsprechende Klassen abzubilden. Dabei werden folgende Bibliotheken verwendet: Hauptbibliothek org.apache.commons.digester Ermöglicht das einfache Abbilden von XML Elementen und Attributen auf Java Klassen; wird über Regeln konfiguriert. Intern wird eine native SAX Implementation zum Parsen von XML benötigt. Bei uns wird zu diesem Zweck Xerces verwendet. - 78 - Kapitel 8 : Umsetzung Plugin Zusätzliche Bibliotheken org.apache.commons.beanutils Stellt Methoden und Klassen bereit zum vereinfachten Holen und Setzen von Eigenschaftswerten auf Java Klassen die der JavaBean Spezifikation entprechen; sowie zum dynamischen Definieren und Zugreifen von Bean Eigenschaften. org.apache.commons.collection Verschiedene Klassen, die das Java Collection Framework erweitern. org.apache.commons.logging Einheitliche Schnittstelle zum Verwenden von verschiedenen Logging Implementationen. Xerces Xerces wird zum Validieren unserer XML Dokumente gegen die definierten DTDs verwendet. Des Weiteren ist er der interne XML Parser, der vom Digester zum Verarbeiten der XML Dateien benötigt wird. Hauptbibliothek org.apache.xerces Stellt konkrete Implementationen von SAX und DOM Parser zu Verfügung. Diese können über die allgemeinen SAX und DOM Schnittstellen angesprochen werden. Es können aber auch die erweiterten Schnittstellen von Xerces verwendet werden. Das bietet sich vor allem dann an, wenn eine genauere Konfiguration des Parsers nötig ist. DTD Parser Zum Verarbeiteten der DTD Informationen wird ein DTD Parser verwendet. Dieser überführt die Informationen der DTD in eine interne Objektstruktur. Wir verwenden diese Struktur, um unser eigenes Objektmodell der DTD zu erstellen. Von diesem können dann über eine einfache Schnittstelle Informationen über die Elemente und ihre Abhängigkeiten abgefragt werden. Zusätzlich stellt es die Dokumentation der Elemente, die im Abschnitt "DTD" S. 78 eingeführt wurde, zur Verfügung. Hauptbibliothek com.wutka.dtd Erzeugt aus einer DTD eine interne Objektstruktur. Über eine Schnittstelle können Informationen über den Aufbau abgefragt werden. Ein Bearbeiten der internen Objektstruktur ist auch möglich. Die geänderte Struktur kann wieder als DTD ausgeschrieben werden. Log4j Wird vom Plugin momentan nur zum Unterdrücken der Konsolen Logging Einträge von Digester und anderen Bibliotheken genutzt. Dazu wird der Logger einmalig durch eine Properties Datei konfiguriert. Die Datei ist unter com.webtest.core.log4j.properties zu finden. In ihr werden alle Logger deaktiviert. - 79 - Kapitel 8 : Umsetzung Plugin Hauptbibliothek org.apache.log4j Stellt eine Schnittstelle zum einfachen Integrieren von Logging in eine Anwendung zur Verfügung. Die Ausgaben des Loggers können dabei priorisiert und in beliebige Ausgabemedien gelenkt werden. Für zusätzliche Literatur siehe [Log4j04]. 8.2.3 Allgemeine Oberfläche Mit dem UI Plugin (s.a. Abbildung 24 Seite 74) werden alle allgemeinen Oberflächenelemente in Eclipse realisiert, die nichts direkt mit den Editoren zu tun haben. Dazu gehören Dialoge zum Einstellen von Konfigurationen, Menüeinträge zum Starten des Testausführers oder auch angepasste Ansichten zum Navigieren. Eine genauere Übersicht über alle Teile geben wir in den folgenden Abschnitten. Da die einzelnen Elemente unseres Plugins auf Erweiterungspunkte von Eclipse aufbauen, werden wir auch die dazugehörigen Erweiterungspunkte kurz näher erklären. 8.2.3.1 Perspektiven Eine Perspektive ermöglicht das Zusammenfassen mehrer Ansichten im Eclipse Hauptfenster. Dadurch kann der Anwender schnell zwischen z.B. einer Java Perspektive zum Bearbeiten der JavaKlassen und der Debug Perspektive zum Ausführen der Programme hin- und herschalten. Ein Überladen des Sichtbereiches mit Fenstern wird hierdurch vermieden und zusammengehörige Ansichten können so leicht gruppiert werden. Zusätzlich lassen sich auch einzelne Menüs in der Hauptmenüleiste und den Kontextmenüs individuell anpassen. So kann erreicht werden, dass im Menüpunkt "New" z.B. nur Datei- und Projektwizards angeboten werden, die zum momentanen Arbeitsfeld passen. Dem Benutzer ist es jedoch immer erlaubt die Perspektiven nach seinen persönlichen Wünschen anzupassen. Zum Einbringen unserer eigenen Perspektive nutzen wir den Erweiterungspunkt org.eclipse.ui.perspectives. Durch die vom Erweiterungspunkt benötigte Klasse können wir dann das initial Layout unsere Perspektive festlegen. Bei uns ist dies die Klasse com.webtest.ui.perspective.PerspectiveFactory. Sie legt das in Abbildung 26 zu sehende Layout fest. Da wir den Erweiterungspunkt von Eclipse verwendet haben, können nun auch andere Plugins durch den Erweiterungspunkt org.eclipse.ui.perpectiveExtension unsere Perspektive durch Elemente und Menüeintrage erweitern. - 80 - Kapitel 8 : Umsetzung Plugin WebTest Navigator Editor Area Outline Task View / Properties View Abbildung 26 WebTest initial Perspektive Dies wird auch schon vom Plugin selbst genutzt, das noch die folgende Menüeinträge der Perspektive hinzufügt: • Menü "New" New WebTest Project New Folder New File • Menü "Show View" Outline Properties Task WebTest Navigator Andere Plugins können, unter Verwendung des org.eclipse.ui.perspectiveExtension und unserer Id der Perspektive, diese nun auch leicht durch eigene Menüeinträge und Ansichten erweitern. 8.2.3.2 Wizards Wizards sollen den Anwender bei der Neuanlage von Ressourcen unterstützen. Das UI Plugin stellt einen neuen Wizard zur Verfügung, der es ermöglicht, ein neues WebTest Projekt anzulegen. Wir verwenden dabei den Erweiterungspunkt org.eclipse.ui.newWizards von Eclipse. Der Wizard an sich wird durch die Klasse com.webtest.ui.wizard.NewProjectWizard realisiert; sie implementiert die vom Erweiterungspunkt erwartete Schnittstelle. Als zusätzliche Informationen können wir im Erweiterungspunkt festlegen, welcher Kategorie der Wizard zugeordnet sein soll und welche Perspektive nach erfolgreichem Beenden des Wizards geöffnet werden soll. In unserem Fall wäre die Kategorie com.webtest.wizard.new mit - 81 - Kapitel 8 : Umsetzung Plugin Namen "WebTest". Alle anderen Wizards unseres Plugins, die neue Ressourcen erzeugen, sollten sich auch in diese Kategorie einordnen. Als Standardperspektive nach erfolgreichem Beenden des Wizards, geben wir die im vorherigen Abschnitt erklärte Perspektive an. Nach Beenden des Wizards wird ein neues Projekt mit dem vom Anwender festegelegten Namen im Workspace angelegt. Der Wizard fügt diesem noch automatisch eine von uns angegebene Nature (s. Seite 83) hinzu und kennzeichnet dadurch das Projekt als WebTest Projekt. 8.2.3.3 Präferenzen Präferenzen dienen dazu, es dem Anwender zu ermöglichen, das Verhalten oder Aussehen des Werkzeugs durch bestimmte Schalter und Eingaben anzupassen. Im UI Plugin gibt es noch keine Einstellmöglichkeiten, es legt lediglich die Kategorie fest, in der andere Plugin Teile ihre Präferenzseiten abzulegen haben. Abbildung 27 UI Plugin: Präferenzseite Der Erweiterungspunkt der hierzu genutzt wird, ist org.eclipse.ui.preferencePages. Er ermöglicht es Präferenzseiten anzugeben, die dem Anwender im Präferenzdialog angezeigt werden. Wie zuvor erwähnt, implementiert das UI Plugin nur eine leere Präferenzseite mit keiner Funktion. Es legt damit die Kategorie fest, in der die anderen Plugins ihre Seiten abzulegen haben. In Abbildung 27 ist die leere Seite des UI Plugins zu erkennen. Darunter wurde durch einen anderen Pluginteil eine neue Seite eingefügt. Dadurch wird eine Gruppierung der Seiten erreicht, was es dem Anwender erleichtert, die zum Werkzeug gehörenden Einstellungen zu Finden und zu Bearbeiten. 8.2.3.4 Actions Hinter Actions verbergen sich Aktionen, die ausgeführt werden, wenn der Anwender einen entsprechenden Eintrag aus einem Menü wählt. Sie werden nicht direkt in der Oberfläche dargestellt. In der Oberfläche werden zuerst Platzhalterobjekte (Proxyobjekte) für die entsprechenden Actions angezeigt. Erst wenn der Anwender einen Menüeintrag auswählt, wird die konkrete Action geladen - 82 - Kapitel 8 : Umsetzung Plugin Vor Auswahl durch Anwender Action ExtensionPoint ProxyAction Klasse Name Icon ... Nach Auswahl von Anwender ProxyAction Action run() Abbildung 28 Verwendung von Actions und ausgeführt. Durch die Verwendung von Proxyobjekten kann das Laden des Plugins, zu dem die Action gehört, verzögert und das Laufzeitverhalten verbessert werden. Abbildung 28 soll das Verhalten bei Verwendung von Actions verdeutlichen. Die Informationen zum Darstellen der Action werden aus der XML Beschreibung des Plugins entnommen. Dort sind alle wichtigen Informationen aufgeführt, wie z.B. Menüname, Icon, für welche Objekte die Action angezeigt werden soll und die Klasse, die die Action implementiert. Aus diesen Informationen wird beim Aufruf des Menüs die Proxyaction erzeugt. Erst nach Auswahl durch den Anwender wird das konkrete Actionobjekt geladen und somit auch das Plugin, das diese eingefügt hat. Das Proxyobjekt leitet dabei alle Informationen an die Action weiter. Dies betrifft Information, wie z.B. wo wurde die Action aufgerufen oder welche Objekte sind selektiert. Momentan beinhaltet unser Plugin nur eine Action zum Ausführen von Testsammlungen. Implementiert ist sie in der Klasse com.webtest.ui.action.RunCollectionAction. In der run-Methode dieser Klasse wird der Testausführer aufgerufen. Er bekommt dabei als Argumente das momentane Arbeitsverzeichnis als absoluten Pfad übergeben, sowie den relativen Pfad zur Testsammlung von diesem Arbeitsverzeichnis; nach Beendigung des Testlaufes gibt er die gesammelten Fehlermeldungen zurück. Die Action kann über das Kontextmenü jeder Navigatoransicht, die von org.eclipse.ui.views.navigator.ResourceNavigator geerbt hat und den Projektinhalt darstellt, aufgerufen werden. Der Menüpunkt ist jedoch nur sichtbar, wenn genau eine Testsammlung im Navigator durch den Anwender selektiert wurde (s. a. Abbildung 30). 8.2.3.5 Nature Projekten im Workspace von Eclipse wird über Natures ein Verhalten und Funktionen zugeordnet. Durch ein Nature spezifisches Projekticon wird dem Anwender gezeigt, dass eine Nature aktiv ist. Dabei kann ein Projekt mehrere Natures besitzen, allerdings wird nur das Icon der ersten als Projekticon verwendet. - 83 - Kapitel 8 : Umsetzung Plugin Abbildung 29 Verwendung von Natures Bei uns wird eine Nature bisher nur zum Kennzeichnen des Projektes als WebTest Projekt verwendet (s.a. Abbildung 29); zusätzliche Funktion wurde noch nicht implementiert. Das Konzept der Nature wurde aus zwei Gründen verwendet. Erstens sollte ein WebTest Projekt leicht als solches in der Eclipse Oberfläche kenntlich sein, zweitens wird ein späteres Erweitern des Plugins erleichtert. <extension point="org.eclipse.ui.projectNatureImages"> <image icon="icons/webtest_project.gif" natureId="com.webtest.nature.project" id="com.webtest.nature.project.image"> </image> </extension> Listing 6 Erweiterungspunkt Nature Icon Neue Natures werden in Eclipse über den Erweiterungspunkt org.eclipse.core.resources.natures erstellt. Dieser Erweiterungspunkt erfordert das Angeben einer Klasse, die die Nature Schnittstelle implementiert. Bei uns ist dies die Klasse com.webtest.ui.nature.ProjectNature. Sie stellt die geforderte Schnittstelle zur Verfügung, implementiert jedoch noch keinen Code darin. Das Icon wird durch den Erweiterungspunkt org.eclipse.ui.projectNatureImages festgelegt. Als Parameter erhält es die Id unserer Nature Erweiterung sowie das Icon, das verwendet werden soll. Den verwendeten XML-Kode können sie in Listing 6 sehen. 8.2.3.6 Ansichten Ansichten dienen der strukturierten Darstellung von Informationen. Im UI Plugin wurde eine zusätzliche Ansicht zum Navigieren auf den Projektdaten eingeführt. Zu diesem Zweck wird der Erweiterununkt org.eclipse.ui.views verwendet. Bei diesem Erweiterungspunkt muss eine Klasse angegeben werden, die die Schnittstelle org.eclipse.ui.IViewPart implementiert. Dies realisert bei uns die Klasse com.webtest.view.WebTestNavigator. Die Ansicht wurde zwecks späterer Erweiterungen schon eingefügt, beherbergt allerdings noch keine - 84 - Kapitel 8 : Umsetzung Plugin Funktionalität. Das momentane Aussehen der Ansicht ist in Abbildung 30 zu sehen. Abbildung 30 Ansicht WebTest Navigator 8.2.4 Editoren Editoren sollen das einfache Bearbeiten der Testfälle, Sammlungen und Module ermöglichen. Für jede der drei Dateiarten steht ein Editor mit spezifischen bzw. gemeinsamen Funktionen und Ansichten zur Verfügung. - 85 - Kapitel 8 : Umsetzung Plugin Abbildung 31 Editor: Testsammlung Die Editoren sind als Multipage Editoren realisiert, d.h. es gibt mehrere Ansichten und Möglichkeiten, die Daten zu bearbeiten. Die einzelnen Ansichten sind dabei auf Registerkarten verteilt. In Abbildung 31 ist der Editor zum Bearbeiten von Testsammlungen zu sehen. Er besitzt vier Registerkarten Configuration, Collection, Overview und Source. Die Ansichten Overview und Source kommen in jedem Editor vor. Um die Editoren in Eclipse einzufügen wird der Erweiterungspunkt org.eclipse.ui.editors verwendet. Dort muss eine Klasse angegeben werden, die den Editor realisiert und eine, die das Aktivieren und Deaktivieren von editorspezifischen Menüeinträgen regelt. Letzteres ist nötig, da sich alle Editoren eine gemeinsame Menüleiste in Eclipse teilen und dort die Menüeinträge des momentan aktiven Editors angezeigt werden. Da all unsere Editoren die Ansichten Overview und Source besitzen, wurden diese in einer zentralen, abstrakten Klasse realisiert. Von dieser Klasse erben alle konkreten Implementierungen und fügen ihr charakteristisches Verhalten hinzu. Im Falle der Source Ansicht, die sozusagen ein Editor im Editor darstellt, sind das DTD Daten für Codevervollständigung bzw. Kontrolle und Hilfeverweise. 8.2.4.1 Quellcode Editor Der Quellkode Editor befindet sich in jedem unserer Editoren in der letzten Registerkarte rechts. Er ermöglicht es, die Daten im XML Format direkt zu editieren, bietet aber dennoch dem Anwender - 86 - Kapitel 8 : Umsetzung Plugin Abbildung 32 Editor: Testsammlung Quellkode durch Kodevervollständigung, Syntaxhilfe und Syntaxhighlighting mehr als ein reiner Texteditor. In Abbildung 32 sehen sie den Quellkode Editor der Testsammlung. Vor allem die Codevervollständigung ist sehr hilfreich, da sie neben den zulässigen bzw. möglichen Elementen, zu jedem Element einen kurzen Hilfetext anzeigt. Dies erspart es dem Anwender, bei jedem Element in der Referenz nachzulesen, welche Aufgabe es hat. Ein Beispiel für die Verwendung der Codevervollständigung sehen sie in Abbildung 33. Im linken, gelben Fenster sind alle möglichen Elemente aufgezählt, die im Element output erlaubt sind. Im rechten wird zu dem momentan ausgewählten Element message ein kurzer Hilfetext angezeigt. Um die Codevervollständigung und Hilfetexte leicht warten bzw. erweitern zu können, werden diese dynamisch aus der DTD Beschreibung generiert. Es müssen also keine Änderungen am Kode gemacht werden, um z.B. neue Elemente oder Attribute einzuführen. Die angezeigten Hilfetexte werden direkt in der DTD als Kommentare definiert (s.a. DTD Seite 78). - 87 - Kapitel 8 : Umsetzung Plugin Abbildung 33 Editor: Kodevervollständigung Die Quellcode Editoren der verschiedenen XML Dateitypen müssen nur noch konfigurieren, welche DTD sie zum Validieren verwenden. Ansonsten ist das Verhalten bei allen Quellcode Editoren gleich. Die abstrakte Klasse com.webtest.editor.source.SourceEditor implementiert alle Logik, die für die Verwendung von Codevervollständigung, Syntaxhighlighting und Hilfe notwendig ist. Dadurch wird die Wartung und Implementierung vereinfacht und das Erstellen von neuen Editoren, die auf anderen DTDs basieren, beschleunigt. 8.2.4.2 Übersicht Abbildung 34 Editor: Übersichtsregisterkarte Die Übersicht ist immer die vorletzte Registerkarte von rechts. Sie stellt den XML Inhalt der Datei in einer Baumstruktur dar. Die Editoren können die Darstellung der einzelnen Einträge durch einen eigenen sogenannten Labelprovider konfigurieren. In Abbildung 34 sehen wir die Übersichtsseite des Editors für Testsammlungen. Um eine differenziertere Darstellung zu ermöglichen, wurde hier statt des Standardlabelproviders com.webtest.editor.multipage.DefaultModelLabelProvider eine erweiterte Version dieses Providers verwendet. Über diesen werden für entsprechende Elemente andere Icons angezeigt oder der Beschriftungstext angepasst. Durch diesen Aufbau wird eine Grunddarstellung der - 88 - Kapitel 8 : Umsetzung Plugin Elemente gewährleistet, die aber durch Verwendung einer definierten Schnittstelle durch die Editoren an ihre Bedürfnisse angepasst werden kann. Bei dem Editor für Testsammlungen geschieht dies durch die Klasse com.webtest.editor.collection.CollectionModelLabelProvider. Zusätzlich zum Anzeigen der Elemente können diese in der Übersicht auch bearbeitet werden. Dazu muss der Anwender ein Element durch Doppelklick auswählen. Es werden dann Informationen und bearbeitbare Attribute und Inhalte des Elements in der Eigenschaftsanzeige dargestellt. Für eine ausführlichere Erklärung siehe Abschnitt Eigenschaftenansicht auf Seite 89. 8.2.4.3 Zusätzliche Möchten Editoren zusätzliche Seiten anbieten, so müssen sie diese erzeugen und als neue Registerkarten einfügen. Im Falle des Editors für Testsammlungen wurden zwei neue Registerkarten eingefügt. Damit ein einheitliches Aussehen und Verhalten der Seiten erreicht wird, wurde die Klasse com.webtest.editor.multipage.EditorPage implementiert. Sie legt ein Grundverhalten fest und gibt vor, welche Methoden von den Editoren zum Erstellen der Seite überschrieben bzw. Implementiert werden müssen. Für eine bessere Übersicht wurde in den Seiten noch die Sektion eingefügt. Eine Sektion gruppiert auf einer Seite nochmals zusammengehörige Elemente. Ein Beispiel hierfür sehen sie in Abbildung 31 auf Seite 86. Dort sind vier Sektionen zu erkennen Host, Library, Logger und HtmlTrace. Diese Aufteilung dient nicht nur der besseren Übersicht des Anwenders, sondern spiegelt sich auch in dem darunter liegenden Code wieder. Für jede angezeigte Sektion wird eine neue Klasse implementiert, die ihr Verhalten enthält. Auch hier wurde wegen des gemeinsamen Grundverhaltens und einheitlichen Aussehens eine abstrakte Klasse implementiert, von der alle Sektionen erben müssen. Durch den oben beschriebenen Aufbau können so leicht Änderungen am Layout vorgenommen werden, ohne viel Code anpassen zu müssen, da sich zentrale Elemente des Lauyouts in wenigen Klassen befinden. 8.2.4.4 Eigenschaftenansicht Abbildung 35 Eigenschaftsanzeige Die Eigenschaftsansicht ermöglicht es dem Anwender, Informationen über das ausgewählte Element zu erlangen. Zusätzlich werden alle Attribute des Elementes mit ihrem Inhalt angezeigt, und können vom Anwender geändert werden. In Abbildung 35 sehen wir die Eigenschaftsanzeige nach Auswahl - 89 - Kapitel 8 : Umsetzung Plugin des htmltrace Elementes durch Doppelklick in der Übersicht. Abbildung 36 Eigenschaftsanzeige: Listenfeld Für die Anzeige der Daten in der Kategorie Info werden wieder dynamisch die Daten der DTD herangezogen. Gleiches gilt auch für die Anzeige der Attribute in der Kategorie Attributes. Es werden immer alle möglichen Attribute des Elementes angezeigt, auch die optionalen. Sollte das Element auch einen Inhalt zwischen den Tags enthalten, so wird dieser in der Kategorie Content mit der Eigenschaft Text angezeigt. Der Anwender kann die Werte der Attribute in der Spalte Value bearbeiten. Für Attribute die nur vordefinierte Werte annehmen können, wird ein Listenfeld angeboten. Die Werte dieses Listenfeldes werden auch aus der DTD generiert. Abbildung 36 zeigt hierfür ein Beispiel. Damit wird erreicht, dass die Anzeige der Elemente in der Eigenschaftsansicht leicht zu erweitern ist, ohne dafür neuen Code implementieren zu müssen. Wie beim Quellkode Editor müssen die Änderungen nur an der DTD vorgenommen werden. 8.2.4.5 Präferenzen Über den Erweiterungspunkt org.eclipse.ui.preferencePages können neue Eigenschaftsseiten zum Konfigurieren in den Eigenschaftsdialog von Eclipse eingefügt werden. Der Anwender kann über diese bestimmtes Verhalten des Plugins an seine Bedürfnisse anpassen. Wie im Abschnitt Präferenzen auf Seite 82 erklärt und in Abbildung 27 auf Seite 82 gezeigt, können die Eigenschaftsseiten eines Plugins gruppiert werden und sind dadurch leichter vom Anwender einem Werkzeug zuordbar. Im Editor Plugin wird eine Eigenschaftsseite zum Konfigurieren des Syntaxhightlighting im Quellcode Editor angeboten. Über diese kann der Anwender die Farben für die Codemarkierung seinen Bedürfnissen anpassen. Als Kategorie wurde in der XML Definition des Erweiterungspunktes die Eigenschaftsseite des UI Plugins angegeben. Die Seite erscheint hierdurch als Kindelement unter der vom UI Plugin angegebenen Primärseite (s.a. Abbildung 27 auf Seite 82). Der Code der Seite für die Anzeige wurde in der Klasse com.webtest.editor.preference.SyntaxPreferencePage implementiert. Da die Seite nur ein einfaches Verhalten aufweisen muss, erbt sie von einer von Eclipse bereitgestellten abstrakten Klasse (org.eclipse.jface.preference.FieldEditorPreferencePage) für das Darstellen von Eigenschaftsdialogen. Mit Hilfe dieser Klasse ist es schnell und einfach möglich, Eigenschaftsseiten anzubieten und die Werte zu lesen und zu speichern. 8.2.4.6 Wizards Das Editor Plugin stellt drei Wizards zur Verfügung. Sie ermöglichen das Anlegen von neuen WebTest Dateien mit Hilfe von Templates. Dies stellt sicher, dass die vom Anwender erzeugten - 90 - Kapitel 8 : Umsetzung Plugin Dateien die von uns erwartete Grundstruktur aufweisen und von den Editoren verstanden werden. Da sich das Verhalten der Wizards sehr ähnelt, wurde eine abstrakte Klasse com.webtest.editor.wizards.NewFileWizard implementiert, die das Grundverhalten enthält. Die anderen Wizards erben von dieser und konfigurieren nur noch ihr Verhalten. Dabei geben sie z.B. an, welche Dateierweiterung, welches Template und welchen Namen sie verwenden. Dieser Aufbau ermöglicht ein leichtes Implementieren von neuen Wizards zum Erzeugen von Dateien und vereinfacht das Warten des schon vorhandenen Codes. Damit der Anwender leicht erkennen kann, zu welchem Plugin die Wizards gehören, wurden sie der vom UI Plugin erstellten Kategorie "WebTest" untergeordnet. 8.2.5 Hilfe Alle Dateien in denen Informationen für Hilfe enthalten sind, wurden in ein eigenes Plugin ausgelagert und sind im Plugin com.webtest.help enthalten. Dadurch soll die Wartbarkeit der Hilfedateien verbessert und das Verfügbarmachen von Mehrsprachigkeit vereinfacht werden. Abbildung 37 WebTest Hilfe Die Hilfe kann durch den in Eclipse enthalten Browser angesehen und durchsucht werden. In Abbildung 37 ist die eingefügte Hilfe des WebTest Werkzeuges im Browser zu sehen. Die erste Kapitelebene wurde zur besseren Übersicht geöffnet. 8.2.5.1 Struktur Die Hilfe ist in zwei Teile geteilt. Zum einen gibt es die Dateien, die im Hilfebrowser angzeigt werden, zum anderen Hilfeblöcke, die für die Kontexthilfe im Werkzeug benötigt werden. In den zwei folgenden Abschnitten werden wir jeweils den Aufbau und ihre Verwendung näher betrachten. HTML Für den Hilfebrowser wird eine sogenannte Buchstruktur benötigt, die im linken Navigationsfenster angezeigt wird (s.a. Abbildung 37). Diese legt den Aufbau der Kaptiel fest und wird in einer XML - 91 - Kapitel 8 : Umsetzung Plugin Datei beschrieben. Aus dieser Struktur heraus wird auf die HTML Seiten verwiesen. Ein Vorteil dieser Methode ist es, dass schon vorhandene Hilfen leicht integriert werden können und die schon vorhandenen HTML Seiten nicht großartig angepasst werden müssen; so ist auch ein nachträgliches Einhängen von Kapiteln in diese Struktur leicht möglich. Andere Plugins müssen dazu nur ihre Hilfe an entsprechender Stelle in die bereits bestehende Kapitelstruktur einfügen. Das Einfügen ist dabei bildlich gemeint, da sie ihre Dateien nicht in die Struktur kopieren, sondern nur per Anker einhängen. Die Dateien an sich können an einer völlig anderen Stelle liegen. Dazu müssen die Anker allerdings von der übergeordneten Hilfe schon vorgesehen sein. <toc label="WebTest" topic="html/book.html"> <topic label="Overview" href="html/overview.html"/> <topic label="User's Guide" href="html/users_guide/users_guide.html"> <link toc="toc_users_guide.xml"/> </topic> <topic label="Reference" href="html/reference/reference.html"> <link toc="toc_reference.xml"/> </topic> <topic label="Example's Guide" href="html/examples/examples_guide.html"> <link toc="toc_examples_guide.xml"/> </topic> <topic label="Questions Index" href="html/questions.html"/> </toc> Listing 7 Hauptbuch mit Kapiteleinträgen Die in unserem Plugin definierte Kapitelstruktur ist in Listing 7 zu sehen. Dabei handelt es sich nur um die Hauptkapitel. Die Unterkapitel sind zwecks besserer Übersicht in die Dateien toc_users_guide.xml, toc_reference.xml und toc_examples_guide.xml ausgelagert. Kontext Abbildung 38 Kontexthilfe im Editor Kontexthilfen sind Hilfen, die kurze Hinweise und Verweise auf Kapitel in der Onlinehilfe geben. Sie werden durch den Anwender bei drücken von F1 aufgerufen. Ein Beispiel für eine Kontexthilfe sehen sie in Abbildung 38. Diese wird angezeigt, wenn der Anwender im Quellcodeeditor unseres Plugins F1 drückt. Was in der Kontexthilfe dargestellt wird, ist nicht direkt in die Elemente programmiert, sondern wird über den Erweiterungspunkt org.eclipse.help.contexts realisiert. Elemente verweisen nur - 92 - Kapitel 8 : Umsetzung Plugin <context id="editor_test"> <description>Help for use of the Test Editor.</description> <topic label="Test Editor" href="html/users_guide/editor/test_editor.html"/> <topic label="DTD - Test" href="html/reference/dtd/dtd_test.html"/> </context> Listing 8 Kontexthilfe: Definition durch eine eindeutige Id auf Hilfen, die in einer XML Datei definiert werden. Für die in Abbildung 38 gezeigte Hilfe würde ein Eintrag in dieser Datei, wie in Listing 8 aussehen. Wie bei der Onlinehilfe hat dies den Vorteil, dass die Hilfen leichter zu warten sind und bei Änderungen der Kapitelstruktur der Quellkode der Anwendung nicht angepasst werden muss. Ein weiterer Vorteil ist, dass die Kontexthilfen nur einmal definiert werden müssen und ab dann an mehreren Stellen verwendet werden können. In unserem Plugin sind alle Kontexthilfen momentan im Plugin Teil com.webtest.help in der Datei contexts.xml definiert. Da diese Datei mit wachsender Komplexität des Plugins immer unübersichtlicher wird, sollte über eine Trennung der Datei in mehrere Teile nachgedacht werden. 8.2.6 Update Site Die Update Site ermöglicht das Bereitstellen des Plugins. Alle Features die zu einem Plugin gehören, können durch eine Update Site bereitgestellt werden. Zum Installieren des Plugins öffnet der Anwender die Update Site im Update Manager. Dabei kann diese auf dem lokalen Rechner liegen (z.B. auf der Festplatte oder CD-ROM) oder auf einem Web Server zur Verfügung stehen. Das Bereitstellen dort kann auch in einem geschützten Verzeichnis erfolgen. Über den Update Manager öffnet der Anwender dann die Site und wählt die zu installierenden Features aus. Es werden automatisch alle Abhängigkeiten und Vorbedingungen geprüft und bei Erfolg das Plugin heruntergeladen und installiert. Nach einer Installation können über die Update Site auch Patches und neuere Versionen des Plugins zur Verfügung gestellt werden. So kann der Anwender in regelmäßigen Abständen überprüfen, ob Neuerungen oder Verbesserungen ausgegeben wurden und diese leicht nachinstallieren. Momentan dient uns die Update Site nur zum Vereinfachen des Installationsprozesses. Dabei wird über die Seite das Feature com.webtest.feature angeboten; in diesem ist das komplette Plugin enthalten. In einer späteren Version des Plugins soll eine differenziertere Installation über die Update Site möglich sein, wie sie in Abbildung 25 auf Seite 76 gezeigt ist. Das Einbinden von zusätzlichen Informationen, z.B. Installationsbeschreibung und Funktionsumfang in die Update Site ist auch vorgesehen. - 93 - Kapitel 9 : Anwendungsbeispiel 9 Anwendungsbeispiel Unsere Aufgabe war es zu zeigen, dass der entwickelte Prototyp bereits einsetzbar ist und die von uns gesetzte Kriterien erfüllt. 9.1 Testumgebung Das Anwendungsbeispiel basiert auf FlexiTRUST von der Firma FlexSecure. Diese ist eine Trustcenter- Software, die mit Unterstützung von Professor Johannes Buchmann (TUD) entwickelt wird. Die Software hat die Aufgabe, Zertifikate und digitale Schlüssel zu erstellen und zu verwalten. Zu einer genaueren Beschreibung der Funktionsweise sei auf [FlexSec04] verwiesen. Es standen sechs Formulare zur Verfügung, deren Funktionsweise getestet werden sollen. Diese waren: • Mandant1001.Produktion.CA • Mandant1001.Produktion.Root • Mandant1001.Produktion.Softtoken • Mandant1001.Produktion.SSLServer • PKCS10.Produktion.CA • PKCS10.Produktion.Root 9.2 Teststruktur Das Root Element ist die Testsammlung „flexsecure.wcx“. In diesem ist eine Testsammlung für jedes zu testende Formular eingebunden. Die Dateien befinden sich jeweils im Ordner gleichen Namens, und heißen folgend: „Mandant1001.Produktion.CA.wcx“, „Mandant1001.Produktion.Root.wcx“, „Mandant1001.Produktion.Softtoken.wcx“, „Mandant1001.Produktion.SSLServer.wcx“, „PKCS10.Produktion.CA.wcx“ und „PKCS10.Produktion.Root.wcx“. Getestet wurde mit der Funktionsabdeckung „black-box“ Testart. Dabei wurden die folgenden Funktionalitäten (Testdateien jeweils enthalten in dem entsprechenden Ordner und eingefügt in der dazugehörigen Testsammlungsdatei) behandelt: • Erfolgreicher Ablauf „testSuccessfulRun.wtx“ • Abfangen von Fehlermeldungen • Doppelte Eingabe desselben CN Wertes „testDoubleCN.wtx“ (nur beim Mandant1001.Produktion.CA und Mandant1001.Produktion.Root) • Nichtausfüllen von Pflichtfeldern „testRequiredFields.wtx“ • Ungültige Eingabeformate „testInvalidInputs.wtx“ Es wurde dabei versucht nach Möglichkeit die Testdateien modular aufzubauen. Dieses kann man an der Vielzahl der Moduldateien (mit der Endung .wcx) erkennen, die sich direkt unter dem Projektordner bzw. in dem einzelnen Formularordner befinden. Ein Beispiel dafür ist das Modul „EntryForm.wcx“, das den Vorgang beschreibt, wie das zu testende Formular erreicht werden soll. - 94 - Kapitel 9 : Anwendungsbeispiel 9.3 Testergebnis Es sind alle definierte Testfälle erfolgreich durchgelaufen. Dabei sind uns einige Mängel an der zu testende Software aufgefallen, auch wenn diese nicht gravierend waren. Da wir leider keine richtige Spezifikation zur Hand hatten, könnte es auch sein, dass einiger dieser Beobachtungen gewollt sind und keine Fehler aufweisen. • Ungültiger Ländercode wurde nicht erkannt. Beispiel: „x“ oder „xy“ • Bei der Meldung „Datum ungültig“ („Date invalid“) wird der Feldinhalt des Datumfeldes gelöscht. Diese Vorgehensweise widerspricht der Fehlerbehandlung anderer Felder, bei denen der Inhalt des Feldes weiterhin (auch bei falschen Eingaben) angezeigt wird. Ein Beispiel dafür ist der CN Feld. • Es wird bei dem „Mandant1001.Produktion.Softtoken“ Formular ein anderes Datumsformat erwartet, als bei allen anderen Formularen. • Fehlermeldung in den „PKCS...“ Formularen für den Feld „Person-ID“ ist nicht gut nachvollziehbar. • • Kein Person-ID und kein Wert für CN Feld => „Eingabe erforderlich“ • Falscher Person-ID und kein Wert für CN Feld => „Zahl erforderlich“ • Kein Person-ID und ein Wert für CN Feld => „Keine gültige ID-Nummer“ + „Nicht überprüft, da Person-ID fehlt oder ungültig“ • Falscher Person-ID und ein Wert für CN Feld => „Keine gültige ID-Nummer“+ „Nicht überprüft, da Person-ID fehlt oder ungültig“ Sprachen Deutsch und Englisch sind gemischt sowohl bei Bezeichnungen, als auch bei den Fehlermeldungen. Beispiel: „This is not a valid IPv4 address“ aber „Eingabe erforderlich“ - 95 - Kapitel 10 : Ausblick 10 Ausblick Bedingt durch den zeitlichen Rahmen der Diplomarbeit konnte nur ein Prototyp erstellt werden. Dieser eignet sich aber schon zum Testen der FlexiTrust Webanwendung, wie im Kapitel 9 auf Seite 94 gezeigt wurde. Die schon implementierten Schnittstellen zum Erweitern von Überprüfungsmethoden, Massentestdaten und Loggern bieten genügend Flexibilität, um auch anspruchsvollere Tests schreiben und durchführen zu können. Dabei werden bisher die Testarten Funktions- und Massentest unterstützt. Je nach Komplexität der enthaltenen Überprüfungsmethoden handelt es sich hierbei um einen „black-box“ oder einen oberflächlichen „white-box“ Test. Der Logmechanismus erlaubt es zudem dem Anwender, beliebige Ziele und Formate für die Logdaten zu verwenden. Hierfür müssen lediglich die von Log4j gestellten Schnittstellen verwendet werden. Standardmäßig stehen Loggerkonfigurationen zum Loggen in HTML-Dateien oder auf die Konsole zur Verfügung. Zusätzlich kann die integrierte HTML Testverfolgung zum Auswerten der Fehlerprotokolle herangezogen werden. Durch das sequentielle Abspeichern der aufgerufenen HTML Seiten kann der Anwender die Reihenfolge der Testabschnitte des durchgeführten Tests leicht nachvollziehen. Die Trennung des Testausführers als eigenständige Komponente ermöglicht es zudem, Tests automatisiert als sogenannte Batchjobs (z.B. als Skript für Ant) durchzuführen. Somit kann ein Zurücksetzen der Anwendung in einen definierten Anfangszustand vor Beginn eines Testablaufes bewerkstelligt werden. Die durch das Plugin bereitgestellte Oberfläche in Eclipse unterstützt den Anwender beim Erstellen und Bearbeiten der Testfälle. Bei der Implementierung dieser Oberfläche wurde auf die Verwendung der Designvorschriften von Eclipse besonders geachtet. Anwendern, die Eclipse schon kennen, sollte deswegen die Verwendung des Werkzeugs leichter fallen. Neue Anwender werden durch diverse Wizards, Ansichten und die Editoren im Erstellen der Testfälle unterstützt. Dabei wurde darauf geachtet, dass in allen Dialogen die in Eclipse integrierte Hilfe genutzt wird, um dem Anwender nützliche Hinweise zu geben oder auf verwandte Themen zu verweisen. Die Editoren sollen es ermöglichen, auch ohne XML Kenntnisse Testfälle zu erstellen. Dafür bieten sie abstraktere Sichtweisen auf die in XML beschriebenen Daten an und verwenden Dialoge zur vereinfachten Informationseingabe. Für Anwender mit guten XML Kenntnissen steht auch ein Quellcodeeditor zur Verfügung. Dieser unterstützt den versierten Anwender mit Syntaxhighlighting, Kontexthilfe und Codevervollständigung. Das offene Pluginkonzept von Eclipse erlaubt es, dem Werkzeug auch nachträglich neue Funktionalität hinzuzufügen bzw. andere Plugins zu integrieren und den Funktionsumfang dadurch zu steigern. Dem Anwender ist es hierdurch möglich eine auf seine Bedürfnisse angepasste Entwicklungsumgebung zu erstellen. Im Folgenden werden wir nun Punkte betrachten, die noch nicht oder nur teils im Prototypen umgesetzt wurden und einer nachträglichen Überarbeitung bedürfen. 1. Die bisher verwendete DTD Definition der Test sollte gegen ein XML Schema ausgetauscht werden. Durch das Schema könnten die in den Tests erlaubten Strukturen und Daten besser - 96 - Kapitel 10 : Ausblick beschrieben werden. Da ein Schema auch nur eine XML Datei ist, könnten die in ihr enthaltenen Informationen leichter für die Anwendung nutzbar gemacht werden. 2. Bei der internen Verarbeitung der XML Daten könnte das Laufzeit- und Speicherverhalten durch Parallelisierung verbessert werden. Dies würde gerade bei einer umfangreichen Testanzahl deren Ausführung beschleunigen. 3. Es sollte eine Möglichkeit zur Definition und Verwendung von globalen Variablen an zentraler Stelle zur Verfügung gestellt werden. Dies reduziert den Wartungsaufwand und die Fehleranfälligkeit bei Änderungen von gemeinsamen Daten. 4. Es werden im Moment nicht alle vorhandene HTML Tags bzw. Attribute unterstützt. Zum Beispiel wird momentan der HTML Tag <iframe> gar nicht unterstützt. Bei Attributen wären da „length“, „maxlength“ zu nennen. Während die Ergänzung mit den Attributen eine sehr einfache Erweiterung ist (nur entsprechende DTD anpassen), wäre es bedeutend mehr Aufwand neue HTML Tags hinzufügen ( Eine neue Klasse implementieren, anpassen der Parserklasse und entsprechende DTD ändern). 5. Um ein breiteres Spektrum von Testarten zu unterstützen und somit eine größere Testabdeckung zu erreichen, sollten Zeittest und Lasttest angeboten werden. Die dazu nötigen Änderungen bzw. Ergänzungen müssen am Testausführer und Plugin durchgeführt werden. 6. Ein entfernteres Ziel wäre Testen mit einer beliebigen Anzahl von Benutzer mit zufällig generierten oder ausgewählten Testabläufen. Dieser würde dann praktisch eine „realistische“ Nutzung der Software simulieren. 7. Es soll ermöglicht werden, dass die fehlgelaufenen Tests extrahiert werden. Diese können dann an den entsprechenden Entwickler als Anleitung für eine Korrektur weitergereicht werden. 8. In den Editoren für den Testablauf und das Modul sollten weitere Ansichten hinzugefügt werden, die ein einfaches Bearbeiten der Daten erlauben. Weiterhin sollte der Quellcodeeditor, was die Codevervollständigung und Markierung von Codeblöcken angeht, verbessert werden. 9. Als zusätzliche Funktionen sollten mehrere Refactoringmethoden implementiert und angeboten werden, wie man sie vom Java Plugin her kennt. Dabei handelt es sich hauptsächlich um das Umbenennen und Verschieben von Dateien und das daraus resultierende Anpassen von Pfadangaben. 10.Für das einfachere Erstellen von Tests, an einer schon vorhandenen Webanwendung, sollte ein Wizard implementiert werden, der es ermöglicht, online Testfälle aufzuzeichnen und abzuspeichern. Der Anwender muss hierbei durch eine geeignete Oberflächenschnittstelle unterstützt werden, die die Daten aufbereitet und in verständlicher Form darstellt. Der daraus entstandene Testablauf muss dann unserer intern verwendeten Struktur entsprechen und könnte so mit den Editoren nachträglich weiterverarbeitet werden. 11.Durch Trennung weiterer Funktionalität in verschiedene Plugins, muss die interne Hilfe überarbeitet und an die neuen Bedürfnisse angepasst werden. Von der Verwendung der bisherigen Struktur ist abzusehen, da dies einen hohen Aufwand in Wartung und Ergänzung bedeuten würde. 12.Falls an eine weitere Verwertung der Ergebnisse gedacht ist, müssen etliche Lizenzfragen geklärt werden. Dies betrifft vor allem die verwendeten Werkzeuge und Bibliotheken. Der im Rahmen dieser Diplomarbeit erstellte Prototyp zeigt die Machbarkeit unserer Studie und - 97 - Kapitel 10 : Ausblick Vorgaben. Allerdings ist er noch weit von einem fertigen Produkt entfernt. Die in ihm enthalten Ansätze und Lösungen können jedoch gut als Grundlage für eine verbesserte Version herangezogen werden. - 98 - Anhang Anhang Inhaltsverzeichnis Bearbeitungsübersicht............................................................................................................................3 Installationsanleitung..............................................................................................................................4 Anwenderhandbuch................................................................................................................................7 XML Syntaxreferenz..............................................................................................................................8 Testsammlungsdatei..........................................................................................................................8 DTD (Collection.dtd)....................................................................................................................8 <testcollection>.............................................................................................................................8 <configuration>.............................................................................................................................9 <host>...........................................................................................................................................9 <loggerentry>................................................................................................................................9 <htmltrace>.................................................................................................................................10 <library>......................................................................................................................................11 <collection>................................................................................................................................12 <collectionentry>........................................................................................................................12 <testentry>..................................................................................................................................13 Testdatei...........................................................................................................................................13 DTD (Test.dtd)............................................................................................................................13 <test>...........................................................................................................................................14 <moduleentry>............................................................................................................................14 <variable>...................................................................................................................................15 <repeat>......................................................................................................................................15 <prepare>....................................................................................................................................16 DTD (Step.dtd)...........................................................................................................................16 <step>..........................................................................................................................................20 <input>........................................................................................................................................20 <output>......................................................................................................................................21 <anyField>..................................................................................................................................22 <a>..............................................................................................................................................23 <button>......................................................................................................................................23 <form>........................................................................................................................................24 <frame>.......................................................................................................................................25 <inputButton>.............................................................................................................................25 <inputCheckbox>........................................................................................................................26 <inputFile>..................................................................................................................................27 <inputImage>..............................................................................................................................27 <inputPassword>.........................................................................................................................28 <inputRadio>..............................................................................................................................29 <inputReset>...............................................................................................................................29 <inputSubmit>............................................................................................................................30 <inputText>................................................................................................................................31 <message>...................................................................................................................................31 <select>.......................................................................................................................................32 -1- Anhang <option>......................................................................................................................................32 <textarea>...................................................................................................................................33 Moduldatei.......................................................................................................................................33 DTD (Module.dtd)......................................................................................................................33 <module>....................................................................................................................................34 -2- Anhang Bearbeitungsübersicht Kapitel Bearbeiter 1 Einleitung T. Kiss, A. Grahl 2 Einführung ins Testen T. Kiss 3 Einführung Software Komponenten A. Grahl 4 Einführung Plugins A. Grahl 5 Planung Testausführer T. Kiss 6 Planung Plugin A. Grahl 7 Umsetzung Testausführer T. Kiss 8 Umsetzung Plugin A. Grahl 10 Ausblick T. Kiss, A. Grahl Anhang T. Kiss, A. Grahl -3- Anhang Installationsanleitung 1. Installieren sie Java in der Version 1.4.x. Für weitere Informationen siehe [Java04]. 2. Installieren sie Eclipse in der Version 2.1.x. Für weitere Informationen siehe [Ecl04]. 3. Starten sie Eclipse und öffnen sie über das Menü „Help -> Software Updates -> Update Manager“ die Update Manager Perspective (s. Abbildung 39 Installation: Update Manager öffnen). Abbildung 39 Installation: Update Manager öffnen 4. 1. Für Installation von einer Webadresse. 1. Öffnen sie in der Ansicht "Feature Updates" mit Rechtsklick das Kontextmenü und wählen. sie "New -> Site Bookmark..." aus. (s. Abbildung 40 Installation: Site Bookmark erstellen) 2. Im Wizard geben Sie für Name "WebTest" und für URL geben sie die Adresse an, wo das Plugin hinterlegt ist. Danach drücken sie „finish“. 2. Für Installation vom lokalen Rechner. 1. Suchen sie das Verzeichnis über „My Computer“ in der Ansicht „Feature Updates“, wo die site.xml des Plugins hinterlegt ist. -4- Anhang Abbildung 40 Installation: Site Bookmark erstellen 5. Öffnen Sie in der Ansicht "Feature Updates" die neu angelegte Bookmark "WebTest" oder das Verzeichnis falls sie vom lokalen Rechner installieren und wählen sie "Other -> com.webtest.feature 1.0.0" aus (s. Abbildung 41 Installation: Feature auswählen). Abbildung 41 Installation: Feature auswählen 6. In der Editoransicht im "Preview" setzen sie bitte bei "Install by adding to the Selected Updates." ein Häckchen und drücken dann "Install now" (s. Abbildung 42 Installation: Feature Dialog). 7. Im Wizard drücken Sie "Next", akzeptieren die Lizensbedingungen und drücken im dritten Dialog "finish". -5- Anhang Abbildung 42 Installation: Feature Dialog 8. Eclipse wird nach der Installation neu gestartet, danach steht Ihnen die Funktionalität des Plugins zur Verfügung. -6- Anhang Anwenderhandbuch Hilfe für die Verwendung des Plugins finden sie in der Onlinehilfe von Eclipse. Die Hilfe können sie über das Menü „Help -> Help Contents“ öffnen. Es öffnet sich der Hilfebrowser von Eclipse. Die Hilfe zum Plugin ist dort unter der Kategorie „Webtest“ zu finden. In den Editoren, Ansichten oder Dialogen des Plugins können sie auch über drücken von F1 direkt Hilfe erhalten. Es erscheint dann eine Kontexthilfe mit kurzer Hilfestellung und Verweisen auf entsprechende Themen in der Onlinehilfe. -7- Anhang XML Syntaxreferenz Testsammlungsdatei DTD (Collection.dtd) <!ENTITY % config_element "host,loggerentry,htmltrace,library*"> <!ENTITY % entry_element "collectionentry|testentry"> <!ELEMENT testcollection (configuration,collection)> <!ELEMENT configuration (%config_element;)> <!ELEMENT host EMPTY> <!ATTLIST host address CDATA #REQUIRED> <!ELEMENT loggerentry EMPTY> <!ATTLIST loggerentry path CDATA #IMPLIED enabled (on|off) "off"> <!ELEMENT htmltrace EMPTY> <!ATTLIST htmltrace path CDATA #REQUIRED enabled (on|off) "off"> <!ELEMENT library EMPTY> <!ATTLIST library path CDATA #REQUIRED> <!ELEMENT collection (%entry_element;)*> <!ELEMENT collectionentry EMPTY> <!ATTLIST collectionentry path CDATA #REQUIRED> <!ELEMENT testentry EMPTY> <!ATTLIST testentry path CDATA #REQUIRED> <testcollection> Der Tag <testcollection> ist das Root Element dieser XML Datei. • Attribute keine • Inhalt -8- Anhang (configuration,collection) Es muss als Inhalt genau einmal der Tag <configuration> und dann genau einmal der Tag <collection> folgen. • Eltern keine <configuration> Der Tag <configuration> legt die Konfiguration für die Testsammlung fest. Diese Konfiguration wird direkt nach dem erfolgreichen Einlesen der Datei gesetzt und ist so lange gültig, bis eine neue Testsammlungdatei aufgerufen wird. • Attribute keine • Inhalt (host, loggerentry, htmltrace, library*) Die Tags müssen in der oben aufgezählter Reihenfolge erfolgen. Genau einmal <host>, genau einmal <loggerentry>, genau einmal <htmltrace> und beliebig oft der Tag <library>. • Eltern <testcollection> <host> Der Tag <host> definiert die Hostadresse, an der die Anwendung zu finden ist. Zu bemerken ist dabei, dass es sich NICHT um die vollständige Startadresse des Testablaufs handelt. Diese setzt sich nämlich aus der Hostadresse plus URL zusammen. Die URL wird in dem einzelnen Testdateien definiert. • Attribute Name address • Beschreibung Wert Die Hostadresse. Beliebige Zeichenkette Pflicht Ja Inhalt leer • Eltern <configuration> <loggerentry> Der Tag <loggerentry> definiert, ob der Testablauf mitgeloggt werden soll und falls ja, welche Properties-Datei zum Loggen benutzt werden soll. Die Log- Datei muss das Properties Dateiformat haben und in Log4J Format definiert sein. Für weitere Informationen siehe Kapitel „Logger“. -9- Anhang • Attribute Name Beschreibung Wert Pflicht path Gibt an, von wo aus Beliebige die Properties Zeichenkette Logger Datei geladen werden soll. Dieskann ein absoluter Pfad sein oder relativ vom Arbeitsverzeichnis aus. Nein enabled Er zeigt an, ob der Logger ein- oder ausgeschaltet ist. Nein; Standard ist „off“ • „on“ oder „off“ Inhalt leer • Eltern <configuration> <htmltrace> Der Tag <htmltrace> gibt an, ob eine Testverfolgung im HTML Dateiformat erfolgen soll oder nicht. Falls ja, so wird auch hier der Pfad zu einem Ordner angegeben, in den die Dateien geschrieben werden sollen. Dieser Pfad wird automatisch angelegt, falls er nicht existiert. <htmltrace> ermöglicht nach der Testausführung die HTML Dateien in der Aufrufreihenfolge anzuschauen. Dabei wird jede Seite angezeigt: • • im Aufrufzustand (Hier ist es möglich die Seite mit ihren vordefinierten Defaultwerten zu sehen.) im ausgefüllten Zustand vor dem Abschicken (Falls eine Änderung in der Seite vorgefallen ist) Dabei wird für jede Testsammlungsdatei unterhalb des angegeben Pfades ein neuer Ordner namens Testsammlungdatei erzeugt. Innerhalb dieses Ordners werden erst wieder Ordner mit Namen test_Nummer angelegt. Jeder dieser Ordner entspricht einer Testdatei in der Testsammlung. In diesen Testordner werden nun die ausgeführten HTML Seiten in durchnummerierter Ausführreihenfolge geschrieben. Ein Beispiel für diese Ordnerstruktur gibt Abbildung 43 Struktur der HTML Testverfolgung : - 10 - Anhang Abbildung 43 Struktur der HTML Testverfolgung • Attribute Name Beschreibung Wert Pflicht path Gibt den Pfad für Beliebige den Ordner an, Zeichenkette wohin die HTML Dateien geschrieben werden sollen. Dieser kann ein absoluter Pfad sein oder relativ vom Arbeitsverzeichnis aus. Nein enabled Er zeigt an, ob die „on“ oder „off“ HTML Testverfolgung einoder ausgeschaltet ist. Nein; Standard ist „off“ • Inhalt leer • Eltern <configuration> <library> Der Tag <library> gibt die Möglichkeit, eigens definierte Java Klassen in JAR Format im Programm zu laden. Diese werden gebraucht, falls eigene Klassen, Methoden für die Schnittstellen Assert, Massentest definiert wurden. • Attribute - 11 - Anhang Name path • Beschreibung Gibt den Pfad für die JAR Datei an. Dieser kann ein absoluter Pfad sein oder relativ vom Arbeitverzeichnis aus. Wert Beliebige Zeichenkette Pflicht Nein Inhalt leer • Eltern <configuration> <collection> Der Tag <collection> gibt an welche Testdateien bzw. anderen Testsammlungsdateien in welcher Reihenfolge ausgeführt werden sollen. • Attribute keine • Inhalt (collectionentry|testentry)* Es dürfen in beliebiger Reihenfolge, beliebig oft die Tags <collectionentry> und <testentry> erfolgen. • Eltern <testcollection> <collectionentry> Der Tag <collectionentry> erlaubt, dass in die Testsammlung neue Testsammlungen eingebunden werden können. Das ist vor allem dann wichtig, wenn man eine kompliziertere Teststruktur haben möchte, zum Beispiel für manche Gruppen von Tests andere Konfigurationen vorgesehen wurden. (Manche Testergebnisse sollten in eine Datenbank geloggt werden, andere wieder nicht.) Bei der Einbindung einer neuen Testsammlung ist auf jeden Fall zu beachten, dass damit kein Zyklus in der Teststruktur entsteht. • Attribute - 12 - Anhang Name path • Beschreibung Gibt den Pfad für die Testsammlung Datei an. Dieser kann ein absoluter Pfad sein oder relativ vom Arbeitsverzeichnis aus. Wert Beliebige Zeichenkette Pflicht Ja Inhalt leer • Eltern <collection> <testentry> Der Tag <testentry> erlaubt, dass in die Testsammlung Testdateien eingebunden werden können. • Attribute Name path • Beschreibung Gibt den Pfad für die Testdatei an. Dieser kann ein absoluter Pfad sein oder relativ vom Arbeitsverzeichnis aus. Wert Beliebige Zeichenkette Inhalt leer • Eltern <collection> Testdatei DTD (Test.dtd) <!ENTITY % test_element "step|moduleentry"> <!ENTITY % steps SYSTEM "Step.dtd"> %steps; - 13 - Pflicht Ja Anhang <!ELEMENT test ((%test_element;)*,repeat?,(%test_element;)*)> <!ATTLIST test id CDATA #IMPLIED name CDATA #REQUIRED url CDATA #REQUIRED> <!ELEMENT moduleentry (variable)*> <!ATTLIST moduleentry path CDATA #REQUIRED> <!ELEMENT variable EMPTY> <!ATTLIST variable name CDATA #IMPLIED value CDATA #IMPLIED> <!ELEMENT repeat ((argument)*,(step)*,prepare?)> <!ATTLIST repeat classname CDATA #REQUIRED> <!ELEMENT prepare (%test_element;)*> <test> Der Tag <test> ist das Root Element dieser XML Datei. In diesem Tag wird die URL ab der Hostadresse angegeben. Das Attribut url ist also keine vollständige Webadresse. • Attribute Name url • Beschreibung Wert Die URL zu der Webseite, wo der Test angefangen werden soll. Beliebige Zeichenkette Pflicht Ja Inhalt ((step|moduleentry)*,repeat?,(step|moduleentry)*) Es dürfen beliebig viele Tags von Typ <step> und <moduleentry> in beliebiger Reihenfolge auftreten. Der Tag <repeat> hingegen darf nur einmal an einer beliebigen Stelle eingebettet sein. • Eltern keine <moduleentry> Der Tag <moduleentry> gibt die Möglichkeit ein Modul in den Testfall einzubinden. Ein Modul ist ein Stück ausgelagerter Testablauf, das auch mit variablen Werten belegt werden kann. Die Belegung der Variablen erfolgt auch in diesem Tag. - 14 - Anhang • Attribute Name path • Beschreibung Wert Der Pfad zu der Beliebige Moduldatei. Dieser Zeichenkette kann ein absoluter Pfad sein oder relativ vom Arbeitverzeichnis aus. Pflicht Ja Inhalt (variable)* Der Inhalt besteht aus einer beliebigen Anzahl von <variable> Tags. • Eltern <test> <variable> Der Tag <variable> ermöglicht die Wertangabe an Variablen. Diese erfolgt immer nur für den entsprechenden Testfall. So ist es möglich, beispielsweise ein Login- Modul immer wieder mit verschiedenen Werten zu benutzen. • Attribute Name Beschreibung Wert Pflicht name Name der Variable $+ eine beliebige Zeichenkette Ja value Wert der Variable Beliebige Zeichenkette Ja • Inhalt leer • Eltern <moduleentry> <repeat> Der Tag <repeat> erlaubt Massentest über eine Menge von Seiten auszuführen. Dabei werden in immer den gleichen HTML Seiten in den gleichen Feldern verschiedenste Daten eingegeben. Es darf nur ein <repeat> Tag pro Testdatei definiert sein. - 15 - Anhang Um die Massendaten einlesen zu können, muss eine Struktur für die Daten und eine Klasse definiert werden, die diese Daten einliest. Die Angabe der Klasse muss innerhalb der JAR Dateien passieren, die in die Testsammlung in dem Tag <library> definiert und eingebunden wurden. • Attribute Name classname • Beschreibung Wert Der Pfad zu der Beliebige Klasse,die die Zeichenkette Schnittstelle RepeatInterface.jav a implementiert. Pflicht Ja Inhalt ((argument)*,(step)*,prepare?) Erst erfolgen eine beliebige Anzahl von <argument> Tags, dann eine beliebige Anzahl von <step> Tags und schließlich optional ein <prepare> Tag. • Eltern <test> <prepare> Der Tag <prepare> gibt die Möglichkeit bei der Ausführung von Massentests, dass nach jedem Durchlauf an die selbe Stelle (Seite) der Anwendung zurückgekehrt werden kann, um dann den nächsten Test mit Massendaten durchzuführen. Dieser Vorgang kann beispielweise nur das Drücken eines Verweises, aber auch ein komplettes Ausloggen bzw. neu Einloggen bedeuten. • Attribute keine • Inhalt (step|moduleentry)* Der Inhalt darf aus einer beliebigen Anzahl von <step> und <moduleentry> Tags, in beliebiger Reihenfolge definiert sein. • Eltern <repeat> DTD (Step.dtd) <!ENTITY % input_html_element "anyField| inputCheckbox|inputFile|inputPassword|inputRadio|inputReset|inputText| message|select|textarea"> <!ENTITY % submit_element - 16 - Anhang "a|button|inputButton|inputImage|inputSubmit"> <!ENTITY % html_element "%input_html_element;|%submit_element;"> <!ENTITY % input_element "frame?,form?,(%input_html_element;)*,(%submit_element;)?"> <!ENTITY % output_element "(assert|frame)?,(assert|form)?,(assert|%html_element;)*"> <!ELEMENT step (input,(output)*)> <!ELEMENT input (%input_element;)> <!ELEMENT output (%output_element;)> <!ELEMENT assert ((argument)*,(frame)?,(form)?,(%html_element;)*)> <!ATTLIST assert classname CDATA #IMPLIED> <!ELEMENT argument (#PCDATA)> <!ATTLIST argument name CDATA #REQUIRED> <!ELEMENT a (#PCDATA)> <!ATTLIST a id CDATA #IMPLIED name CDATA #IMPLIED href CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT anyField (#PCDATA)> <!ATTLIST anyField id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT button (#PCDATA)> <!ATTLIST button id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT form EMPTY> <!ATTLIST form id CDATA #IMPLIED name CDATA #IMPLIED action CDATA #IMPLIED - 17 - Anhang not CDATA #IMPLIED> <!ELEMENT frame EMPTY> <!ATTLIST frame id CDATA #IMPLIED name CDATA #IMPLIED src CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputButton EMPTY> <!ATTLIST inputButton id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputCheckbox EMPTY> <!ATTLIST inputCheckbox id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED checked (true|false) "true" not CDATA #IMPLIED> <!ELEMENT inputFile EMPTY> <!ATTLIST inputFile id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputImage EMPTY> <!ATTLIST inputImage id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED src CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputPassword EMPTY> <!ATTLIST inputPassword id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputRadio EMPTY> <!ATTLIST inputRadio - 18 - Anhang id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED checked (true|false) "true" not CDATA #IMPLIED> <!ELEMENT inputReset EMPTY> <!ATTLIST inputReset id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputSubmit EMPTY> <!ATTLIST inputSubmit id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT inputText EMPTY> <!ATTLIST inputText id CDATA #IMPLIED name CDATA #IMPLIED value CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT message (#PCDATA)> <!ATTLIST message id CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT select (option)*> <!ATTLIST select id CDATA #IMPLIED name CDATA #IMPLIED not CDATA #IMPLIED> <!ELEMENT option (#PCDATA)> <!ATTLIST option id CDATA #IMPLIED value CDATA #IMPLIED selected (true|false) "false" not CDATA #IMPLIED> <!ELEMENT textarea (#PCDATA)> <!ATTLIST textarea id CDATA #IMPLIED - 19 - Anhang name CDATA #IMPLIED not CDATA #IMPLIED> <step> Der Tag <step> gibt einen Schritt des Testablaufs ein. Ein Schritt besteht typischerweise aus: 1. Aufruf einer Webseite. 2. Bearbeiten bzw. Ausfüllen der Seite (z.b. Textfelder ausfüllen, Auswahl von Optionen etc.). 3. Verlassen der Seite. • • Abschicken des Formulars mit Absende Knopf. • Verweis anklicken. • Beliebigen Knopf anklicken. Attribute keine • Inhalt (input,(output)*) Der Inhalt besteht aus genau einmal <input> Tag gefolgt von einer beliebigen Anzahl von <output> Tags. • Eltern <test>, <repeat>, <prepare>, <module> <input> Der Tag <input> definiert den Bereich vom Tag <step> in dem die aktuelle HTML Seite bearbeitet werden kann. • Attribute keine • Inhalt (frame?,form?,(%input_html_element;)*,(%submit_element;)?) Der Inhalt ist folgendermaßen zu verstehen: es darf erst genau einmal der Tag <frame>, dann der Tag <form> vorkommen. Schließlich dürfen eine beliebige Anzahl von HTML Eingabeelementen % input_html_element; und eine beliebige Anzahl von HTML Abschickelementen % submit_element; folgen. <!ENTITY % input_html_element "anyField| inputCheckbox|inputFile|inputPassword|inputRadio|inputReset|inputText| message|select|textarea"> Die HTML Eingabeelemente sind die Folgenden: - 20 - Anhang XML Tagname Name des Elements HTML Tagname <anyField> beliebiges Feld alle <inputCheckbox> Mehrfachauswahl <input type=“checkbox“> <inputFile> Datei aufladen <input type=“file“> <inputPassword> Passwort Feld <input type=“password“> <inputRadio> Einfachauswahl <input type=“radio“> <inputReset> Zurücksetzen Knopf <input type=“reset“> <inputText> Texteingabefeld <input type=“text“> <message> Ein beliebiger Text - <select> Auswahlbox <select> <textarea> Textbox <textarea> <!ENTITY % submit_element "a|button|inputButton|inputImage|inputSubmit"> Die HTML Abschickelemente sind die Folgenden: XML Tagname Name des Elements HTML Tagname <a> Verweis <a> <button> Klickknopf <button> <inputButton> Klickknopf <input type=“button“> <inputImage> Optischer Klickknopf <input type=“image“> <inputSubmit> Abschicken Knopf <input type=“submit“> • Eltern <step> <output> Der Tag <output> definiert den Bereich vom Tag <step> in dem die Ergebnisseite überprüft werden kann. • Attribute keine • Inhalt ((assert|frame)?,(assert|form)?,(assert|%html_element;)*)* Der Inhalt ist folgendermaßen zu verstehen: Es darf erst genau einmal der Tag <frame>, dann der Tag <form> vorkommen. Schließlich dürfen eine beliebige Anzahl von HTML Elementen % html_element; definiert werden. Der Tag <assert> darf an beliebigen Stellen beliebig oft auftauchen. - 21 - Anhang <!ENTITY % html_element "%input_html_element;|%submit_element;"> Die HTML Elemente %html_element; bestehen aus allen definierbaren HTML Feldern. Diese setzen sich aus %input_html_element; und %submit_element; zusammen. <!ENTITY % input_html_element "anyField| inputCheckbox|inputFile|inputPassword|inputRadio|inputReset|inputText| message|select|textarea"> <!ENTITY % submit_element "a|button|inputButton|inputImage|inputSubmit"> • Eltern <step> <anyField> Der Tag <anyField> bezeichnet irgendein HTML Element. Dieses zu benutzen ist nur dann empfehlenswert, wenn es für den HTML Tag, der benutzt werden soll, keine eigene Unterstützung gibt. Das Setzen des Feldes mit einem Wert ist nicht möglich! • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Nein Nein Inhalt beliebiger Text Der Inhalt ist nach der Spezifikation evtl. der Wert des HTML Elements. • Eltern <input>, <output>, <assert> - 22 - Anhang <a> Der Tag <a> entspricht einem Verweis in der HTML Seite. • Attribute Name Beschreibung Wert id Der eindeutige Identifikator des Feldes. href Der Referenzwert Attribut „href“ im des Feldes. Gibt an, HTML Tag. wohin beim Klick gesprungen wird. name Der Name des Feldes. Wird nur beim Anker benutzt. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not DiesesAttribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Attribut „id“ im HTML Tag. Pflicht Nein Nein Nein Inhalt beliebiger Text Der Inhalt ist der Verweistext, der in der HTML Seite erscheint. • Eltern <input>, <output>, <assert> <button> Der Tag <button> bezeichnet den modernen Klickknopf. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. - 23 - Nein Anhang Name Beschreibung Wert value Der Wert des Feldes. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Pflicht Attribut „value“ im Nein HTML Tag. Nein Inhalt beliebiger Text Der Inhalt ist der Text des Knopfes, der in der HTML Seite erscheint. • Eltern <input>, <output>, <assert> <form> Der Tag <form> bezeichnet ein ausfüll- und abschickbares Formular in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht action Die Aktion, die beim Abschicken des Formulars ausgeführt wird. Attribut „action“ im Nein HTML Tag. id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Inhalt leer - 24 - Nein Nein Anhang • Eltern <input>, <output>, <assert> <frame> Der Tag <frame> bezeichnet ein Ansichtsfenster in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. src Die Quelle, von wo Attribut „src“ im aus das Fenster HTML Tag. geladen wird. Nein not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. Nein • Nein Inhalt leer • Eltern <input>, <output>, <assert> <inputButton> Der Tag <inputButton> bezeichnet einen „alten“ Klickknopf in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. - 25 - Nein Anhang Name not • Beschreibung Wert Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. Pflicht Nein Inhalt leer • Eltern <input>, <output>, <assert> <inputCheckbox> Der Tag <inputCheckbox> bezeichnet ein Mehrfachauswahlfeld in der HTML Seite. Es können also keines, eines oder mehrere Felder ausgewählt werden. • Attribute Name Beschreibung Wert Pflicht checked Zeigt an, ob das Feld ausgewählt wurde oder nicht. Attribut „checked“ im HTML Tag. Möglicher Werte: „true“ oder „false“ Nein, Standard ist „false“ id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. Nein name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not DiesesAttribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Inhalt leer • Eltern <input>, <output>, <assert> - 26 - Nein Anhang <inputFile> Der Tag <inputFile> bezeichnet ein Feld, mit dessen Hilfe Dateien ins Internet hochgeladen werden können. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes, ist ein Pfad zur Datei, die hochgeladen werden soll. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Nein Nein Inhalt leer • Eltern <input>, <output>, <assert> <inputImage> Der Tag <inputImage> bezeichnet einen optischen Abschickknopf in der HTML Seite. Das heißt, dass der Knopf wie ein Bild in der Seite erscheint. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. - 27 - Nein Anhang Name Beschreibung Wert Pflicht value Der Wert des Feldes. Der Text, der in der HTML Seite erscheint. src Gibt die Quelle an, Attribut „src“ im von wo aus das Bild HTML Tag. geladen werden soll. Nein not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. Nein • Attribut „value“ im Nein HTML Tag. Inhalt leer • Eltern <input>, <output>, <assert> <inputPassword> Der Tag <inputPassword> bezeichnet ein Feld, das für die Passworteingabe verantwortlich ist. Anstelle von Zeichen erscheinen dabei in der HTML Seite nur Sternchen. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Inhalt - 28 - Nein Nein Anhang leer • Eltern <input>, <output>, <assert> <inputRadio> Der Tag <inputRadio> bezeichnet ein Einfachauswahlfeld in der HTML Seite. Wie schon der Name sagt, darf nur ein Feld selektiert werden. • Attribute Name Beschreibung Wert Pflicht checked Zeigt an, ob das Feld ausgewählt wurde oder nicht. Attribut „checked“ im HTML Tag. Möglicher Werte: „true“ oder „false“ Nein, Standard ist „false“ id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. Nein name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Nein Inhalt leer • Eltern <input>, <output>, <assert> <inputReset> Der Tag <inputReset> bezeichnet den Rücksetzknopf eines Formulars in der HTML Seite. • Attribute Name id Beschreibung Der eindeutige Identifikator des Feldes. Wert Attribut „id“ im HTML Tag. - 29 - Pflicht Nein Anhang Name Beschreibung Wert Pflicht name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Nein Inhalt leer • Eltern <input>, <output>, <assert> <inputSubmit> Der Tag <inputSubmit> bezeichnet den Abschickknopf eines Formulars in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Inhalt leer • Eltern <input>, <output>, <assert> - 30 - Nein Nein Anhang <inputText> Der Tag <inputText> bezeichnet ein Texteingabefeld in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. value Der Wert des Feldes. Attribut „value“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Nein Nein Inhalt leer • Eltern <input>, <output>, <assert> <message> Der Tag <message> bezeichnet einen beliebigen Text in der HTML Seite. Dieser Text darf auch HTML Tags erhalten. • Attribute Name Beschreibung Wert id Der eindeutige Identifikator des Feldes. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Attribut „id“ im HTML Tag. Inhalt beliebiger Text - 31 - Pflicht Nein Nein Anhang Der Text, der in der HTML Seite gesucht werden soll. • Eltern <input>, <output>, <assert> <select> Der Tag <select> bezeichnet die Auswahlbox in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Nein Nein Inhalt (option)* Der Inhalt darf beliebig oft aus dem Tag <option> bestehen. • Eltern <input>, <output>, <assert> <option> Der Tag <option> bezeichnet eine Option in der Auswahlbox. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. Nein selected Zeigt an, ob die Option gewählt wurde oder nicht. Attribut „selected“ im HTML Tag. Nein value Der Wert des Feldes. Attribut „wert“ im HTML Tag. Nein - 32 - Anhang Name not • Beschreibung Wert Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. Pflicht Nein Inhalt beliebiger Text Der Inhalt ist der Text der Option, der in der HTML Seite erscheint. • Eltern <select> <textarea> Der Tag <textarea> bezeichnet die Textbox in der HTML Seite. • Attribute Name Beschreibung Wert Pflicht id Der eindeutige Identifikator des Feldes. Attribut „id“ im HTML Tag. name Der Name des Feldes. Attribut „name“ im Nein HTML Tag. not Dieses Attribut gibt KEIN WERT. an, dass das Nichtvorhandensein des Elements überprüft wird. • Inhalt beliebiger Text Der Inhalt ist der Text, der in der HTML Seite erscheint. • Eltern <input>, <output>, <assert> Moduldatei DTD (Module.dtd) <!ENTITY % step SYSTEM "Step.dtd"> - 33 - Nein Nein Anhang %step; <!ELEMENT module (step)*> <module> Der Tag <module> ist das Root- Element dieser XML Datei. • Attribute keine • Inhalt ((step)*) Als Inhalt können eine beliebige Anzahl von <step> Tags eingebunden werden. • Eltern keine - 34 -
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Related manuals
Download PDF
advertisement