Logo QF-Test

Tutorial zur praktischen Einführung
in QF-Test

 

Gratis Testen  Download  Kaufen

Yann Spöri, QF-Test Entwicklung & Support

Die Beispiele, Demos und praktischen Übungen zu QF-Test verhelfen zu einem schnellen Start.

Yann Spöri,
Software Engineer, QFS

Uwe Klüh, Senior Sales Manager, QFS

Durchsuchen Sie die gesamte Dokumentation (Handbuch, Tutorial, Mailingliste, Standardbibliothek), indem Sie die Suchfunktion der Homepage nutzen.

Uwe Klüh, Sr. Sales Manager, QFS

Tutorial

7
Die Standardbibliothek [30-45 Min]

Wir vervollständigen das Konzept der Modularisierung in diesem Kapitel, indem wir eine Standardbibliothek mit Hilfsfunktionen vorstellen. Mit einigen der Hilfsmitteln, wie Operationen für Kontrollkästchen, sind Sie bereits vertraut. Andere Hilfsmittel werden für Sie neu sein. Die folgenden Abschnitte behandeln jede dieser Operationen im Detail.

Es gibt verschiedene Dinge in diesem Kapitel zu lernen. Als Wichtigstes werden wir eine verwendbare Hilfsbibliothek begutachten (tatsächlich leitet sich die besprochene Bibliothek von einer Version ab, die innerhalb von Quality First Software GmbH für Regressionstests von QF-Test verwendet wird). Im Prozess des Analysierens der enthaltenen Operationen werden sich Ihnen vielleicht auch Ideen aufdrängen, wie Sie Ihre eigenen Testsuiten besser modularisieren und den ganzen Testprozess vereinfachen können.

Die Prozeduren in der Bibliothek sollten mit allen Standard- JavaFX, Java/Swing, Eclipse/SWT und den meisten Web Applikationen arbeiten, d.h. sie sind unabhängig von einem bestimmten SUT entwickelt worden. Deshalb sollten sie sich auch problemlos mit Ihrem SUT einsetzen lassen. Die Bibliothek ist in der Datei qfs.qft enthalten und ist Teil der QF-Test Distribution.

Um die Bibliothek qfs.qft in Ihre Testsuite einzubinden, klicken Sie auf den "Testsuite" Wurzelknoten Ihrer Suite. Unter den Attributen dieses Knotens sehen Sie eine Tabelle für "Include Dateien". Fügen Sie zu dieser Liste nun die Bibliothek qfs.qft hinzu, falls diese noch nicht enthalten sein sollte. Eine Pfadangabe ist nicht notwendig, da das include Verzeichnis von QF-Test automatisch im Bibliothekspfad (siehe auch Referenzteil des Handbuchs) enthalten ist. Nun können Sie bei jedem Prozeduraufruf auch Prozeduren aus dieser Bibliothek auswählen.

Zusätzlich zur folgenden Beschreibung der Standardbibliothek innerhalb des Tutorials gibt es eine HTML-Dokumentation in einem javadoc ähnlichen Format. Die Datei heisst qfs.html und liegt im Verzeichnis qftest-4.1.6/include.

7.1
Das SUT zum Testen

Wie gesagt, die vorgestellte Standardbibliothek ist SUT unabhängig. Jedoch werden wir zu ihrer Demonstration ein SUT verwenden, das genau für diesen Zweck entwickelt wurde.

Öffnen Sie die Testsuite StdLibDemo.qft. Sie befindet sich im Verzeichnis qftest-4.1.6/doc/tutorial Ihrer QF-Test Installation, dort wo auch das aus früheren Kapiteln bereits bekannte Options.qft liegt. Nun sollten Sie das Folgende sehen:

Abbildung 7.1:  Die Testsuite StdLibDemo.qft

Starten Sie die SUT Applikation durch Ausführen des gezeigten Knotens "Vorbereitung: Start the application". Einige Augenblicke später sollte das Fenster des SUTs erscheinen - falls nicht, versteckt es sich vermutlich hinter der Testsuite.

