Testen von Benutzeroberflächen - Department of Information Systems

Transcription

Testen von Benutzeroberflächen - Department of Information Systems
Westfälische Wilhelms-Universität Münster
Ausarbeitung
Testen von Benutzeroberflächen
im Rahmen des Skiseminars Software Engineering
Fabian Scholz
Themensteller: Prof. Dr. Herbert Kuchen
Betreuer: Prof. Dr. Herbert Kuchen
Institut für Wirtschaftsinformatik
Praktische Informatik in der Wirtschaft
Inhaltsverzeichnis
1 Einleitung ................................................................................................................... 1 2 Grundlagen des Testens ............................................................................................. 2 3 2.1 Testen von Software ........................................................................................... 2 2.2 Grafische Benutzerschnittstellen ........................................................................ 3 2.3 Testen von Benutzeroberflächen ........................................................................ 5 Tools zum Testen von Benutzeroberflächen ............................................................. 8 3.1 Automatisierung von Tests ................................................................................ 8 3.2 Merkmale der GUI-Testtools ............................................................................. 9 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4 5 Plattformunterstützung................................................................................ 9 Toolkit-Unterstützung ............................................................................... 10 Ausführungsmodus ................................................................................... 10 Identifikation der Oberflächenelemente ................................................... 11 Testskriptgenerierung ............................................................................... 12 Ergebnisvergleich ..................................................................................... 14 Skripttechniken ......................................................................................... 15 Synchronisation ........................................................................................ 17 Testfallverwaltung .................................................................................... 17 IBM Rational Functional Tester 8.0 ........................................................................ 18 4.1 Vorstellung ....................................................................................................... 18 4.2 Aufzeichnungsablauf........................................................................................ 19 4.3 Verhalten bei Oberflächenänderungen ............................................................. 22 Resümee und Fazit ................................................................................................... 25 Literaturverzeichnis ........................................................................................................ 27 II
Kapitel 1: Einleitung
1 Einleitung
Die meisten heutigen Softwaresysteme werden über grafische Benutzeroberflächen
bedient. Die Gründe dafür liegen vor allem in der leichteren und intuitiveren
Handhabung gegenüber Systemen, die über Befehlseingaben angesteuert werden. Zur
Qualitätssicherung
der
Software
gehört
neben
dem
Testen
der
einzelnen
Softwarekomponenten auch das Testen der Benutzeroberfläche. Die Vielzahl der
grafischen Oberflächenelemente wie Buttons, Texteingabefelder oder Menüs und die
vielen möglichen Benutzerinteraktionen mit diesen Elementen machen das manuelle
Testen der Oberfläche zu einem langwierigen, monotonen und kostspieligen Prozess.
Abhilfe soll hier die Automatisierung des Oberflächentests schaffen. Die Hersteller von
Testtools, die das automatisierte Testen ermöglichen, werben mit großen Zeit- und
Kostenersparnissen, so dass Software schneller, günstiger und fehlerfreier auf den
Markt gebracht werden kann. Die Tools unterscheiden sich sowohl hinsichtlich ihrer
Unterstützung von Plattformen und Schnittstellentechnologien als auch der eingesetzten
Methoden, die die Testautomatisierung ermöglichen sollen.
Ziel dieser Arbeit ist es, ein führendes auf dem Markt befindliches Testtool anhand
dieser Techniken und weiterer Merkmale vorzustellen. Dazu wird im zweiten Kapitel
der Oberflächentest zunächst in den gesamten Testprozess eingeordnet, wozu die
Grundlagen des Testens und grafischer Benutzerschnittstellen (Graphical User
Interface, GUI) erläutert werden. Daneben wird auf die besonderen Probleme
eingegangen, die der Oberflächentest mit sich bringt. Im dritten Kapitel werden dann
die Vor- und Nachteile der Testautomatisierung zur Lösung dieser Probleme und die
allgemeinen Merkmale und Techniken zur Umsetzung der Automatisierung dargestellt,
bevor diese anschließend anhand des Tools konkretisiert werden. Daneben wird das
Verhalten des Tools bei Änderungen einer Oberfläche analysiert und der
Anpassungsaufwand abgeschätzt, um zu sehen, ob sich effizient Oberflächentests
durchführen lassen. Die Arbeit endet mit einem Resümee, der Bewertung des Tools und
einem kurzen Fazit.
1
Kapitel 2: Grundlagen des Testens
2 Grundlagen des Testens
Um auf den Test von Benutzeroberflächen im Besonderen einzugehen, wird im
Folgenden zunächst kurz allgemein auf das Testen im gesamten Entwicklungsprozess
von
Software
eingegangen
sowie
auf
die
Eigenschaften
von
grafischen
Benutzeroberflächen.
2.1 Testen von Software
Das Testen von Software dient der Sicherstellung bzw. Steigerung der Qualität der
Software. Dabei wird geprüft, ob sie den spezifizierten Anforderungen, die zu Beginn
des Entwicklungsprozesses dokumentiert werden, gerecht wird. Auf Basis dieser
Vorgaben wird ein Testplan erstellt, der die Auflistung aller möglichen Testfälle enthält.
Durch den Vergleich von vorgegebenem Verhalten mit dem Verhalten während der
Testdurchführung kann somit bestimmt werden, ob die Software den Anforderungen
entspricht oder nicht. Bei Abweichungen zwischen Soll- und Ist-Verhalten liegt ein
Fehler vor, der einen Qualitätsmangel darstellt. Das Ziel des Testens ist es diese Fehler
aufzudecken [SL05, S.12; PP04, S. 55; FR07 S. 24].
Der Testprozess kann mithilfe von Vorgehensmodellen zeitlich in den gesamten
Softwareentwicklungsprozess eingeordnet werden. Im klassischen V-Modell ist ein
finden die Testaktivitäten parallel zur Softwareentwicklung statt. Diese Testaktivitäten
werden in Teststufen unterteilt, wobei jede Teststufe einer Entwicklungsphase
zugeordnet
ist.
So
kann
auf
jeder
Stufe
überprüft
werden,
ob
die
Entwicklungsergebnisse den spezifizierten Anforderungen entsprechen. Die Teststufe
mit dem höchsten Detaillierungsgrad im V-Modell bildet der Komponententest, auch
Modul- oder Unit-Test genannt. In ihm werden einzelne Softwarebausteine, z.B.
Klassen, isoliert voneinander betrachtet und ihr Ein- und Ausgabeverhalten getestet,
sodass die Ursache für die Aufdeckung eines Fehlers direkt dem Testobjekt zugeordnet
werden kann. Nach dem Test der Komponenten hat dann der Integrationstest die
Aufgabe, das Zusammenspiel der zusammengefügten Komponenten zu überprüfen,
indem eventuelle Fehler in den Schnittstellen zwischen ihnen aufgedeckt werden. Nach
Abschluss des Integrationstests wird beim Systemtest als dritte Stufe geprüft, ob das
Softwaresystem als Ganzes die vorgegebenen Anforderungen vollständig und korrekt
2
Kapitel 2: Grundlagen des Testens
erfüllt. Der abschließende Test ist der Abnahmetest, bei dem das Urteil des Kunden
darüber entscheidet, ob die vertraglich festgehaltenen Leistungen erbracht wurden
[SL05, S.39ff.].
Auf diesen vier Teststufen des Entwicklungsprozesses kommen jeweils mehrere
unterschiedliche Testmethoden zum Einsatz. [LIG02, S. 33ff.] klassifiziert diese in
statische und dynamische Tests. Im Gegensatz zu dynamischen Tests wird bei
statischen Tests die zu testende Software nicht ausgeführt, sondern der Quelltext oder
das formale Softwaremodell analysiert. Dynamische Tests überprüfen hingegen das in
Ausführung befindliche Programm, das sich auch in realer Betriebsumgebung befinden
kann, mittels stichprobenartiger Eingabedaten. Zu den dynamischen Testtechniken
gehören vor allem funktionale, nicht funktionale und änderungsbezogene Tests.
Funktionale Tests umfassen alle Methoden, die das von außen sichtbare Ein- und
Ausgabeverhalten der Software mit den funktionalen Anforderungen vergleichen. Nicht
funktionale Tests überprüfen, wie gut das Softwaresystem qualitativen Anforderungen
an die Zuverlässigkeit, Effizienz und Benutzbarkeit gerecht wird. Dazu zählt z.B. die
Robustheit gegenüber Fehlbedienungen oder die Benutzerfreundlichkeit der grafischen
Oberfläche. Änderungsbezogene Tests werden auch Regressionstests genannt. Sie
werden bei Modifikationen des Softwaresystems durchgeführt und geben Aufschluss
darüber, ob das bereits getestete System nach dessen Änderung neue oder bisher
versteckte Fehler aufweist [SL05, S.69ff.].
2.2 Grafische Benutzerschnittstellen
Grafische Benutzerschnittstellen finden heute Einsatz in fast jedem modernen
Softwaresystem. Durch ihre pixelorientierte grafische Darstellung auf dem Bildschirm
und die Bedienung mit Maus, Tastatur und anderen Eingabegeräten lässt sich oft
leichter und intuitiver mit Software arbeiten als über text- und befehlsorientierte
Schnittstellen. Im Folgenden werden dazu die Grundbegriffe erläutert, auf deren
Verständnis der weitere Teil der Arbeit aufbaut.
Benutzerschnittstelle
Unter einer Benutzerschnittstelle versteht man eine Kommunikationsschnittstelle
zwischen Mensch und Computer, über die der Mensch mit dem Computer interagieren
3
Kapitel 2: Grundlagen des Testens
kann. Dazu zählen Hardwarekomponenten wie Tastatur, Maus oder der Bildschirm
sowie Softwaresysteme.
Grafische Benutzerschnittstelle
Eine grafische Benutzerschnittstelle (Graphical User Interface, GUI) ist der sichtbare
Teil der Benutzerschnittelle, der grafisch auf dem Bildschirm dargestellt wird. Sie
beinhaltet grafische Elemente (Widgets), mit deren Hilfe der Benutzer durch Interaktion
Daten mit der dahinter liegenden Software austauschen kann. Synonym für den Begriff
wird in dieser Arbeit auch von grafischen Benutzeroberflächen gesprochen [GBO08].
Fenstersystem
Die grafischen Elemente für den Datenaustausch zwischen Computer und Benutzer
werden in einem rechteckigen Ausschnitt, dem sogenannten Fenster, dargestellt, das auf
dem Bildschirm verschoben, vergrößert und verkleinert werden kann. Solche Elemente
können beispielsweise Menüs, Eingabefelder, Tabellen, Grafiken oder Textfelder sein,
die Informationen bereitstellen oder aufnehmen. Das Fenstersystem übernimmt die
Verwaltung der Fenster auf dem Bildschirm [FS08]. Zu ihren Aufgaben zählen unter
anderem, die Fenster und Elemente grafisch darzustellen und die Benutzereingaben an
die gerade fokussierte Anwendung weiterzuleiten. Daneben stellt das Fenstersystem ein
API (Application Programming Interface) zur Verfügung, das es erlaubt, in Fenstern zu
zeichnen oder Standard-Elemente wie Knöpfe oder Menüs zu erstellen und auf dem
Fenster zu positionieren. Für Webseiten dient im weitesten Sinne der Browser als
Fenstersystem.
Toolkit
Toolkits (Widget Toolkits) bauen auf der Funktionalität des Fenstersystems auf. Sie
stellen eine Anzahl eigener Oberflächenelemente (GUI-Elemente) bereit und besitzen
eine eigene Ereignisbehandlung. Beispiele für Toolkits sind Microsofts Windows Forms
für .Net-Anwendungen oder Suns Swing für Java-Anwendungen.
Ereignissteuerung
Durch die Interaktion des Benutzers mit den Oberflächenelementen werden Ereignisse
ausgelöst, die bestimmte Programmfunktionen ausführen. Bspw. wird durch einen
Mausklick auf einen Button das Ereignis buttonClick ausgelöst, das dazu führt ein
4
Kapitel 2: Grundlagen des Testens
Fenster zu schließen oder eine Berechnung durchzuführen. Besitzt ein Fenster neben
diesem Button noch zwei Textfelder, so kann der Benutzer selbst bestimmen, in welcher
Reihenfolge er mit den Elementen agieren möchte, in welchem Textfeld er zuerst
Eingaben tätigen möchte oder ob er sofort auf den Button klickt. Bei textbasierten
Anwendungen, die über Befehle gesteuert werden, ist die Eingabereihenfolge dagegen
eindeutig
vorgegeben.
Die
Steuerung
über
Ereignisse
erhöht
die
Interaktionsmöglichkeiten des Benutzers, da er nun die Kontrolle über den
Programmablauf hat [SW02, S. 18f.].
2.3 Testen von Benutzeroberflächen
Beim Testen von Benutzeroberflächen wird die Interaktion zwischen dem
Softwaresystem und dem Bediener geprüft. Der Test lässt sich in zwei Bereiche
einteilen. Zum einen muss geprüft werden, wie sich die Anwendung dem Benutzer
gegenüber visuell darstellt, also ob bestimmte Design-Vorgaben der GUI-Schicht
eingehalten werden. Zum anderen wird über die Benutzeroberfläche die Funktionalität
der dahinterliegenden Software bedient, so dass neben dem Prüfen der DesignVorgaben das Testen der Funktionen hinter der Präsentationsschicht ein wesentlicher
Bestandteil des Oberflächentests ist [LD08].
Design-Vorgaben
Die Design-Vorgaben betreffen vor allem die Übersichtlichkeit und Einheitlichkeit der
gesamten Anwendungsoberfläche. Organisationen haben eigene Design-Standards, die
für jede ihrer Anwendungen gelten sollten und mit Hilfe von Checklisten geprüft
werden können [PG97]. Zu den Vorgaben zählen die grafischen Eigenschaften der
Oberflächenelemente und Fenster bzw. Webseiten, wie Positionierung, Größe, Farbe,
Textausrichtung und Textgröße, die die Übersichtlichkeit und Lesbarkeit der Oberfläche
erhöhen. Daneben kann getestet werden, ob Elementbeschriftungen einheitlich
verwendet werden, also Bezeichnungskonventionen eingehalten werden. Bietet bspw.
eine Webseite die Möglichkeit, dem Benutzer seine gesammelten Waren in einem
Warenkorb anzuzeigen, so sollte geprüft werden, dass alle Buttons der Seite, die zum
Warenkorb führen, die gleiche Beschriftung „Warenkorb“ besitzen und nicht an Stelle
inkonsistent mit „Einkaufswagen“ bezeichnet wurden.
5
Kapitel 2: Grundlagen des Testens
Funktionalität
Da der Benutzer über die Oberfläche die Anwendungsfunktionalitäten bedient, muss
geprüft werden, ob die gewünschten Funktionen vollständig und fehlerfrei mit Hilfe der
Oberflächenelemente ausgeführt werden. Zu den zu testenden Funktionen zählen neben
den eigentlichen fachlichen Funktionen, die für die Anwendung spezifiziert wurden,
auch Standardfunktionalitäten, die die Benutzbarkeit des Systems erhöhen und heute
fast selbstverständlich sind. Z.B. sollten Sortierungen korrekt dargestellt werden und
jede Funktion nicht nur über die Maus, sondern auch über die Tabulator-Tasten
erreichbar sein. Bei Falscheingaben sollte der Cursor auf das entsprechende Eingabefeld
gesetzt werden. Speziell bei Webseiten sollte geprüft werden, ob über die BrowserNavigation vor- und zurückgeblättert werden kann, ohne dass Datenverluste entstehen,
oder Inhalte beim Ausdruck der Seite verloren gehen [FK07, S.132-136].
Der Oberflächentest als funktionaler und nicht-funktionaler Test kann somit als Teil des
Systemtests angesehen werden, da er die Anwendung als Ganzes von außen über die
Benutzeroberfläche betrachtet [SC05, S. 361].
Probleme beim Testen von Oberflächen
Wie oben dargestellt, basieren Benutzeroberflächen meist auf einer ereignisgesteuerten
Implementierung. Dadurch haben die Benutzer einen sehr hohen Freiheitsgrad beim
Anwählen eines Oberflächenelementes per Mausklick oder Tastatur. Um die
Benutzeroberfläche vollständig zu testen, müssen alle möglichen Benutzerinteraktionen,
die auf der Oberfläche ausgeführt werden können, in jeder beliebigen Reihenfolge
getestet werden. Dazu gehören neben den zugelassenen Bedienungsmöglichkeiten auch
die nicht-zugelassenen, die von der Software entsprechend abgefangen werden müssen.
Bei sieben Textfeldern ergeben sich allein 5040 verschiedene Kombinationen der
Dateneingabe und somit genauso viele Testfälle. Die Abdeckung aller Testfälle ist
allein aus Zeit- und Kostengründen fast unmöglich. Um eine Anwendung in einen
bestimmten Zustand zu bringen, kann der Benutzer meist mehrere Wege über die
Oberfläche nehmen, bspw. durch Tastaturkürzel, Mausklicks oder Auswahl bestimmter
Menüeinträge. Auch hier stellt sich die Frage, wie viele Wege es zu diesem Zustand
gibt, bzw. welche Wege durch Testfälle abgedeckt werden sollten [PG97]. Der
Testaufwand wird zusätzlich noch dadurch erhöht, dass nach jeder Benutzeraktion der
Programmzustand mit seinem vorgegebenen Soll-Zustand verglichen werden muss. Es
6
Kapitel 2: Grundlagen des Testens
reicht nicht aus, die Endzustände nach dem gesamten Testlauf eines Testfalls zu
vergleichen, da jede Zwischenaktion zu einem undefinierten Zustand führen kann. Ohne
Zwischenvergleiche lässt sich ein möglicher Fehler nicht lokalisieren, wenn der
Sollzustand vom tatsächlichen Endzustand abweicht. Ist der Endzustand trotzdem
korrekt, werden falsche Zwischenzustände nicht aufgedeckt. Ebenso erhöht sich der
Testaufwand, wenn das Softwaresystem auf unterschiedlichen Plattformen lauffähig
sein soll, da Benutzeroberflächen oftmals grafisch unterschiedlich dargestellt werden
und ihre grafischen Elemente ggf. anders zu bedienen sind [PG97]. Da GUIs während
der Programmentwicklung laufend geändert werden, werden auch Regressionstests
aufwändiger, auch wenn sich die darunterliegende Programmlogik nicht ändert. Viele
alte Testfälle werden somit ungültig, weil der darin beschriebene Interaktionspfad in
dieser Form nicht mehr ausführbar ist. Wird bspw. die Bezeichnung eines Textfeldes in
einem Dialogfenster umbenannt, so kann der Tester anhand des Testfalls den
einzugebenden Text keinem Textfeld mehr eindeutig zuordnen [GST08].
7
Kapitel 3: Tools zum Testen von Benutzeroberflächen
3 Tools zum Testen von Benutzeroberflächen
Auf dem Markt gibt es eine Reihe von Tools zur Unterstützung oder Automatisierung
von Tests, die als CAST-Tools (Computer Aided Software Testing-Tools) bezeichnet
werden. Je nach Testaktivität oder Testphase gibt es verschiedene Typen von CASTTools mit unterschiedlichen Aufgaben und Funktionen [SL05, S.203]. Tools, die die
Durchführung von Oberflächentests automatisieren, werden allgemein als GUITesttools bezeichnet. In diesem Kapitel werden die allgemeinen Merkmale und
Methoden dieser Tools vorgestellt. Zuvor wird jedoch auf die Vor- und Nachteile der
Testautomatisierung eingegangen, um den Einsatz der Tools bei Oberflächentests zu
begründen.
3.1 Automatisierung von Tests
Das manuelle Testen von Benutzeroberflächen kann, wie im vorherigen Kapitel
erläutert wurde, aufgrund der zahlreichen Bedienungsmöglichkeiten sehr zeitaufwändig
und damit kostenintensiv sein. Beschränkt man sich dagegen lediglich auf das
Überprüfen einzelner Testfälle, so kann darunter die Softwarequalität leiden. Zudem
können menschliche Fehler den Test der Software verfälschen. Durch die
Automatisierung
von
Tests
mit
Hilfe
von
CAST-Tools
versprechen
sich
Softwarehersteller mit geringen finanziellen Mitteln und geringerem Zeitaufwand
Software mit hoher Qualität produzieren zu können [MM06, S. 37]. Dafür geben sie
nach [TG02, S.228f.] unter Anderem folgende Vorteile an:
•
Regressionstests können bei leicht modifizierten Anwendungen durch
geringfügige Änderungen der Testfälle durchgeführt werden.
•
Es können Tests vorgenommen werden, die aus Zeitmangel manuell nicht
vorgenommen würden, weil mehr Tests öfter ausgeführt werden können.
•
Durch Automatisierung langwieriger, monotoner Tests können sich die Tester
mit wichtigeren Aufgaben befassen.
•
Automatisierte
Tests
können
auch
mit
unterschiedlichen
Rechner-
konfigurationen leicht wiederholt werden.
•
Die Tests können wiederverwendet werden.
8
Kapitel 3: Tools zum Testen von Benutzeroberflächen
•
Durch die Automatisierung kann die Testphase verkürzt werden und die
Software früher fertiggestellt werden.
Die Testdurchführung eignet sich am besten für eine Automatisierung, da der Ablauf
zumeist aus vielen sich wiederholenden langwierigen Eingaben besteht, die viel Zeit in
Anspruch nehmen. Der Testentwurf sowie der Soll-Ist-Vergleich der Ergebnisse lassen
sich nur eingeschränkt automatisieren, weil diese Prozesse teilweise intellektuelle
Fähigkeiten und Kreativität voraussetzen.
Der Einsatz automatisierter Tests ist aber nicht in jedem Fall sinnvoll, da die höhere
Wirtschaftlichkeit im Vergleich zu manuellen Tests nicht immer gegeben sein muss.
Regressionstests lassen sich zwar effizient automatisieren[MM06, S.36], aber gerade
wenn Benutzeroberflächen in der Entwicklungsphase in kurzen Abständen geändert
werden, müssen die vorgesehenen automatisierten Regressionstests immer wieder
angepasst werden, so dass der Aufwand den Nutzen der Automatisierung übersteigen
kann. Dasselbe gilt für Tests, die nur sehr selten durchgeführt werden oder manuelle
Handlungen erfordern und für Testaspekte, die nur von einem Menschen beurteilt
werden können, wie bspw. die Benutzerfreundlichkeit der grafischen Oberfläche
[TG02, S. 236f.].
3.2 Merkmale der GUI-Testtools
3.2.1 Plattformunterstützung
Viele GUI-Testtools sind für bestimmte Plattformen ausgerichtet. Sollen z.B.
Oberflächen von Windows-Anwendungen getestet werden, so muss das Tool unter
Windows lauffähig sein. Wenn Software für mehrere Plattformen verfügbar sein soll,
dann ist es vorteilhaft ein Testtool auszuwählen, dass auf all diesen Plattformen
ausgeführt werden kann, da dadurch doppelter Aufwand für die Einarbeitung in das
Tool und für die Testerstellung vermieden wird. Ist das Testtool selbst eine JavaAnwendung, ist die Plattform von untergeordnetem Interesse, da Java-Anwendungen
plattformunabhängig sind.
9
Kapitel 3: Tools zum Testen von Benutzeroberflächen
3.2.2 Toolkit-Unterstützung
Neben der geeigneten Plattform ist der Einsatz des Testtools auch abhängig von der
Schnittstellen-Technologie, mit der die Oberfläche der zu testenden Anwendung
dargestellt wird. Dabei kann es sich um native GUIs aber auch um Webseiten handeln.
Zu den nativen Toolkits zählen bspw. Microsofts Windows Forms, Java/Swing, und
Java/SWT. Die grafischen Oberflächen von Webseiten werden über HTML-Quelltext
beschrieben und mit Hilfe eines Browsers dargestellt. Jede dieser Schnittstellen hat
eigene grafische Bedienelemente und Mechanismen zur Behandlung von Ereignissen,
die vom jeweiligen Testtool unterstützt werden müssen. Dazu gehören neben einfachen
Ereignissen (Low-Level-Events), wie Mausklicks oder Tastatureingaben, die von jeder
GUI-Technologie unterstützt werden, auch spezielle Ereignisse, wie bspw. onload
beim Laden einer Webseite oder TextEvent bei Änderung des Inhalts von Java/SWTTextfeldern.
3.2.3 Ausführungsmodus
Bei der Testdurchführung wird die Oberfläche durch Auslösen von Aktionen der
grafischen Elemente gesteuert. Diese Bedienung kann positions- oder objektorientiert
erfolgen.
Positionsorientierung
Bei der positionsorientierten Testausführung simuliert das Testtool Tastatureingaben,
Mausbewegungen und Mausklicks so, als würde ein Benutzer die Oberfläche bedienen.
Zur Positionierung der Maus werden im Test (x, y)-Koordinaten verwendet, die wie die
Klicks und Tastatureingaben an das Betriebssystem oder im Falle von JavaAnwendungen an virtuelle Maschinen geschickt werden. Dort werden die Ereignisse
dann an die zu testende Anwendung oder den Browser weitergeleitet und das grafische
Element ermittelt, das auf der Mauskoordinate liegt. Ausgehend von diesem Element
werden dann die dahinterliegenden Funktionen ausgeführt. Ein großer Nachteil dieses
Modus ist, dass er nicht sehr robust gegenüber Veränderungen auf der
Benutzeroberfläche ist. In der Entwicklungsphase aber auch beim Vergrößern oder
Verschieben des Oberflächenfensters kann sich die Größe und Position der Elemente
ändern, so dass Testdurchführungen stehen bleiben oder abbrechen, weil sich plötzlich
10
Kapitel 3: Tools zum Testen von Benutzeroberflächen
unter der vorgegebenen Mausposition ein anderes oder kein Element befindet [SL05, S.
210] (vgl. Abbildung 1).
Abbildung 1: Nachteil der Positionsorientierung bei Layoutänderung
Objektorientierung
Bei der objektorientierten Ausführung wird von der Position des Mauszeigers auf
unterster Ebene abstrahiert. Stattdessen wird versucht die Oberflächenelemente zu
identifizieren und Referenzen auf sie anzulegen. Dadurch werden die automatisierten
Testabläufe gegenüber Änderungen am Layout robuster, da die Größe und die Position
der Elemente innerhalb eines Fensters nun keine Rolle mehr spielt [HD08, S.475]. Ein
Nachteil ist, dass mit diesem Modus auf verdeckte Objekte zugegriffen werden kann,
die positionsorientiert mit dem Mauszeiger nicht erreichbar wären. Bspw. kann es
Oberflächenelemente geben, die außerhalb des sichtbaren Fensterbereichs liegen oder
sich überdecken. Deshalb muss die Oberfläche zusätzlich visuell überprüft werden.
Daneben müssen Benutzeroberflächen, die individuell von der dahinterliegenden
Software als Grafik gerendert werden und nicht auf die Standardelemente eines
entsprechenden Toolkits zurückgreifen, positionsorientiert getestet werden, weil ihre
grafischen Objekte nicht auf der Oberfläche identifiziert werden können.
3.2.4 Identifikation der Oberflächenelemente
Aktuelle GUI-Testtools führen Testabläufe objektorientiert durch, bieten daneben aber
auch die Möglichkeit die Tests positionsorientiert auszuführen. Die Objektorientierung
setzt voraus, dass die Oberflächenelemente der zu testenden Software vom Testtool
erkannt werden können. Wie in Kapitel 3.2.2 beschrieben, muss dafür die von der
Software verwendete GUI-Technologie in Form von Toolkits oder Webseiten vom
Testtool unterstützt werden.
11
Kapitel 3: Tools zum Testen von Benutzeroberflächen
Ein bestimmtes Oberflächenelement kann über eine Kombination seiner spezifischen
Attribute eindeutig identifiziert werden. Zu diesen Eigenschaften zählen u.a. der
Elementtyp (Button, Textfeld, Liste, etc.), die Elementbeschriftung, die Position im
Fenster oder der softwareinterne Bezeichner des Elements. Soll im Testlauf z.B. ein
Button in einem bestimmten Fenster mit der Aufschrift „Ok“ automatisiert angeklickt
werden,
so
könnte
dies
im
Testskript
bspw.
über
getButton(label=“Ok“).click() geschehen. Bei Änderungen an den
Attributen oder Austausch durch ein anderes Oberflächenelement während der
Entwicklungsphase müssen bei dieser Art des Zugriffs allerdings alle entsprechenden
Testfälle angepasst werden. Deshalb bieten viele GUI-Testtools die Möglichkeit GUIMapping-Dateien zu erstellen, um hohen Anpassungsaufwand zu vermeiden. Dabei
werden die Objekteigenschaften zur Identifikation in eine Mapping-Datei ausgelagert
und ihnen ein logischer Name zugewiesen, über den man dann in den Testskripten
Zugriff auf das entsprechende Element erhält. Ein Eintrag in dieser Datei könnte wie
folgt aussehen:
butOK = { .class = Button;
.label = “Ok“; }
In den Skripten erzielt dann butOK.click() den gleichen Effekt wie der obige
Befehl, mit dem Vorteil, dass bei Layoutänderungen die Testskripte meist unberührt
bleiben und lediglich der Mapping-Eintrag einmalig angepasst werden muss [FG99, S.
533ff.].
3.2.5 Testskriptgenerierung
Für die Erstellung von Testskripten bieten die Testtools folgende Ansätze.
Programmierung
Mit der Programmierung ist die manuelle Erstellung von Testskripts von Hand in einer
bestimmten Skriptsprache gemeint. Hierbei erfolgt letztlich nur die Ausführung der
geschriebenen Skripte automatisiert durch Computerunterstützung. Ein Vorteil
der
Programmierung ist, dass der Skriptersteller die Kontrolle über die Struktur und den
Inhalt der Skripte hat. Allerdings stellt sich die Frage, wie die zu testenden
Oberflächenelemente mit der Skriptsprache angesprochen werden können, so dass
12
Kapitel 3: Tools zum Testen von Benutzeroberflächen
neben der Programmierung auch Verweise auf die Elemente erstellt werden müssen. Da
die Skriptsprachen komplex sein können, sind allerdings Experten als Testersteller
erforderlich, die sich mit der Funktionalitäten und den Bibliotheken der Skriptsprache
auskennen.
Capture-Replay
Der Capture-Replay-Ansatz ist das verbreitetste Verfahren zur Erstellung von
Testskripts in GUI-Testtools. Dabei werden die Benutzerinteraktionen bei einer
Testdurchführung
mit
dem
laufenden
System
in
Form
von
Mausklicks,
Mausbewegungen und Tastatureingaben objekt- oder positionsorientiert im Hintergrund
aufgenommen und das Testskript um diese Aktionen ergänzt (Capture). Während der
Aufzeichnung können Soll-Ist-Vergleiche in Form von Prüfpunkten (Checkpoints) in
das Skript eingefügt werden, um das Programmverhalten sowie layoutrelevante
Eigenschaften der Oberflächenelemente zu überprüfen. Das fertige Skript kann dann in
Form von automatisierten Testdurchführungen beliebig oft abgespielt werden (Replay).
Werden Vor- oder Nachbedingungen der Checkpoints nicht eingehalten, wird die
Ausführung mit einer entsprechenden Fehlermeldung abgebrochen [FG99, S. 42ff.].
Deshalb bietet sich das Verfahren besonders zur Automatisierung von Regressionstests
an [SL05, S. 210].
Ein weiterer Vorteil dieses Ansatzes ist, dass auch Tester, die sich nicht mit der
Skriptsprache auskennen, sehr schnell lauffähige Skripte erstellen können. Daneben gibt
es aber auch einige Nachteile.
•
Viele offensichtliche Fehler werden vom Testersteller schon während der
Aufnahme erkannt, wenn sich das System nicht so verhält, wie gedacht. Die
Aufnahme muss abgebrochen werden und das Programm berichtigt. Erst dann
kann die Aufzeichnung wiederholt werden, sodass bei der Ausführung des
fertigen Skripts die meisten Fehler schon beseitigt wurden. Deshalb ist die
Aussicht Fehler mit Hilfe des Capture-Replay-Ansatzes zu finden eher begrenzt
[LW05, S. 21]. Testskripts können demnach erst erstellt werden, wenn das
Softwaresystem bereits existiert und die Testaufzeichnung erfolgreich
durchgeführt wurde. Deshalb eignet sich das Verfahren lediglich für
Regressionstests.
13
Kapitel 3: Tools zum Testen von Benutzeroberflächen
•
Die Werte, die bspw. in Textfeldern auf der Oberfläche während der
Aufzeichnung eingegeben wurden, sind fest im Testskript verankert. Zur
Wiederverwendung des Skripts mit anderen Eingabedaten muss es nachträglich
manuell angepasst werden.
•
Das aufgezeichnete Testskript entspricht einem linearen Aktionspfad auf der
Softwareoberfläche, was zu Problemen führen kann, wenn sich z.B. das
Programmverhalten bei Aufzeichnung und Testausführung durch aufpoppende
Hinweisfenster
oder
Systemmeldungen
unterscheidet.
Deshalb
müssen
Fallunterscheidung berücksichtigt werden, so dass das Skript nachträglich
überarbeitet werden muss [FG99, S. 58f.].
Automatisierte Ansätze
Neben den Ansätzen Programmierung und Capture-Replay, bei denen eine Person
maßgeblich an der Erstellung der Testskripte beteiligt ist, gibt es weitere Methoden, bei
denen neben der automatisierten Testdurchführung auch Testskripte automatisch
generiert werden, so dass zufällige lauffähige Skripte in kurzer Zeit und ohne viel
Aufwand erzeugt werden können.
3.2.6 Ergebnisvergleich
Neben der Simulation der Benutzerinteraktionen werden bei der Testdurchführung die
Ausgaben bzw. Ergebnisse dieser Aktionen mit den vorgegebenen Soll-Werten
verglichen. Dieser Vergleich kann auf bildlicher und inhaltlicher Ebene geschehen.
Inhaltlicher Vergleich
Werden die Testläufe objektorientiert ausgeführt, kann das Testtool die grafischen
Standard-Oberflächenelemente erkennen und ihre Eigenschaften auslesen. Zu einem
Textfeld gehört neben seiner Position und Farbe bspw. die Eigenschaft text, in der der
Inhalt des dargestellten Textes im Textfeld als Zeichenkette verwaltet wird. So können
auf inhaltlicher Ebene Texte, Zahlen oder boolesche Werte miteinander verglichen
werden.
Bildvergleich
Beim Bildvergleich werden Bildschirmausschnitte anhand von Bitmaps binär
miteinander
verglichen.
Dieses
Verfahren
kommt
zum
Einsatz,
wenn
14
Kapitel 3: Tools zum Testen von Benutzeroberflächen
Oberflächenelemente nicht erkannt werden können oder Grafiken verglichen werden
sollen. Am einfachsten ist dabei die Erfassung des gesamten Bildschirms.
Problematisch daran sind allerdings grafische Elemente, die sich zwischen
Testausführungen unterscheiden können, wie z.B. die Darstellung der Uhrzeit oder
eines Benutzernamens. Deshalb sollten Testtools die Möglichkeit bieten auch kleinere
Bildschirmbereiche miteinander zu vergleichen [FG99, S. 50]. Aufgrund des binären
Vergleichs müssen die Bilder daneben absolut identisch sein. Hat ein Pixel eines Bildes
bspw. einen sehr leicht abweichenden Farbton, den ein menschlicher Tester nicht
wahrnehmen würde, so sind die Bilder für das Testtool verschieden, so dass der Testlauf
ungewollt fehlschlägt. Testtools, die es erlauben, Toleranzwerte für Pixelabweichungen
anzugeben, können Abhilfe schaffen.
Vergleich mithilfe von Texterkennung
Die Texterkennung (OCR) ist sinnvoll, wenn es nicht möglich ist, Textausgaben
objektorientiert über den Inhalt oder über Bitmaps zu vergleichen. Das ist bspw. der
Fall, wenn die Oberflächenelemente, deren textueller Inhalt verglichen werden soll,
nicht von Testtool erkannt werden können und die Software auf mehreren Plattformen
getestet wird, so dass sich die Texte in Schriftart und Farbe ggf. unterscheiden. Die
Texterkennung abstrahiert von diesen Texteigenschaften und liest lediglich die
Textinhalte auf Basis von Bitmaps aus.
3.2.7 Skripttechniken
Viele Testtools bieten unterschiedliche Methoden zur Strukturierung von Testskripten
an, die einzeln aber auch in Kombination dazu beitragen, dass der Aufwand bei der
Erstellung, Wartung und Wiederverwendung automatisierter GUI-Tests reduziert
werden kann.
Unterstützung von Kontrollstrukturen
Sehr einfach gehaltene Testtools bieten meist die Möglichkeit lineare Skripts mit der
Capture-Replay-Methode zu erstellen und abzuspielen. Soll der lineare Ablauf eines
solchen Testskriptes beeinflusst werden können, so ist es notwendig, dass die zugrunde
liegende Skriptsprache Funktionsaufrufe und Kontrollstrukturen in Form von Schleifen
und Bedingungen unterstützt. Soll in einem Testfall bspw. über die Benutzeroberfläche
15
Kapitel 3: Tools zum Testen von Benutzeroberflächen
eine Datei gespeichert werden, so kann es sein, dass ein zusätzliches Dialogfenster
danach fragt, ob die Datei überschrieben werden soll. Da bei der Erstellung nicht
feststeht, ob die Datei bereits existiert, kann z.B. mit einer if-Abfrage, die prüft, ob der
Überschreiben-Dialog angezeigt wird, die Befehlsausführung verzweigt werden.
Kontrollstrukturen tragen somit dazu bei, dass Testskripte robuster werden. Mit Hilfe
von Funktionsaufrufen können die Skripte zusätzlich modularisiert werden, sodass sie
übersichtlicher und in Teilen wiederverwendbar sind [FG99, S. 78ff.].
Datengetriebene Tests (data-driven tests)
Testskripte beinhalten oft fest eingecodete Daten, die das Testtool z.B. automatisiert in
Textfelder eingibt oder mit einem Ergebnis vergleicht. Soll ein Testlauf allerdings mit
verschiedenen Testdaten wiederholt werden, bietet es sich an, die Testdaten vom
eigentlichen Testskript zu trennen. Die Eingabe- und Ergebnisdaten werden dazu bspw.
in Tabellenform in einem externen Datenpool abgespeichert und können beliebig
erweitert werden. Das Testtool wiederholt das Skript dann mit allen oder zufälligen
Einträgen aus der Tabelle [FG99, S. 83ff.; SL05, S. 212]. Neue Testfälle können so sehr
schnell durch Erweiterung des Datenpools erstellt werden ohne Änderungen am
Testskript vornehmen zu müssen.
Kommandogetriebene Tests (keyword-driven tests)
Bei
vielen
Testabläufen
werden
bestimmte
Interaktionspfade
mit
der
Benutzeroberfläche oft identisch verwendet, so dass es sinnvoll ist, sie in Prozeduren zu
kapseln. Kommandogetriebene Tests beinhalten neben Skripten, die diese Prozeduren
definieren, Tabellen, die die Prozeduren über Prozedurnamen (Kommandos) mit
bestimmten Eingabedaten aufrufen. Ähnlich wie bei datengetriebenen Tests kommen
die Eingabe- und Prüfwerte aus einer externen Tabelle, mit dem Unterschied, dass
diesen Werten zusätzlich ein Kommando voransteht, dem diese Werte im Testlauf
übergeben werden. Mit Hilfe der Skripte, die die Prozeduren implementieren, kann von
dem verwendeten GUI-Testtool und der Plattform abstrahiert werden. Die Tabellen, die
die Testläufe beinhalten, bedürfen keinerlei Modifikation, lediglich die Prozedurskripte
müssen an das jeweilige Tool angepasst werden [FG99, S. 90 ff.].
16
Kapitel 3: Tools zum Testen von Benutzeroberflächen
3.2.8 Synchronisation
Im Gegensatz zum manuellen Test kann der automatisierte Testlauf um ein vielfaches
schneller durchgeführt werden. Die Geschwindigkeit, in der eine grafische Oberfläche
Benutzereingaben erwartet, richtet sich in vielen Fällen eher an einem menschlichen
Akteur aus. Soll bspw. eine Datei geöffnet werden, so wird der Benutzer erst einen
Dateinamen eingeben, wenn der entsprechende Öffnen-Dialog sichtbar ist. Ein GUITesttool dagegen erkennt nicht, dass es die simulierte Eingabe solange verzögern sollte,
bis das Fenster sichtbar ist. Problematisch sind auch Ergebnisvergleiche, z.B. bei
Webseiten. Soll ein Bildschirmausschnitt einer Seite mit der Soll-Ausgabe durch einen
Prüfpunkt verglichen werden, so kann es sein, dass die Webseite direkt nach ihrem
Aufruf noch nicht vollständig geladen wurde und der Ausschnitt deshalb einen komplett
anderen Inhalt enthält als einige Sekunden später, so dass der Testlauf fehlschlägt. Aus
diesem Grund muss es bei der automatisierten Ausführung die Möglichkeit geben, auf
die Benutzeroberfläche zu warten [FG99, S. 243, KL94]. Dazu können z.B. sleepBefehle eingesetzt werden, die die Testausführung für eine bestimmte Zeit stoppen oder
es kann mithilfe der Ereignis-Warteschlange der Benutzeroberfläche geprüft werden, ob
sie bereit ist neue Ereignisse entgegenzunehmen [PZ08].
3.2.9 Testfallverwaltung
Außer der automatisierten Testdurchführung bieten einige GUI-Testtools weitere
Unterstützung des Testprozesses an. Dazu gehört neben der Auswertung der
Testergebnisse in Form von Testberichten und Aufstellung schon ausgeführter Testfälle
die Möglichkeit der Fehlerverfolgung (bug-tracking). Dabei werden auftretende Fehler
nummeriert und in einer Fehlerdatenbank dokumentiert, die für alle Testmitarbeiter
zugänglich ist. Diese Datenbank gibt Auskunft über die Testfälle, in denen der Fehler
auftritt und in welcher Programmversion er aufgetreten ist, die Fehlerpriorität, den
aktuellen Fehlerstatus, den für den Fehler zuständigen Entwickler, das Datum der
Entdeckung, Zuweisung an einen Entwickler etc. Somit haben die Testpersonen eine
genaue Übersicht über die gefundenen Fehler und können jederzeit Auskunft über den
aktuellen Fehlerstatus der zu testenden Software geben [MM06, S.136ff.].
17
Kapitel 4: IBM Rational Functional Tester 8.0
4 IBM Rational Functional Tester 8.0
Nachdem im vorherigen Kapitel die grundlegenden Features von GUI-Testtools
erläutert wurden, soll jetzt der IBM Rational Functional Tester 8.0 (RFT), einer der
Marktführer im Bereich kommerzieller GUI-Testtools, vorgestellt werden, an dem diese
Merkmale
konkretisiert
werden.
Da
während
der
Entwicklungsphase
von
Softwaresystemen Design und Navigation der Oberfläche oftmals einer ständigen
Anpassung unterliegen, soll auch auf die Frage eingegangen werden, in welcher Form
sich das Tool gegenüber sich ändernden Oberflächenlayouts verhält.
4.1 Vorstellung
Mit dem Rational Functional Tester lassen sich GUI-Tests unter Windows und Linux
ausführen, wobei unter Linux die Einschränkung besteht, dass keine Tests
aufgezeichnet
werden
können.
Grundsätzlich
lassen
sich
alle
ausführbaren
Anwendungen testen. Die Erkennung grafische Standardoberflächenelemente und ihrer
Eigenschaften wird in der Grundversion des Tools für .NET 3.0-, Java- und
Webanwendungen sowie einiger anderer spezieller Anwendungen unterstützt. Das
mitgelieferte SDK ermöglicht zudem durch Eigenprogrammierung das Tool um die
Unterstützung individueller Oberflächenelemente
zu erweitern. Die Erstellung der
Testskripts verläuft anfangs zumeist über die Aufzeichnung von Benutzerinteraktionen.
Für die Nachbearbeitung bietet das Tool keine eigene Entwicklungsumgebung an, es
bettet sich während der Installation auf Wunsch in die vertraute Eclipse- oder VisualStudio-Umgebung ein, in denen Java bzw. Visual Basic .NET als Testskriptsprachen
dienen. Eine Einarbeitung in das Tool ist somit schnell möglich, nicht zuletzt auch
aufgrund der einsteigerfreundlichen Hilfetexte und Beispiele.
Abbildung 2 zeigt die Standardansicht des Tools in der Eclipse-Umgebung. Im linken
Fensterbereich können Testprojekte erstellt und eingesehen werden. Diese Projekte
können Testfälle und Testordner mit weiteren Testfällen enthalten, so dass durch diese
Gruppierung die Vielzahl von Testfällen bei großen Testprojekten trotzdem
überschaubar bleibt. Zudem kann man von hier aus auf die Ergebnisse des letzten
Testlaufs eines Testfalls zugreifen, so dass insgesamt eine sehr schlichte
Testfallverwaltung möglich ist. Auf der rechten Fensterseite befindet sich der Skript18
Kapitel 4: IBM Rational Functional Tester 8.0
Explorer, der alle Objekte enthält, auf die im Testskript zugegriffen werden kann. Dazu
zählen Referenzen auf die grafische Oberflächenelemente (Testobjekte), Prüfpunkte für
den Ergebnisvergleich und Datenpools für datengetriebene Tests. Im mittleren
Fensterbereich kann das Testskript mit den üblichen Eclipse-Hilfestellungen, wie
Autovervollständigung und Refactoringfunktionen editiert und debuggt werden.
Abbildung 2: RFT-Hauptfenster in der Eclipse IDE
4.2 Aufzeichnungsablauf
Vor der eigentlichen Testaufzeichnung muss das zu testende Softwaresystem im RFT
global und projektunabhängig registriert werden und bei Javaanwendungen die
Laufzeitumgebung, bei Webanwendungen der Browser gewählt werden, mit dem die
Aufnahme bzw. die Testläufe durchgeführt werden solle. Nachdem ein neues Projekt
erstellt wurde, können Testskripte mit Hilfe der Capture-Replay-Funktion aufgezeichnet
werden. Dazu minimiert sich das Hauptfenster automatisch und ein kleines
Aufnahmefenster wird angezeigt, das während der gesamten Aufzeichnung im
Vordergrund zur Testanwendung bleibt. Es beinhaltet Funktionen zum Starten,
Pausieren und Stoppen der Aufzeichnung und Setzen von Prüfpunkten und
Verknüpfungen zwischen GUI-Elementen und Datenpools. Bei Aufzeichnungsbeginn
wird die Anwendung bzw. der gewünschte Webbrowser mit entsprechender URL
19
Kapitel 4: IBM Rational Functional Tester 8.0
aufgerufen. Die getätigten Benutzerinteraktionen werden während der manuellen
Testdurchführung im Aufnahmefenster mitgeloggt. Beim Einfügen von Prüfpunkten
kann das zu testende GUI-Element mit der Maus selektiert werden, worauf es durch ein
rotes Rechteck umrahmt wird, wenn es erkannt wurde. Überprüft werden können
einzelne Dateneinträge z.B. in Textfeldern oder ganze Datengruppen in Tabellen und
viele weitere Eigenschaften über einen Wizard, in dem sich die Sollwerte in
tabellarischer Form eintragen lassen. Zusätzlich lassen sich seit Version 8.0 auch
Bildausschnitte überprüfen. Allerdings können keine Toleranzgrenzen für den Vergleich
angeben werden; die Ausschnitte müssen absolut identisch sein, damit der Prüfpunkt
passiert werden kann. Für Prüfpunkte kann zudem angegeben werden, ob sie
zeitverzögert nochmals durchlaufen werden sollen, falls sie aktuell nicht passiert
werden können. So kann bei Bildvergleichen auf Webseiten bspw. nach zwei Sekunden
erneut geprüft werden, ob die Ausschnitte identisch sind. Eine OCR-Texterkennung in
Bildausschnitten ist allerdings nicht möglich.
Der Wizard erlaubt ebenfalls die
Erstellung datengesteuerter Tests. Dazu wird einem Attribut eines GUI-Elements ein
Wert in Form einer Variablen zugewiesen, wobei sich die Variable wiederum auf eine
Tabellenspalte des Datenpools bezieht. Auch bei den Prüfpunkten können konstante
Sollwerte durch Variablen ersetzt werden, die sich auf andere Spalten dieser Tabelle
beziehen. Jede Tabellenzeile aus dem Datenpool entspricht dabei dann einem möglichen
Testlauf, der nun datengesteuert Zeile für Zeile wiederholt werden kann. Kann ein
Prüfpunkt nicht passiert werden, weil Soll- und Istwerte nicht übereinstimmen, oder die
Durchführung nicht fortgesetzt werden, weil ein zu testendes GUI-Element nicht
identifiziert werden kann, liegt ein Fehler vor und der Testlauf wird vorzeitig
abgebrochen. Nach jeder Testausführung erstellt das Tool dann ein Testprotokoll im
Text-, HTML- oder nativen Format, in dem die passierten Prüfpunkte, Warnungen und
Fehler gelistet sind.
Abbildung 3 zeigt die Anmeldeoberfläche einer Web-Anwendung. Mit einem einfachen
Testfall soll nun geprüft werden, ob sie sich bei Eingabe bestimmter Anmeldedaten den
Erwartungen entsprechend verhält. Bei der Testaufzeichnung erhält zunächst das
Benutzertextfeld durch Mausklick den Eingabecursor und die Zeichenfolge „admin“
wird eingetippt. Dasselbe wird mit dem Passworttextfeld mit der Folge „123“
wiederholt. Daraufhin wird auf den Anmelden-Button geklickt und geprüft, ob die
angezeigte Meldung dem String „Sie sind angemeldet!“ entspricht. Der Browser wird
20
Kapitel 4: IBM Rational Functional Tester 8.0
geschlossen und die Aufzeichnung beendet. Listing 1 zeigt den vom Tool generierten
Quelltext.
Abbildung 3: Webseite mit HTML-Elementen
1 public class TestLoginSite extends TestLoginSiteHelper {
2 public void testMain(Object[] args) {
3
startApp("http://localhost:1203/WebApp/login.aspx");
4
5
// Document: Anmeldung: http://localhost:1203/WebApp/login.aspx
6
text_user().click(atPoint(36,13));
7
browser_htmlBrowser(document_anmeldung(),DEFAULT_FLAGS).
8
inputKeys("admin");
9
10
text_pass().click(atPoint(32,10));
11
browser_htmlBrowser(document_anmeldung(),DEFAULT_FLAGS).
12
inputChars("123");
13
14
button_anmeldensubmit().click();
15
16
// Document: Haupseite: http://localhost:1203/WebApp/main.aspx
17
html_loginMessage().performTest(LoginMessage_textVP());
18
browser_htmlBrowser(document_haupseite(),MAY_EXIT).close();
19 }
20 }
Listing 1: Generiertes RFT-Testskript
Es lässt sich erkennen, dass die HTML-Textfelder und der HTML-Button im Skript
entsprechende Testobjekte besitzen. Bspw. wird über den Aufruf der Methode
text_user() das Testobjekt zurückgeliefert, das dem Benutzertextfeld entspricht;
sie ist in der Hilfsklasse TestLoginSiteHelper implementiert, die zusätzlich zum
Testskript generiert wird. Um das Testobjekt mit seinem entsprechenden GUI-Element
zu verknüpfen, greift sie intern auf die GUI-Map zurück. Alle Testobjekte im Skript
sind Instanzen der Basisklasse TestObject, die grundlegende Methoden für den
21
Kapitel 4: IBM Rational Functional Tester 8.0
Zugriff auf Objekte der laufenden Anwendung bereitstellen, wie getProperty zur
Abfrage bestimmter Eigenschaften oder performTest zum Testen von Prüfpunkten.
Testobjekte, die sich auf Standardoberflächenelemente beziehen, sind Instanzen der
Unterklasse GuiTestObject, die es ermöglicht, low-level-Events durch Aufruf von
click(), mouseMove(Point pt), etc. zu feuern. Zum Aufruf höherwertiger,
abstrakterer Ereignisse müssen die Objekte von einem spezielleren Typ sein.
TextGuiTestObject stellt bspw. für Textfelder die Methode setText bereit, die
direkt den Text im Feld verändert, ganz ohne Simulation von Tastatureingaben. Auch
Prüfpunkte sind im Skript über Objekte definiert und können mit Wizards editiert
werden. Der Prüfpunkt LoginMessage_textVP in Zeile 17 beinhaltet z.B. die
Information, dass das Datum „Sie sind angemeldet!“ vom Typ „Text“ mit der
entsprechenden Eigenschaft eines Testobjekts verglichen werden soll. Das Testobjekt
ist in diesem Fall der HTML-Text html_loginMessage. Prüfpunkte können in
dieser Form mehrfach verwendet werden und verkürzen das Testskript erheblich.
Allerdings geht so im Gegensatz zu im Skript formulierten Vergleichen mit Hilfe von
if-Anweisungen bei schlecht gewählten Prüfpunktbezeichnungen gegebenenfalls
Aussagekraft verloren.
4.3 Verhalten bei Oberflächenänderungen
Unter dem Namen ScriptAssure bewirbt IBM ein Feature des RFT, das den
Anpassungsaufwand des Testskripts bei Änderung der Benutzeroberfläche verringern
bzw. gänzlich vermeiden soll. Eine geringe Änderung an einem GUI-Element kann
dazu führen, dass es nicht mehr anhand der vorgegebenen Attribute erkannt wird, so
dass Testläufe abgebrochen werden und die Testskripte nachbearbeitet werden müssen.
Um diesem Problem entgegenzuwirken, wird im RFT deshalb für jede Eigenschaft
zusätzlich eine Gewichtung definiert, die angibt, was für eine Rolle sie bei der Suche
nach dem Element spielt [IBM08].
Anhand des in Kapitel 4.2 vorgestellten Testfalls soll nun skizziert werden, wie hoch
der tatsächliche Anpassungsaufwand des Testskripts in Listing 1 unter Einsatz dieses
Features
ist,
wenn
die
Benutzeroberfläche
modifiziert
wird.
Neben
dieser
Webanwendung wird der Aufwand auch für eine baugleiche Java-Swing-Anwendung
22
Kapitel 4: IBM Rational Functional Tester 8.0
analysiert, um mögliche Verhaltensunterschiede bei verschiedenen Oberflächenarten
aufzudecken.
Umbenennung der Elemente
Bei Änderung des Namens des Benutzertextfeldes stoppt das Tool direkt und meldet,
dass das zu text_user() gehörende Oberflächenelement nicht gefunden wurde. In
das Testskript können jedoch komfortabel neue Testobjekte eingefügt werden, ohne den
Testfall erneut aufzuzeichnen; ersetzt man alle Vorkommnisse von text_user()
durch den Namen des neuen Testobjektes, ist das Skript wieder lauffähig. Eine
Alternative dazu ist die Erweiterung der Erkennungseigenschaften von HTML-, bzw.
Swing-Textfeldern. Da bei Umbenennungen keine Layouteigenschaften eines Elements
verändert werden, bietet es sich an, die Elementposition als weiteres Merkmal schon vor
der Skriptaufzeichnung in der GUI-Map zu definieren. Misst man mittels ScriptAssure
dem Elementnamen ein geringes und der Position ein hohes Gewicht bei, so ist die
Elementposition das auschlaggebende Erkennungsmerkmal für ein Element. Das
Benutzertextfeld kann so erfolgreich identifiziert werden und das Skript ohne
Änderungen
ausgeführt
werden.
Allerdings
erscheint
im
Testprotokoll
die
Warnmeldung, dass die Objekterkennung für das Textfeld schwach ist.
Verschiebung der Elemente
Bei Layoutänderungen, in denen Elemente an eine anderen Position verschoben oder
anders skaliert wurden, ist der Anpassungsaufwand aufgrund der objektorientierten
Ausführung relativ gering. Hier verfolgt man die gegenteilige Strategie bei der
Gewichtung der Erkennungsmerkmale; Layouteigenschaften bekommen ein sehr
geringes
Gewicht,
andere
Eigenschaften
wie
der
Elementname
oder
die
Elementbeschriftung ein hohes. Java-Swing-Elemente können innerhalb eines Fensters
oder Frames problemlos verschoben und skaliert werden. Auch ein Verschieben eines
Elements aus einem Swing-Container, wie bspw. einem Panel, in einen anderen
erfordert keinerlei Skriptanpassungen. Auf HTML-Oberflächen werden die Elemente
allerdings nur wiedererkannt, wenn sie durch ihre Verschiebung noch im selben
übergeordneten Element, wie einem <div>-Block oder einer Tabelle liegen. Im obigen
Beispiel liegen alle Elemente in einer Tabelle. Wird bspw. das Passworttextfeld unter
den Anmelden-Button verschoben, befindet es sich außerhalb dieser Tabelle. Die
23
Kapitel 4: IBM Rational Functional Tester 8.0
Testausführung wird abgebrochen. Die GUI-Map muss nachträglich manuell bearbeitet
werden.
Änderung der Ereignissequenz
Bei Änderung der Ereignisabfolge muss in jedem Fall das Testskript angepasst werden.
Durch Hinzufügen eines dritten Textfeldes unter das Passwortfeld ändert sich die
Ereignisabfolge, da nun vor dem Login z.B. zusätzlich ein Sicherheitscode angegeben
werden muss. Deshalb muss vor Zeile 14 in Listing 1 weiterer Quelltext eingefügt
werden. Dazu gibt es zwei Möglichkeiten. Zum einen gibt es die Option ein Testobjekt
für ein GUI-Element im Skript über einen Wizard zu erstellen, mit dem man manuell
die Aktionen programmiert. Daneben gibt es die Möglichkeit mit Hilfe der DebuggingFunktion die Testdurchführung in Zeile 14 durch einen Haltepunkt zu stoppen und ab
diesem Punkt eine Aufzeichnung zu starten, bei der eine Eingabe in das dritte Textfeld
stattfindet. Der zugehörige Quelltext wird dann automatisch vor der Zeile platziert. Der
Anpassungsaufwand ist im Vergleich zur Objektverschiebung oder Umbenennung
höher. Allerdings muss bei Änderung der Ereignisfolge nicht das gesamte Testskript
erneut aufgenommen werden, da die Testausführung bis zu der Stelle in der Anwendung
läuft, in der die neue Ereignisfolge beginnt und ein alter Testskriptbereich durch
Aufnahme eines neuen ersetzt werden kann.
24
Kapitel 5: Resümee und Fazit
5 Resümee und Fazit
Das Testen von Benutzeroberflächen ist mit einigen Problemen behaftet. Die Vielzahl
der zu testenden möglichen Interaktionsfolgen und Eingabewerte, die stetige
Modifikation der Oberfläche zur Entwicklungszeit und der Test auf unterschiedlichen
Plattformen macht das manuelle Testen sehr zeit- und kostenaufwendig. Aus diesem
Grund gibt es mittlerweile eine große Zahl von kommerziellen und freien GUI-Testtools
auf dem Markt, die den Aufwand durch Automatisierung der Testdurchführung
verringern sollen, so dass vor allem Regressionstest schnell ausgeführt werden können.
Zur Beschreibung der Tools wurden die allgemeinen Merkmale und Verfahren
vorgestellt und dann anhand des Rational Functional Testers 8.0, eines der führenden
Tools im Bereich von Oberflächentests, konkretisiert. Daneben wurde gezeigt, wie in
dem Tool Testfälle mit der Capture-Replay-Methode erstellt werden und es sich
gegenüber Änderungen der Oberfläche verhält. Eine der Stärken des Tools ist dabei
sicherlich die Möglichkeit Erkennungsmerkmale von GUI-Elementen gewichten zu
können. So ist es möglich, Elemente zu verschieben oder umzubenennen, ohne dass
Testskripte nachträglich angepasst werden müssen. Allerdings zeigt das Tool bei
Layoutänderungen von HTML-Oberflächen Schwächen, die bspw. mit dem frei
erhältlichen Web-Testtool Selenium IDE nicht auftreten, so dass man hier nicht ganz
ohne Nachbearbeitungen auskommt. Ändert sich durch die Oberflächenmodifikation die
Ereignisfolge, bietet der RFT den Vorteil leicht weitere Teilaufnahmen der neuen
Ereignisfolge in das Skript zu integrieren, so dass sich der Anpassungsaufwand in
Grenzen hält. Neben der automatisierten Ausführung trägt auch die Möglichkeit
datengetriebene Tests durchzuführen dazu bei, dass der Testprozess schneller und
fallabdeckender durchgeführt werden kann. Die große Auswahl an prüfbaren
Elementeigenschaften ermöglicht zudem auch robuste nicht-funktionale Layouttests
durchzuführen. Insgesamt gesehen trägt das Tool somit sicherlich zu einem
effizienteren Test von Benutzeroberflächen bei und bietet sinnvolle Features zur
Aufwandsreduzierung, die nach Recherche in alternativen Tools nicht ausfindig zu
machen waren.
Allerdings müssen alle denkbaren Interaktionsmöglichkeiten der Oberfläche getestet
werden, um die Software vor unerwarteter Bedienung zu schützen. In vielen GUI25
Kapitel 5: Resümee und Fazit
Testtools wie dem RFT muss deshalb die Aufzeichnung eines Testfalls für alle
Bedienungskombinationen wiederholt werden, was den Aufwand stark erhöht; Deshalb
wird an Verfahren geforscht, die nicht nur die Testdurchführung eines Skripts, sondern
die Skripterstellung selbst automatisieren.
26
Kapitel 0: Literaturverzeichnis
Literaturverzeichnis
[FG99]
Fewster, M., Graham, D.: Software Test Automation. ACM Press, AddisonWesley, 1999.
[FK07]
Franz, K.: Handbuch zum Testen von Web-Applikationen. Testverfahren,
Werkzeuge, Praxistipps. Springer Verlag, 2007.
[FS08]
Wikipedia: Fenstersystem, URL:
http://de.wikipedia.org/wiki/Fenstersystem, Abrufdatum: 27.10.2008
[GBO08] Wikipedia: Grafische Benutzeroberfläche, URL:
http://de.wikipedia.org/wiki/Grafische_Benutzeroberflaeche, Abrufdatum:
27.10.2008.
[GST08]
Wikipedia: GUI software testing, URL:
http://en.wikipedia.org/wiki/GUI_software_testing, Abrufdatum: 2.11.2008.
[HD08]
Hoffman, D.W.: Software-Qualität. Springer Verlag, 2008
[IBM08]
IBM: Rational Functional Tester – Components, URL:
http://www-01.ibm.com/software/awdtools/tester/functional/sa.html,
Abrufdatum: 1.12.2008.
[KL94]
Kepple, L.R.: The black art of GUI testing. Dr. Dobb's Journal of Software
Tools, 19(2): 40, Feb. 1994.
[LD08]
Linz, T., Daigl, M.: How to Automate Testing of Grahical User Inferfaces.
Results of the ESSI PIE 24306, URL:
http://www.imbus.de/forschung/pie24306/gui/aquis-full_paper-1.3.shtml,
Abrufdatum 28.10.2008.
[LW05]
Li, K., Wu, M.: Effective GUI Test Automation. Developing an Automated
GUI Testing Tool. Sybex Verlag, 2005.
[PG97]
Gerrad, P.: Testing GUI Applications, URL:
http://www.gerrardconsulting.com/GUI/TestGui.html, Abrufdatum:
27.10.2008.
[PP04]
Pomberger, G., Pree, W.: Software Engineering. Architektur-Design und
Prozessorientierung. Hanser Verlag, 2004.
[PZ08]
Zembrod, P.: GUI Testing: Don’t Sleep Without Synchronisation, URL:
http://googletesting.blogspot.com/2008/10/gui-testing-dont-sleepwithout.html, Abrufdatum: 29.10.2008
[SC05]
Steinweg, C.: Management der Software-Entwicklung. Vieweg Verlag,
2005.
27
Kapitel 0: Literaturverzeichnis
[SL05]
Spillner, A., Linz,T.: Basiswissen Software Test. Dpunkt Verlag, 2005.
[SW02]
Sneed, H.M., Winter, M.: Testen objektorientierter Software. Das
Praxisbuch für den Test objektorientierter Client/Server-Systeme. Hanser
Verlag, 2002.
[TG02]
Thaller, G. E.: Software-Test. Verifikation und Validation. 2. Auflage. Heise
Verlag, 2002.
28