6. Test von Software mit Nutzungsoberflächen



Ähnliche Dokumente
Test von Oberflächen. 6. Test von Software mit Nutzungsoberflächen. Erinnerung: GUI-Aufbau mit Swing. Achtung: Swing und Threads

7. Test von Software mit Nutzungsoberflächen

Testen von graphischen Benutzeroberflächen. 26. Juni 2013

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

Java: Vererbung. Teil 3: super()

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

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

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

Testen von graphischen Benutzeroberflächen. 24. Juni 2015

Einstieg in die Informatik mit Java

GUI Programmierung mit JAVA Swing

eduvote Ein Umfragesystem für Lehrveranstaltungen - PowerPoint Add-In -

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Innere Klassen in Java

Programmierkurs Java

Benutzeroberflächen. Java Teil 4

2A Basistechniken: Weitere Aufgaben

Beispiel: DB-Mock (1/7)

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

Objektorientierte Software-Entwicklung

1. Einführung. 2. Weitere Konten anlegen

Software-Engineering und Optimierungsanwendungen in der Thermodynamik

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

SEP 114. Design by Contract

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

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Swing Lernen am Code Teil 1

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 17: 3-Schichten-Architektur 2

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Einführung in die Programmierung

Objektorientierte Programmierung

Client-Server-Beziehungen

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

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

25 Import der Beispiele

Objektorientierte Programmierung

Hochschule der Medien Prof. Uwe Schulz 14. Juli 2010 Klausur Informatik, EDV-Nr Seite 1 von 5. Teil 2: Aufgaben

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Programmieren in Java

virtuos Leitfaden für die virtuelle Lehre

1. Fehlende Zugriffsrechte für die Verwendung der VR -NetWorld Software

Task: Nmap Skripte ausführen

Software Engineering Klassendiagramme Assoziationen

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Klausur zur Einführung in die objektorientierte Programmierung mit Java

Grafische Benutzeroberflächen mit Swing

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

TTS - TinyTimeSystem. Unterrichtsprojekt BIBI

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Programmiertechnik II

Karten-Freischaltung mit dem UNLOCK MANAGER

Inhaltserzeichnis. Datenübernahme

MSDE 2000 mit Service Pack 3a

PC-Kaufmann 2014 Neues Buchungsjahr anlegen

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Test-Driven Design: Ein einfaches Beispiel

DOKUMENTATION VOGELZUCHT 2015 PLUS

Java Kurs für Anfänger Einheit 5 Methoden

Rillsoft Project - Installation der Software

GUI Programmierung in Java

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Einführung in die Programmierung für Wirtschaftsinformatik

support Kurzanleitung Kunde Version 5.1.1

Lokale Installation von DotNetNuke 4 ohne IIS

Das Handbuch zu KNetAttach. Orville Bennett Übersetzung: Thomas Bögel

Betriebshandbuch. MyInTouch Import Tool

Whitebox-Tests: Allgemeines

Installation von Office 365 auf einem privaten PC

Step by Step Webserver unter Windows Server von Christian Bartl

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Einführung in die Informatik Tools

Erstellen einer digitalen Signatur für Adobe-Formulare

Historical Viewer. zu ETC5000 Benutzerhandbuch 312/15

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

Ordner Berechtigung vergeben Zugriffsrechte unter Windows einrichten

Sich einen eigenen Blog anzulegen, ist gar nicht so schwer. Es gibt verschiedene Anbieter. ist einer davon.

Neue Steuererklärung 2013 erstellen

Arrays von Objekten. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Geben Sie in dem offenen Suchfeld den Namen Ihrer Einrichtung ein und klicken Sie auf Suchen.

Integrierte und automatisierte GUI-Tests in Java

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

Zentrale Installation

Neue Funktionen im GUI für PC-DMIS V3.x 4.x Seite 1 von 8

Software WISO Hausverwalter 2014 Datenübernahme aus WISO Mein Geld Version / Datum V 1.0 /

Installation OMNIKEY 3121 USB

WebService in Java SE und EE

Summenbildung in Bauteiltabellen mit If Then Abfrage

1 Einleitung. Lernziele. Symbolleiste für den Schnellzugriff anpassen. Notizenseiten drucken. eine Präsentation abwärtskompatibel speichern

Lehrer: Einschreibemethoden

Übungen zur Softwaretechnik

Step by Step Softwareverteilung unter Novell. von Christian Bartl