Abbildung 7.2:  Das SUT zum Testen der Standardbibliothek
7.2
Die Standardbibliothek

Öffnen Sie nun auch die Bibliothek selbst, also die Datei qfs.qft, die sich im Verzeichnis qftest-4.1.6/include Ihrer QF-Test Installation befindet.

Das folgende Bild gibt einen Überblick der enthaltenen Packages.

Abbildung 7.3:  Die Standardbibliothek

Die Bibliothek enthält im wesentlichen Prozeduren zur Erleichterung der Arbeit mit bestimmten Java/Swing und Eclipse/SWT Komponenten. Im ersten Teil dieses Kapitels werden wir uns mit dem "swing" und dem "swt" Package befassen und anschließend auf die übrigen nützlichen Packages zurückkommen. Der Aufbau des "swing" und "swt" Packages ist der gleiche, deshalb werden die darin enthaltenen Prozeduren nur einmal beschrieben.

In allen Prozeduren unserer Bibliothek werden Sie die Verwendung der Variable $(client) bemerken. Dies ist ein Standardmechanismus, um Testsuiten unabhängig von einem spezifischen SUT zu gestalten. Für die Benutzung der Standardbibliothek wird vorausgesetzt, dass ein gültiger Wert für $(client) gesetzt wird, bevor eine ihrer Prozeduren verwendet werden kann. Als Beispiel einer möglichen Wertzuweisung für die Variable $(client) sehen wir die Attribute des Wurzelknotens "Testsuite" von StdLibDemo.qft, welche die Variable global für die ganze Testsuite setzt. Somit haben alle Knoten, die innerhalb dieser Testsuite aufgerufen werden (wie Prozeduraufrufe nach qfs.qft), Zugriff auf die Variable.

Abbildung 7.4:  Setzen der $(client) Variable

Sie können den Wert von $(client) aber auch im Aufruf einer Prozedur in qfs.qft setzen. Dieses Vorgehen kann sinnvoll sein, wenn Sie mit mehr als einem SUT arbeiten. Beachten Sie in diesem Zusammenhang auch, dass es keine Defaultwerte für die $(client) Variable in den Prozeduren von qfs.qft geben kann, da dies die unerwünschte Festlegung auf ein SUT bedeuten würde. Die von der Standardbibliothek verwendete $(client) Variable muss von Ihnen gesetzt werden!

Hinweis Sie mögen im obigen Bild bemerkt haben, dass wir qfs.qft in die Beispiel-Testsuite inkludiert haben, ohne eine direkte Angabe des Verzeichnisses, in dem die Datei enthalten ist. Dies ist möglich, weil das include Verzeichnis Ihrer QF-Test Distribution einen voreingestellten Bibliothekspfad von QF-Test bildet. Das bedeutet, dass alle Testsuiten, die sich in diesem Verzeichnis befinden, direkt in alle Ihre eigenen Testsuiten inkludiert werden können. Weitere Bibliothekspfade können unter »Bearbeiten«-»Optionen«-»Allgemein«-»Bibliothek« definiert werden.

Die vollständige Beschreibung aller Packages und Prozeduren, inklusive Parametern und Rückgabewerten, enthält die HTML Dokumentation, die auch über das »Hilfe« Menü erreichbar ist. Die neueste Version ist auch online verfügbar unter http://www.qfs.de/include/qfs_pkgdoc/qfs_pkgdoc.html.

7.3
Ausgewählte Packages und Prozeduren

Wir werfen nun einen genaueren Blick auf eine Anzahl ausgewählter Packages und Prozeduren der Standardbibliothek.

Bitte beachten Sie, dass folgenden Beispiele hauptsächlich auf qfs.swing-Prozeduren basieren. Die Prozeduren aus qfs.swt können auf die gleiche Art und Weise verwendet werden. Prozeduren, die Java/Swing bzw. Eclipse/SWT spezifisch implementiert sind, werden am Ende des Kapitels beschrieben.