Probeklausur Softwareengineering SS 15

Einen Wiederherstellungspunktes erstellen & Rechner mit Hilfe eines Wiederherstellungspunktes zu einem früheren Zeitpunkt wieder herstellen

lññáåé=iáåé===pìééçêíáåñçêã~íáçå=

Technische Hochschule Georg Agricola WORKSHOP TEIL 3. IKT (Informations- und Kommunikationstechnik) an einer MorseApp erklärt

Transkript:

6. Test von Software mit Nutzungsoberflächen Ansätze zum Oberflächentest Erinnerung: GUI-Aufbau mit Swing Einführung in FEST Systematische Nutzung von FEST Teststrategien Capture & Replay Vorstellung von Marathon Vorstellung Sikuli Stephan Kleuker 228

Test von Oberflächen Grundsätzlich sind Oberflächen gewöhnliche SW-Module und können wie diese getestet werden Variante 1: Direkte Ausführung von GUI-Aktionen über Testsoftware Allerdings: Für xunit-werkzeuge ist der Zugriff auf Oberflächen teilweise schwierig (xunitmuss auf Oberflächenkomponenten zugreifen und diese bedienen können, JButton in Java hat z.b. Methode doclick() ()) folgende Folien: FEST (FixturesforEasy Software Testing, http://code.google.com/p/fest/), hier GUI-Anteil Variante 2: Das Werkzeug zeichnet alle Mausbewegungen und Tastatureingaben auf, die können dann zur Testwiederholung erneut abgespielt werden (später) Stephan Kleuker 229

Erinnerung: GUI-Aufbau mit Swing Viele elementare GUI-Bausteine (JLabel, JButton, JSlider, JTable, JColorChooser,...) Bausteine werden in GUI-Komponenten zusammengefasst Zusammenfassung typisch in JPanel Jede Zusammenfassung hat LayoutManager, der Anordnung der einzelnen Komponenten berechnet Komponenten können in Komponenten geschachtelt werden; äußere Komponente hat wieder LayoutManager konsequentes Schachtel-in-Schachtel-Prinzip GUI-Baustein nutzt Model-Delegate-Prinzip; zu jeder Komponente gibt es Model-Objekt, dass Eigenschaften speichert GUI-Bausteine mit vielen get-/set-methoden konfigurierbar Stephan Kleuker 230

Achtung: Swing und Threads Swing-Objekte wie JFrame-Objekte können direkt gestartet werden Event-Verwaltung findet in unabhängigen Prozessen statt (genauer: Threads -> Betriebssysteme) Problem: Komponenten reden mit noch nicht erzeugten Komponenten ( -> NullPointerException) javax.swing.swingutilities.invokelater(new Runnable() { public void run() { ); new MeineGUI(); Stephan Kleuker 231

Minibeispiel: Klickzähler (1/3) Zählt Links- und Rechtsklicks des Knopfes Für Test notwendig (bzw. sehr sinnvoll), GUI-Elemente haben Namen JFrame GridLayout(0,2) JFrame JButton JPanel JLabel JLabel JButton klick JLabel links JLabel rechts GUI immer hierarchisch organisiert JPanel GridLayout(0,2) Stephan Kleuker 232

Minibeispiel: Klickzähler (2/3) public class Klicker extends JFrame implements MouseListener{ private JButton klick = new JButton("klick misch"); private JLabel links = new JLabel("0"); private JLabel rechts = new JLabel("0"); public Klicker(){ setlayout(new GridLayout(0,2)); setname("klicker"); JPanel tmp = new JPanel(); tmp.setlayout(new GridLayout(0,2)); tmp.add(links); links.setname("links"); tmp.add(rechts); rechts.setname("rechts"); add(klick); klick.setname("klick"); klick.addmouselistener(this); add(tmp); setdefaultcloseoperation(exit_on_close); pack(); setvisible(true); Stephan Kleuker 233

Minibeispiel: Klickzähler (3/3) public static void main(string[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { new Klicker(); ); @Override public void mouseclicked(mouseevent e) { JLabel ziel=null; if(e.getbutton()==1) ziel=links; else if(e.getbutton()==3) ziel=rechts; if(ziel!=null) ziel.settext(""+(integer.parseint(ziel.gettext())+1)); @Override public void mouseentered(mouseevent arg0) { @Override public void mouseexited(mouseevent arg0) { @Override public void mousepressed(mouseevent arg0) { @Override public void mousereleased(mouseevent arg0) { Stephan Kleuker 234

Test des Minibeispiels (1/3) public class KlickerTest { private FrameFixture gui; @BeforeClass public static void setuponce() { // für Event-Verwaltung FailOnThreadViolationRepaintManager.install(); @Before public void setup() { // für Event-Verwaltung Klicker k = GuiActionRunner.execute( new GuiQuery<Klicker>() { protected Klicker executeinedt() { return new Klicker(); ); gui = new FrameFixture(k); // gui.robot.settings().delaybetweenevents(3000); // gui.show(); // nicht immer erforderlich Stephan Kleuker 235

Test des Minibeispiels (2/3) @After public void teardown() { gui.cleanup(); @Test public void testeinlinksklick(){ gui.button("klick").click(); Assert.assertEquals(gui.label("links").text(), "1"); Assert.assertEquals(gui.label("rechts").text(), "0"); @Test public void testrechtsklick(){ gui.button("klick").click(mousebutton.right_button); Assert.assertEquals(gui.label("links").text(), "0"); Assert.assertEquals(gui.label("rechts").text(), "1"); Stephan Kleuker 236

Test des Minibeispiels (3/3) @Test public void testkeinelinksundrechtsklicks(){ gui.button("klick").click(mousebutton.middle_button); gui.button("klick").pressandreleasekey( KeyPressInfo.keyCode(KeyEvent.VK_C)); Assert.assertEquals(gui.label("links").text(), "0"); Assert.assertEquals(gui.label("rechts").text(), "0"); @Test public void testvielelinksundrechtsklicks(){ gui.button("klick").doubleclick(); gui.button("klick").pressandreleasekey( KeyPressInfo.keyCode(KeyEvent.VK_SPACE)); for(int i=0;i<10;i++) gui.button("klick").click(mousebutton.right_button); Assert.assertEquals(gui.label("links").text(), "2"); Assert.assertEquals(gui.label("rechts").text(), "10"); Stephan Kleuker 237

Analyse des Minibeispiels Einiger konstanter Aufwand um Eventverwaltung zu organisieren einfacher Zugriff auf GUI-Elemente wg. setname(.)-werten FrameFixture-Objekt erlaubt Zugriff auf (fast) alle Arten von GUI-Elementen, die über Namen identifiziert werden gui.button("klick") Jedes Fixture-Objekt bietet (fast) alle Möglichkeiten zur Bedienung an click(mousebutton.middle_button); Fixture-Objekte haben Methoden zur Eigenschaftsabfrage gui.label("rechts").text() Stephan Kleuker 238

Fest und JUnit 4 - Installation benötigte Bibliotheken (bei fest-swing mitgeliefert) Stephan Kleuker 239

FEST erkennt Probleme: Schreipfehler gui.button("klack").click(mousebutton.right_button); Stephan Kleuker 240

FEST erkennt Probleme: nicht sichtbarer Knopf (1/2) public class Tapps extends JFrame { public Tapps(){ JTabbedPane jt = new JTabbedPane(); jt.setname("tabbed"); for(int i=1;i<=3;i++){ JButton jb= new JButton("Tubbi "+i); jb.setname("tub"+i); jt.add(jb); add(jt); pack(); setvisible(true); Stephan Kleuker 241

FEST erkennt Probleme: nicht sichtbarer Knopf (2/2) @Test public void testtabwechsel(){ gui.tabbedpane("tabbed").selecttab("tub2"); gui.button("tub2").rightclick(); @Test public void testtabwechsel2(){ gui.tabbedpane("tabbed").selecttab("tub3"); gui.button("tub2").rightclick(); Stephan Kleuker 242

Spezifikation Tarifrechner (1/2) Zu entwickeln ist ein kleines Programm zur Berechnung von Tarifen im Nahverkehr. Grundlage der Entwicklung ist folgende Spezifikation zur Tarifberechnung, die insgesamt vier Parameter berücksichtigt. Der erste Parameter steht für die Anzahl der zu fahrenden Zonen, der zweite für das Alter, der dritte für die Uhrzeit (die Stunde) und der vierte bestimmt, ob es sich um einen Betriebszugehörigen handelt oder nicht. Der Preis wird wie folgt berechnet: Jede Zone kostet 130, Personen unter 14 und über 64 zahlen 40 weniger, von 9-14.59 Uhr ist der Preis um die Hälfte reduziert, Betriebszugehörige (und deren Angehörige) zahlen 150 weniger, allerdings wird der 9-14.59 Uhr-Tarif nicht zusätzlich berücksichtigt. Es soll aber immer der günstigste Preis (entweder/oder) ausgeben werden. Der minimale Ticketpreis ist mit 30 festgelegt. Stephan Kleuker 243

Spezifikation Tarifrechner (2/2) xzonen 130*x Alter<14 oder Alter>64-40 9-14.59Uhr,nichtzumBetrieb -50% nicht 9-14.59 Uhr, zum Betrieb -150 9-14.59, zum Betrieb - 50% oder-150 Minimum: 30 Beispiel: ein 13-jähriger Betriebszugehöriger fährt 3 Zonen um 10 Uhr Alternative 1: ((130*3) -40) /2 = 175 Alternative 2: (130*3) -40-150 = 200 Der Preis beträgt 175. Stephan Kleuker 244

Spezifikation Äquivalenzklassen Nummer 1 2 3 4 5 (0) (0) (0) (0) Klassen (1o) (2u) (2o) (3u) (4o) (5u) (5o) (6u) (9) (7) (8) (7) (8) Zonen 1 2 1 2 Hai Alter 13 14 64 65 64 Uhrzeit 8 9 14 15 15 Betrieb true false true false false Ergebnis 30 130 30 220 130 Alter: (1) alter<14 (2) alter>=14 && alter<=64 (3) alter>64 Uhrzeit: (4) uhr<9 (5) uhr>=9 && uhr<15 (6) uhr>=15 Betriebszugehörig: (7) Ja (8) Nein Stephan Kleuker 245

Beispiel systematische FEST-Nutzung (1/7) GUI planen; festlegen der GUI-Elemente und ihrer Namen Beispiel Tarifzonen-Berechnung JButton berechnen JTextField zonen JComboBox alter JRadioButton billiguhr JRadioButton teueruhr JCheckBox zumbetrieb JTextArea preis Entwickler der Tests müssen weitere Implementierungsdetails nicht kennen (black box) Stephan Kleuker 246

Beispiel systematische FEST-Nutzung (2/7) Testarchitektur (schnelle Reaktion auf Änderungen) Stephan Kleuker 247

Beispiel systematische FEST-Nutzung (3/7) public class GUIBedienung { private FrameFixture gui; private static boolean initialisiert = false; public void initialisieren() { if(!initialisiert){ FailOnThreadViolationRepaintManager.install(); initialisiert = true; GuiTarifrechner gtf = GuiActionRunner.execute execute(new GuiQuery<GuiTarifrechner GuiTarifrechner>() { protected GuiTarifrechner executeinedt() { return new GuiTarifrechner(); ); gui = new FrameFixture(gtf gtf); Stephan Kleuker 248

Beispiel systematische FEST-Nutzung (4/7) public void beenden() { gui.cleanup(); public void zoneneingeben(string eingabe){ gui.textbox(" ("zonen zonen"). ").deletetext deletetext(); gui.textbox(" ("zonen zonen"). ").entertext entertext(eingabe eingabe); public String berechnenausfuehren(){ gui.button("berechnen"). ("berechnen").click click(); return gui.textbox("preis"). ("preis").text text(); public void alterunter14waehlen(){ gui.combobox("alter"). ("alter").selectitem selectitem("unter 14"); public void alterueber64waehlen(){ gui.combobox("alter"). ("alter").selectitem selectitem(" ("\u00fcber 64"); Stephan Kleuker 249

Beispiel systematische FEST-Nutzung (5/7) public void alter1464waehlen(){ gui.combobox("alter"). ("alter").selectitem selectitem("14 ("14-64"); public void billiguhrwaehlen(){ gui.radiobutton(" ("billiguhr billiguhr"). ").click click(); public void teueruhrwaehlen(){ gui.radiobutton(" ("teueruhr teueruhr"). ").click click(); public void zumbetriebklicken(){ gui.checkbox(" ("zumbetrieb zumbetrieb"). ").click click(); Stephan Kleuker 250

Beispiel systematische FEST-Nutzung (6/7) public void test1() { gui.zoneneingeben("1"); gui.alterunter14waehlen(); gui.teueruhrwaehlen(); gui.zumbetriebklicken(); Assert.assertTrue(gui.berechnenAusfuehren gui.berechnenausfuehren().equals equals("30 Cent")); @Test public void test2() { gui.zoneneingeben("2"); gui.alter1464waehlen(); gui.billiguhrwaehlen(); Assert.assertTrue(gui.berechnenAusfuehren gui.berechnenausfuehren().equals equals("130 Cent")); Stephan Kleuker 251

Beispiel systematische FEST-Nutzung (7/7) @Test public void test3() { gui.zoneneingeben("1"); gui.alter1464waehlen(); gui.billiguhrwaehlen(); gui.zumbetriebklicken(); Assert.assertTrue(gui.berechnenAusfuehren gui.berechnenausfuehren().equals equals("30 Cent")); @Test public void test4() { gui.zoneneingeben("2"); gui.alterueber64waehlen(); gui.teueruhrwaehlen(); Assert.assertTrue(gui.berechnenAusfuehren gui.berechnenausfuehren().equals equals("220 Cent")); Stephan Kleuker 252

Wann was Testen (1/2) Generelle Frage nach der Teststrategie bottom-up zunächst elementare Klassen, dann Klassen die darauf aufbauen nur Zusammenspiel der getesteten Objekte testen bringt sehr hohe Überdeckung, aber sehr hohen Aufwand top-down Tests von oben, typisch über Oberfläche ausführen benötigt stabiles GUI für Testwiederholung vermeintlich weniger Aufwand, weniger Expertise häufig sehr geringe Testabdeckung Stephan Kleuker 253

Wann was Testen (2/2) middle-out Tests setzen auf kleinen Gruppen von Klassen auf GUI-Tests testen Verbindungen zu Gruppen erbt anteilig Vor- und Nachteile der anderen Ansätze Variante zunächst Tests über GUI durchführen und Überdeckung messen Klassen die unter xx% überdeckt werden, dann in Richtung Überdeckungsgrenze genauer analysieren generell hängt Test-Strategie von Projektart, vorhandenen Werkzeugen und vorhandenem Know-how ab Stephan Kleuker 254

GUI-Elementsuche auch ohne setname Generell können Matcher eingesetzt werden, mit denen die nutzende GUI-Komponente bestimmt werden kann @Test public void testeinezone2() { gui.textbox(jtextcomponentmatcher.withname("zonen").andtext("0")).deletetext(); gui.textbox("zonen").entertext("1"); GenericTypeMatcher<JButton> textmatcher = new GenericTypeMatcher<JButton>(JButton.class) { @Override protected boolean ismatching(jbutton button) { return "Berechnen".equals(button.getText()); ; gui.button(textmatcher).click(); Assert.assertEquals(gui.textBox("preis").text(), "90 Cent"); Stephan Kleuker 255

Start von Programmen über main (1/2) statt Objekt direkt zu nutzen, kann auch Programmstart über main genutzt und Fenster später gesucht werden public static void main(final String[] args) { javax.swing.swingutilities.invokelater(new Runnable() { public void run() { Klicker k= new Klicker(); if (args.length>0) k.settitle(args[0]); ); Stephan Kleuker 256

Start von Programmen über main (2/2) @Test public void testeinlinksklick2(){ ApplicationLauncher.application("klicker.Klicker").withArgs("Hai","Wo").start(); FrameFixture frame = WindowFinder.findFrame( new GenericTypeMatcher<JFrame>(JFrame.class) { protected boolean ismatching(jframe frame) { return "Hai".equals(frame.getTitle()) && frame.isshowing(); ).using(gui.robot); frame.button("klick").click(); Assert.assertEquals(frame.label("links").text(), "1"); Assert.assertEquals(frame.label("rechts").text(), "0"); Stephan Kleuker 257

Fotos von Fehlersituationen (1/2) Weitere Bibliotheken nutzen @RunWith(GUITestRunner.class) public class KlickerTest { // wie sonst auch @GUITest @Test public void testeinlinksklickmitmacke(){ gui.button("klick").click(); Assert.assertEquals(gui.label("links").text(), "1"); Assert.assertEquals(gui.label("rechts").text(), "1"); Stephan Kleuker 258

Fotos von Fehlersituationen (2/2) Werkzeug macht Screenshot (des gesamten Bildschirms) Stephan Kleuker 259

Variante: Bildschirmfotos erstellen lassen auch für einzelne Komponenten möglich @Test public void testmachscreenshot(){ ScreenshotTaker st= new ScreenshotTaker(); gui.button("klick").rightclick(); st.savedesktopaspng("rechtsklick.png"); Assert.assertEquals(gui.label("rechts").text(), "1"); Stephan Kleuker 260

Kritische Analyse von Fest Vorteile relativ einfache Programmierung; Zugang sehr intuitiv Tests können ohne weitere Werkzeuge in JUnit umgesetzt werden leichte GUI-Änderungen (Layout) benötigen keine Teständerungen Nachteile Entwickler müssen konsequent setname() nutzen (ok mit Coding-Guidelines) Testentwicklung bei Capture & Replay schneller Tester müssen Java können generelles zentrales Problem: Änderungen des GUIs können zu aufwändigen Teständerungen führen Stephan Kleuker 261

Capture & Replay Variante 2: Grundidee: Das Werkzeug zeichnet alle Mausbewegungen und Tastatureingaben auf, die können dann zur Testwiederholung erneut abgespielt werden Typisch ist, dass der Nutzer die aufgezeichneten Skripte modifizieren kann (z. B. Test von berechneten Daten) Tools können teilweise auch Oberfläche lesen (Frage ob Texte richtig ausgegeben), Snapshots vergleichen professionelle Beispiele: Winrunner von HP (früher Mercury), VisualTest von IBM-Rational Stephan Kleuker 262

Kurzvorstellung Marathon Open Source: http://www.marathontesting.com/home.html Marathon erlaubt die Aufzeichnung und Wiedergabe von Swing-, AWT- und Applet-basierten Oberflächen Aufzeichnungen erfolgen in Skriptsprache (Jython, JRuby) Zusicherungen und weitere Analysen werden ebenfalls in dieser Skriptsprache ergänzt Werkzeug erlaubt Erstellung einfacher Zusicherungen ohne Skriptsprachenkenntnisse Details auch unter: http://home.edvsz.fhosnabrueck.de/skleuker/querschnittlich/seu.pdf Stephan Kleuker 263

Marathon-Beispiel (1/9) - Projektkonfiguration anlegen des Arbeitsverzeichnisses(nie gleich Eclipseprojekt-Ordner!!!) Start später mit Select Projektname genutzte Skript-Sprache Stephan Kleuker 264

Marathon-Beispiel (2/9) Projektkonfiguration (2/3) Auswahl: Default Launcher Startklasse mit main ganzer Pfad Verzeichnis für Programmstart z. B. bin-verzeichnis des Eclipse-Projekts Stephan Kleuker 265

Marathon-Beispiel (3/9) Projektkonfiguration (3/3) Object Lookup: Use Object Map Startmöglichkeit testen, dann speichern Stephan Kleuker 266

Marathon-Beispiel (4/9) Start einer Aufnahme Stephan Kleuker 267

Marathon-Beispiel (5/9) - Aufnahme Aufnahme immer hier beenden Stephan Kleuker 268

Marathon-Beispiel (6/9) resultierendes Skript Zusicherung manuell ergänzt assert_p('<name des GUI-Elements>', '<Property>', '<erwarteter Wert>') Property aus Java-Bean (mit get und set bearbeitbar) Stephan Kleuker 269

Marathon-Beispiel (7/9) Ausführen des Skripts falls zu testendes Programm noch läuft, immer über diesen Knopf beenden Stephan Kleuker 270

Marathon-Beispiel (8/9) Aufnahme mit Zusicherung während Aufnahme: Strg+Rechtsklickauf zu untersuchendes Element Assertion auswählen Stephan Kleuker 271

Marathon-Beispiel (9/9) - Beispielskript #{{{ Marathon from default import * # Marathon def test(): set_java_recorded_version(" ("1.7.0_30 1.7.0_30") if window('tarifrechner'): click(' ('lbl:zonen lbl:zonen: : ') select(' ('zonen zonen', '1') select('alter', '14-64') select(' ('billiguhr billiguhr', 'true true') select(' ('zumbetrieb zumbetrieb', 'true true') click('berechnen') assert_p('preis', 'Text', '30 Cent') close() pass Stephan Kleuker 272

Weitere Marathon-Features Festlegung von Test-Fixtures, die beschreiben was vor und nach Tests immer ausführt werden soll Module, Programmstücke, die in andere Skripte eingebaut werden können und so eine Strukturierung der Testfälle ermöglichen Nutzung eines Debuggers, um ab einem Breakpoint die Ausführung Schritt für Schritt erfolgen zu lassen und ggfls. Objektwerte zu verändern Stephan Kleuker 273