7.3.1
Das Checkbox Package

Wir beginnen nun mit der genaueren Betrachtung der Packages qfs.fx.checkbox qfs.swing.checkbox, qfs.swt.checkbox oder qfs.web.checkbox. Dies ist ein guter Startpunkt, da die enthaltenen Prozeduren Ihnen sehr vertraut vorkommen sollten, wenn Sie die Testsuite utils.qft im Kapitel 6 dieses Tutorials entwickelt haben.

Hier sind einige Prozeduren aus diesen Packages:

  • select Selektiert ein Kontrollkästchen. Wenn das Kontrollkästchen sich bereits im ausgewählten Zustand befindet, wird keine Aktion ausgeführt.
  • deselect Deselektiert ein Kontrollkästchen. Wenn das Kontrollkästchen sich bereits im nicht-ausgewählten Zustand befindet, wird keine Aktion ausgeführt.
  • set Setzt ein Kontrollkästchen auf den angegebenen Zustand (true oder false).

Für jede dieser Prozeduren wird die QF-Test ID der Kontrollkästchenkomponente als variables Argument übergeben. Die Bibliothek kümmert sich um die Überprüfung, dass der Zustand des Kontrollkästchens wie erwartet gesetzt wurde. Eine beispielhafte Anwendung der Prozeduren finden Sie unterhalb des Knotens "Checkbox Tests" innerhalb von StdLibDemo.qft.

Abbildung 7.5:  Beispielanwendung des qfs.swing.checkbox Packages

Die Anwendung der anderen Prozeduren in diesem Package folgt dem generellen Modell, wie es hier gezeigt wurde.

7.3.2
Das Combobox bzw. Combo Package

Die Packages qfs.fx.combobox, qfs.swing.combobox, qfs.swt.combo und qfs.web.select enthalten Prozeduren, um Werte in einer Combobox zu selektieren.

Die wichtigsten Prozeduren sind:

  • setValue Selektiert einen Wert in der Liste der Combobox.
  • getItemCount Liefert die Anzahl der Einträge zurück.

7.3.3
Das General Package

Die Packages qfs.fx.general, qfs.swing.general, qfs.swt.general und qfs.web.general enthalten allgemeine Prozeduren für GUI-Elemente.

Die wichtigsten Prozeduren sind:

  • setLocation Setzt die Position der Komponente mittels angegebenen Koordinaten.
  • setSize Setzt die Größe der Komponente.

7.3.4
Das List Package

Die Packages qfs.fx.list, qfs.swing.list, qfs.swt.list und qfs.web.list enthalten allgemeine Prozeduren für Listen.

Die wichtigsten Prozeduren sind:

  • getItemCount Zählt die Einträge einer Liste.

7.3.5
Das Menu Package

Die Packages qfs.fx.menu, qfs.swing.menu und qfs.swt.menu erlauben es Ihnen, in einfacher Weise Einträge (und auch Kontrollkästchen) in Menüs oder Untermenüs auszuwählen (bzw. zu setzen). Die wichtigsten Prozeduren sind:

  • selectItem Wählt einen Eintrag in einem Menü aus.
  • selectSubItem Wählt einen Eintrag in einem Untermenü aus.

An alle diese Prozeduren muss die QF-Test ID der Menükomponente wie auch des Eintrags bzw. Kontrollkästchens übergeben werden. Die Benutzung variiert leicht, abhängig von der jeweiligen Art der Prozedur. Werfen Sie einen Blick auf die beispielhafte Benutzung im "Menu Tests" Knoten. Ein Aufruf von "setSubCheckItem" sieht beispielsweise so aus:

Abbildung 7.6:  Beispiel eines Aufrufs von menu.setSubCheckItem

Hier sehen wir die variablen Argumente, die beim Prozeduraufruf gebraucht werden. Die Argumente sind wie folgt organisiert:

menu -> item -> subCheckItem (checkItemValue),

die folgende Implementierung im SUT repräsentiert:

Options -> Tree -> Enable (true)

Der Ablauf im SUT macht den Ablauf noch klarer:

Abbildung 7.7:  Auswählen eines Kontrollkästchens in einem Untermenü des SUTs
7.3.6
Das Table Package

Die Packages qfs.fx.table, qfs.swing.table, qfs.swt.table und qfs.web.table enthalten Hilfsprozeduren für Tabellen.

  • getRowCount Zurückliefern der aktuellen Zeilenanzahl der Tabelle. Diese Prozedur verwendet technologiespezifische Methoden um an die Anzahl zu kommen.
  • getColumnCount Zurückliefern der aktuellen Spaltenanzahl der Tabelle. Diese Prozedur verwendet technologiespezifische Methoden um an die Anzahl zu kommen.
  • selectCell Selektiert eine angegebene Tabellenzelle.
7.3.7
Das Text Package

Die Packages qfs.fx.text, qfs.swing.text, qfs.swt.text und qfs.web.text stellen Hilfsfunktionen für Textfelder und -bereiche zur Verfügung. Möglicherweise sind Sie während der Entwicklung von Testsuiten bereits an Stellen gekommen, wo solch eine Funktionalität hilfreich gewesen wäre.

  • setText Setzt den Wert eines angegebenen Textfeldes.
  • clearField Löscht ein Textfeld. Die Prozedur kann nicht für Textbereiche verwendet werden.
  • clearArea Löscht einen Textbereich. Die Prozedur kann nicht für Textfelder verwendet werden.

Hinweis Diese Prozeduren sind inzwischen nahezu redundant, da "Texteingabe" Knoten die Zielkomponente vorher bei Bedarf selbst löschen. Trotzdem können die Prozeduren sich vielleicht in der einen oder anderen Situation als hilfreich erweisen.

Jede der Prozeduren benötigt die QF-Test ID des Textfeldes/-bereichs als Argument. Nachfolgend sehen wir einen Test in StdLibDemo.qft, in dem ein Textbereich im SUT manipuliert wird. Hierbei wird zuerst der Textbereich gelöscht. Anschließend werden zwei Zeilen Text eingegeben. Der Inhalt des Textbereichs wird dann auf den erwarteten Inhalt hin überprüft. Zum Schluss wird der Textbereich erneut gelöscht und überprüft, dass er auch wirklich leer ist.

Abbildung 7.8:  Beispiel für den Einsatz von text.clearArea
7.3.8
Das Tree Package

Die Bibliothek stellt in den Packages qfs.fx.tree, qfs.swing.tree, qfs.swt.tree und qfs.web.tree einige einfache Prozeduren zur Manipulation von Bäumen zur Verfügung. Das sind:

  • collapseNode Einklappen eines Baumknotens. Ist der Knoten bereits eingeklappt, wird keine Aktion ausgeführt. Diese Prozedur besitzt drei einzelne Parameter für Baum und Knoten
  • expandNode Ausklappen eines Baumknotens. Ist der Knoten bereits expandiert, wird keine Aktion ausgeführt. Diese Prozedur besitzt drei einzelne Parameter für Baum und Knoten.
  • selectNode Selektiert einen angegebenen Baumknoten.

Jede der Prozeduren benötigt die QF-Test ID des Baumknotens als Argument. Als Beispiel sehen wir nachfolgend einen Prozeduraufruf, um einen Baumknoten zu expandieren:

Abbildung 7.9:  Beispiel für die Benutzung von tree.expand

Beachten Sie bitte, dass wir eine Komponente eines Baumknoten verwenden, die wir bereits früher aufgenommen haben. Wenn Sie in den Knoten "Fenster und Komponenten" von StdLibDemo.qft schauen, können Sie die einzelnen Komponenten des Baums, die wir aufgenommen haben, sehen:

Abbildung 7.10:  Aufgenommene Komponenten des Baums
7.3.9
Das Cleanup Package

Die Packages qfs.fx.cleanup, qfs.swing.cleanup und qfs.swt.cleanup bieten eine gute Unterstützung für das Aufräumen der SUT Umgebung, wenn unerwartet eine Exception auftritt. Stellen Sie sich zum Beispiel vor, dass eine Exception geworfen wird, während auf ein Menü des SUTs zugegriffen wird. Die Exception bewirkt, dass der Ausführungspfad innerhalb Ihrer Testsuite zu einem Exception Handler umgeleitet wird - oder an einen "impliziten" Exception Handler. Das bedeutet, dass der normale Ausführungspfad, der das geöffnete Menü in der Regel wieder ordnungsgemäß geschlossen hätte, unterbrochen wurde. Ohne eine entsprechende Aktion kann dieses Menü geöffnet bleiben und somit andere Ereignisse an das SUT blockieren.

Hier sehen Sie die wichtigsten Prozeduren innerhalb des Packages:

  • closeAllModalDialogs Stellt sicher, dass modale Dialoge des SUTs geschlossen werden. Nur für Swing und FX verfügbar!
  • closeAllDialogsAndModalShells Stellt sicher, dass alle Dialoge und modalen Shells geschlossen werden. Nur für Eclipse/SWT verfügbar!
  • closeAllMenus Schließt alle offenen Menüs des SUT.

Das Konzept der Behandlung von impliziten Exceptions ist von großer Bedeutung, denn eine Exception in einem einzigen Testfall soll nicht zum Beenden des gesamten Testlaufs führen. Lediglich der aktuelle Testfall muss abgebrochen werden, dann sollte es mit dem nächste Testfall weitergehen.

Aus diesem Grund wird eine Exception innerhalb eines Testfalls auf dieser Ebene gefangen und nicht nach oben propagiert, um den Abbruch des gesamten Testlaufs zu verhindern. Der Fehlerstatus wird jedoch stets korrekt im Protokoll und Report festgehalten.

Benutzt der Testfall eine Abhängigkeit, wird die Exception an den Catch Knoten derselben übergeben, falls ein solcher vorhanden ist. Diese Art der Behandlung von Exceptions (und Fehlern) wird im Kapitel Abhängigkeiten des Handbuchs erklärt.

7.3.10
Das Run-log Package

Das Package qfs.run-log enthält Prozeduren, um Meldungen in das Protokoll zu schreiben.

Hier sehen Sie die Liste von verfügbaren Prozeduren innerhalb des Packages:

  • logError Schreibt eine Fehlermeldung ins Protokoll.
  • logWarning Schreibt eine Warnung ins Protokoll.
  • logMessage Schreibt eine Meldung ins Protokoll.
7.3.11
Das Run-log.Screenshots Package

Das qfs.run-log.screenshots Package enthält Prozeduren, die Bildschirmabbilder ins Protokoll schreiben und einige Hilfsprozeduren.

Hier sehen Sie die Liste von verfügbaren Prozeduren innerhalb des Packages:

  • getMonitorCount Liefert die Anzahl der angeschlossenen Monitore.
  • logScreenshot Schreibt ein Bildschirmabbild des aktuellen Monitors ins Protokoll.
  • logImageOfComponent Schreibt ein Bildschirmabbild einer Komponente ins Protokoll.
  • logScreenshotOfMonitor Schreibt ein Bildschirmabbild eines angegebenen Monitors ins Protokoll.
7.3.12
Das Shellutils Package

Das qfs.shellutils Package beinhaltet Prozeduren für die wichtigsten Shell-Kommandos.

Hier sehen Sie die Liste von verfügbaren Prozeduren innerhalb des Packages:

  • copy Kopiert eine angegebene Datei oder ein Verzeichnis an eine neue Stelle.
  • deleteFile Löscht eine angegebene Datei.
  • exists Prüft, ob eine angegebene Datei oder ein Verzeichnis existiert.
  • getBasename Gibt den Dateinamen der Datei zurück.
  • getParentDirectory Gibt die Verzeichnisstruktur der Datei zurück.
  • mkdir Erzeugt ein Verzeichnis. Es werden auch Verzeichnisse neu angelegt im Pfad, die nicht existieren.
  • move Verschiebt eine angegebene Datei oder ein Verzeichnis.
  • touch Erzeugt eine Datei.
  • removeDirectory Löscht ein angegebenes Verzeichnis.
7.3.13
Das Utils Package

Das Package qfs.utils enthält nützliche Prozeduren für häufig auftretende Anforderungen der Testentwicklung.

Hier sehen einige Prozeduren des Packages:

  • getDate Gibt einen String zurück, der ein Datum enthält. Standardmäßig wird das aktuelle Datum zurückgegeben. (Andere Daten sind konfigurierbar.)
  • getTime Gibt einen String zurück, der eine Zeit enthält. Standardmäßig wird die aktuelle Zeit zurückgegeben. (Andere Zeiten sind konfigurierbar.)
  • logMemory Schreibt den aktuellen Speicherverbrauch ins Protokoll.
  • printVariable Gibt den Inhalt einer spezifizierten Variable auf der Konsole aus.
  • printMessage Gibt den Inhalt einer angegebenen Nachricht auf der Konsole aus.
  • writeMessageIntoFile Schreibt einen angegebenen String in eine angegebene Datei.
7.3.14
Das Database Package

Das Package qfs.database enthält nützliche Prozeduren, um mit Datenbanken zu arbeiten.

Bitte beachten Sie, dass der Datenbanktreiber für die Datenbankverbindung entweder im Pluginverzeichnis von QF-Test oder in der Umgebungsvariable CLASSPATH vor dem Start von QF-Test sein muss.

Für weitere Informationen über den Aufbau einer Datenbankverbindung kontaktieren Sie einen Entwickler oder werfen Sie einen Blick auf www.connectionstrings.com.

Die wichtigsten Prozeduren sind:

  • executeSelectStatement Führt einen angegebenen SQL-Select-Befehl aus. Das Ergebnis wird in eine globale Variable "resultRows" im Jython Variablenstack geschrieben.
  • executeStatement Führt einen angegebenen SQL Befehl aus. Hier kann jedes beliebige SQL Kommando ausgeführt werden.
7.3.15
Das Check Package

Das qfs.check enthält Prozeduren, die Checks ausführen.

Die wichtigsten Prozeduren sind:

  • checkEnabledStatus Überprüft, ob eine Komponente en- bzw. disabled ist. Die Prozedur schreibt einen Fehler ins Protokoll im Fehlerfall.
  • checkSelectedStatus Überprüft, ob eine Komponente selektiert bzw. nicht selektiert ist. Die Prozedur schreibt einen Fehler ins Protokoll im Fehlerfall.
  • checkText Überprüft den Text einer Komponente. Die Prozedur schreibt einen Fehler ins Protokoll im Fehlerfall.
7.3.16
Das Databinder Package

Das Package qfs.databinder enthält Prozeduren zur Ausführung innerhalb eines Datentreiber Knotens, um Daten für datengetriebenes Testen zu binden.

Die wichtigsten Prozeduren sind:

  • bindList Bindet eine Liste von Werten an eine Variable. Die Werte sind durch Leerzeichen oder das als Parameter übergebene Trennzeichen getrennt.
  • bindSets Bindet Sätze von Werten an einen Satz von Variablen. Die Sätze von Werten sind durch Zeilenumbrüche getrennt, die Werte innerhalb eines Satzes durch Leerzeichen oder das als Parameter übergebene Trennzeichen.
Videos Downloads Dokumentation Kaufen Gratis Testen