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

5
Erstellen einer verallgemeinerten Prozedur [30-45 Min]

In diesem Kapitel zeigen wir Ihnen, wie Sie die Prozedur, die Sie im letzten Kapitel erstellt haben, verallgemeinern können, um sie noch nützlicher zu machen. Nach der Einführung von Packages sind Sie dann in der Lage, Ihre eigene Bibliothek mit allgemeinen Hilfsfunktionen zu schreiben.

5.1
Anlegen eines "Package" Knotens

Wenn Sie im Testalltag weitere Prozeduren erstellen, werden Sie schnell feststellen, dass die Dinge zunehmend unordentlich und unübersichtlich werden - ähnlich einem Schreibtisch, auf dem wichtige Dokumente kreuz und quer verstreut sind. Wie ein Ordner, der Ihnen hilft, Dokumente zu organisieren und in verschiedene Kategorien einzuteilen, dienen Packages in QF-Test dazu, Prozeduren in Gruppen zusammenzufassen. Packages können dabei sowohl Prozeduren als auch weitere Packages enthalten. Sie können Ihre Packages und Prozeduren anordnen, wie immer es Ihnen beliebt, aber es ist sicherlich sinnvoll, Prozeduren mit gemeinsamer Funktionalität in ein gemeinsames Package zu packen.

Im vorhergehenden Kapitel haben Sie eine Prozedur namens "selectCheckbox" geschrieben, die es ermöglicht, ein Kontrollkästchen im SUT zu aktivieren. Analog könnten wir uns weitere Prozeduren vorstellen, die sich mit Kontrollkästchen befassen, zum Beispiel zum Deaktivieren oder zum Auslesen oder Überprüfen des aktuellen Zustands. Es gibt viele Möglichkeiten, die alle in eine gemeinsame Kategorie fallen, eben Hilfsfunktionen für Kontrollkästchen. Lassen Sie uns also ein Package für diese Prozeduren erstellen.

Selektieren Sie den Knoten "Prozeduren" in Ihrer Testsuite, klappen Sie ihn aus und wählen Sie den Menüeintrag »Einfügen«-»Prozedur Knoten«-»Package«. Dadurch öffnet sich ein Dialog für die Eigenschaften des neuen Packages, in dem Sie lediglich den Namen angeben müssen. Nennen Sie das neue Package "checkbox".

5.2
Verschieben der Prozedur

Sie haben bereits eine Prozedur, die sich auf Kontrollkästchen bezieht und die Sie nun in Ihr neues Package verschieben können. Verwenden Sie dazu direkt die Maus oder auch die Funktionen »Ausschneiden« und »Einfügen«. Ein Dialog wird erscheinen, der nachfragt ob alle Referenzen auf diese Prozedur automatisch angepasst werden sollen. Wählen Sie bitte "Ja" und lassen Sie "Angepasste Referenzen nach Aktion anzeigen" aktiviert, dann erscheint nach der Aktion eine Liste mit betroffenen Knoten. In unserem Fall ist es nur ein Prozeduraufruf.

Nun, da sich die Prozedur im Package "checkbox" befindet, ist der Name "selectCheckbox" ein wenig redundant. Lassen Sie uns den Namen der Prozedur zu "select" abändern. Dies ist ein weiterer kleiner Vorteil der Organisation in Packages: Befindet sich eine Prozedur im Package "checkbox", kann man automatisch davon ausgehen, dass sie sich auf Kontrollkästchen bezieht. Erneut werden Sie gefragt ob Referenzen automatisch angepasst werden sollen, was natürlich hilfreich ist.

Ihre Testsuite sollte jetzt wie folgt aussehen:

Abbildung 5.1:  Das "checkbox" Package
5.3
Erstellen der "deselect" Prozedur

Unser nächster Schritt besteht darin, das Package zu erweitern, indem wir eine weitere Prozedur hinzufügen. Dazu bietet sich natürlich eine "deselect" Prozedur an, die das Kontrollkästchen deaktiviert.

Ihre neue "deselect" Prozedur wird im Wesentlichen genauso funktionieren wie "select", mit einigen kleinen Änderungen in der Logik. Beginnen Sie damit, dass Sie eine Kopie der Prozedur "select" erstellen und diese ebenfalls in das "checkbox" Package einfügen. Es stört nicht weiter, dass Sie damit zwei Prozeduren mit dem gleichen Namen im selben Package haben, das werden Sie als Nächstes ändern.

Selektieren Sie eine der beiden "select" Prozeduren und ändern Sie in der Detailansicht deren Namen zu "deselect".

Im letzten Schritt dieses Abschnitts müssen wir nun die Logik so anpassen, dass die "deselect" Prozedur das Kontrollkästchen auf den Zustand "nicht selektiert" überprüft, bevor sie einen Event auslöst. Um das zu erreichen, müssen Sie lediglich eine einzige Änderung vornehmen: Expandieren Sie den "Prozedur" Knoten so weit, bis Sie den Knoten "Check Boolean: selected" finden. Sie werden sich erinnern, dass dies der Knoten ist, der den Zustand des Kontrollkästchens überprüft. In der "select" Prozedur hatten wir es so eingerichtet, dass der Knoten eine Exception auslöst, wenn das Kontrollkästchen nicht selektiert ist. Um dies umzukehren, deaktivieren Sie einfach das Attribut "Erwarteter Status" in der Detailansicht des "Check" Knotens:

Abbildung 5.2:  Check für den Zustand "nicht selektiert"

Jetzt erwartet der Check für das Kontrollkästchen den Zustand "nicht selektiert" und wirft eine Exception, wenn das Kästchen selektiert ist. Das war's auch schon, zumindest was die Logik betrifft. Sie können noch die Namen und Kommentare innerhalb der Prozedur an die neuen Gegebenheiten anpassen, z.B. den Namen des "Try" Knotens von "checkbox selected" auf "checkbox deselected" ändern. Ihr neues Package sollte nun in etwa so aussehen:

Abbildung 5.3:  Das "checkbox" Package mit zwei Prozeduren
5.4
Aufruf der Prozedur

Im vorigen Kapitel hatten Sie einen Aufruf der Prozedur "selectCheckbox" erstellt. Sie müssen nun diesen Prozeduraufruf so ändern, dass er den korrekten Namen erhält.

Aufrufe von Prozeduren in Packages folgen einer einfachen Syntax, welche die gesamte Hierarchie einer Prozedur elegant widerspiegelt, nämlich in der Form Package.Prozedur. Ihr Prozeduraufruf erhält also den Namen "checkbox.select"

Hinweis Wie erwähnt können Packages nicht nur Prozeduren, sondern auch weitere Packages enthalten. Befindet sich eine Prozedur in solch einem verschachtelten Package, wird der Name nach der gleichen Regel wie oben gebildet, mit entsprechend vielen Package. Ausdrücken vorangesetzt. So könnte ein Prozeduraufruf etwa den Namen menu.file.open erhalten, was den zwei Packages "menu" (das äußere) und "file" (das innere) entspricht, mit der Prozedur namens "open" im Package "file".

Erstellen Sie einen weiteren Prozeduraufruf, diesmal für die Prozedur "checkbox.deselect". Sie sollten das mit Ihrer Erfahrung aus den bisherigen Kapiteln problemlos bewerkstelligen können.

5.5
Erstellen einer allgemeinen Prozedur

Die zwei Prozeduren in Ihrem "checkbox" Package erlauben Ihnen nun, entweder ein Kontrollkästchen zu aktivieren oder es zu deaktivieren. Wie wäre es, wenn wir jetzt eine Prozedur erstellen, die beide Möglichkeiten in sich vereint? In diesem und den folgenden Abschnitten werden wir eine Prozedur namens "setState" erstellen, die den Status des Kontrollkästchens wahlweise auf "selektiert" oder "nicht selektiert" setzt. Zu diesem Zweck werden wir der Prozedur beim Aufruf einen Parameter namens "select" übergeben. Hat dieser den Wert "true", wird die Prozedur das Kontrollkästchen aktivieren, andernfalls deaktivieren.

Beginnen wir damit die Prozedur "setState" im Package "checkbox" neu zu erstellen. Wenn Sie dazu Hilfe benötigen, können Sie in Abschnitt 4.2 nachschlagen.

5.6
Angeben eines Defaultwerts

Wie gerade erwähnt, wird unsere neue Prozedur eine Variable namens "select" erhalten, die darüber entscheidet, was mit dem Kontrollkästchen zu geschehen hat. Ebenso wie die QF-Test ID der Komponente muss der Wert der Variable "select" (entweder "true" oder "false") beim Prozeduraufruf von "setState" angegeben werden.

Oft ist es sinnvoll, für den Wert einer Variable einer Prozedur einen Standardwert vorzugeben, der verwendet wird, wenn kein Wert beim Prozeduraufruf angegeben wird. Die Angabe eines Arguments beim Aufruf wird dadurch optional.

Selektieren Sie die Prozedur "setState" und werfen Sie einen Blick auf deren Attribute in der Detailansicht. Dort befindet sich auch ein Bereich zur Definition von Variablen. Diese werden genauso bearbeitet, wie Sie es bereits in Abschnitt 4.8 getan haben. Fügen Sie jetzt auf die selbe Weise eine Variable namens "select" hinzu und geben Sie ihr den Wert "true". Die Detailansicht sollte nun wie folgt aussehen:

Abbildung 5.4:  Standardwert für eine Variable der Prozedur

Damit haben Sie QF-Test mitgeteilt, dass es den Wert "true" für die Variable "select" in der Prozedur "setState" annehmen soll, wenn beim Aufruf der Prozedur kein Wert angegeben war. Ist dagegen ein Wert im Prozeduraufruf angegeben, wird der Defaultwert ignoriert.

Hinweis Wenn Sie mit dem Konzept von Variablen vertraut sind, werden Sie hierin das Prinzip des Gültigkeitsbereichs einer Variablen erkennen. In diesem Stadium spielt es noch keine so große Rolle, aber wenn Sie sich öfter mit Variablen in QF-Test auseinandersetzen, sollten Sie unbedingt das Kapitel Variablen im Handbuch lesen.

5.7
Das If/Else Konstrukt

Die Variable "select" soll also darüber entscheiden, ob das Kontrollkästchen ein- oder ausgeschaltet werden soll. Um diese Logik in der Testsuite umzusetzen, benötigen wir die Knoten "If" und "Else".

Dieses Konstrukt ist sehr einfach einzusetzen. Der "If" Knoten hat ein Attribut namens "Bedingung", welches bei seiner Ausführung ausgewertet wird. Liefert die Bedingung einen wahren Wert, werden die Knoten innerhalb des "If" Knotens ausgeführt, andernfalls die Knoten des "Else" Knotens.

Selektieren und expandieren Sie nun die Prozedur "setState" und fügen Sie mittels »Einfügen«-»Ablaufsteuerung«-»If« einen neuen "If" Knoten ein. Wie üblich erscheint an dieser Stelle der Dialog mit den Attributen des Knotens. Für den "If" Knoten müssen Sie die Bedingung angeben, um die Variable "select" auszuwerten. Füllen Sie dieses Feld exakt wie folgt:

Abbildung 5.5:  Bedingung für den "If" Knoten

Erinnern Sie sich, dass zur Expansion einer Variablen in QF-Test die Syntax $(variable) dient. Die im Bild sichtbaren Anführungsstriche werden benötigt, da sich QF-Test zum Auswerten von Bedingungen der eingebauten Skriptsprache Jython bedient und dieser explizit mitgeteilt werden muss, dass es sich bei diesen Werten um Zeichenketten handelt. Zahlen und mathematische Ausdrücke werden ohne Anführungsstriche angegeben. Details hierzu finden Sie im Handbuch in den Abschnitten Variablen und Der "If" Knoten.

Wie bereits erwähnt, werden die Knoten innerhalb des "If" Knotens ausgeführt, wenn dessen Bedingung einen wahren Wert liefert. Wir können also nun diese Logik entsprechend ergänzen. Dazu gibt es verschiedene Möglichkeiten. Sie könnten zum Beispiel die Knoten aus der "select" Prozedur hierher kopieren. Wie werden aber den einfachsten Weg gehen und einfach einen Prozeduraufruf zur Prozedur "checkbox.select" an dieser Stelle einfügen. Achten Sie dabei darauf, dass der Prozeduraufruf innerhalb des "If" Knotens landet. Weitere Hilfe finden Sie in Abschnitt 4.8.

Kommen wir jetzt zum "Else" Teil des Konstrukts. Nach dem letzten Knoten innerhalb des "If" Knotens (in diesem Fall ist es nur einer, aber es könnten genausogut mehrere sein) können Sie mittels »Einfügen«-»Ablaufsteuerung«-»Else« einen "Else" Knoten einfügen. Sie müssen keine weiteren Informationen in den Dialog für den "Else" Knoten eingeben. Er stellt automatisch die logische Antithese zum entsprechenden "If" Knoten dar.

Schließlich vollenden wir das Konstrukt, indem wir die Knoten zum "Else" Knoten hinzufügen, die dann ausgeführt werden sollen, wenn die Bedingung des "If" Knotens nicht erfüllt ist. In unserem Beispiel ist das einfach ein Prozeduraufruf für "checkbox.deselect".

Damit ist die Prozedur "setState" komplett! Sie sollte in etwa so aussehen:

Abbildung 5.6:  Das If/Else Konstrukt

Hinweis In unserem Beispiel führt die boolesche Natur der Variablen "select" (nur die Werte "wahr" und "nicht wahr") automatisch zu einem einfachen If/Else Konstrukt. Andere Beispiele mit mehreren Bedingungen wie zum Beispiel die Farben einer Ampel, können mit Hilfe des Konstrukts If/Elseif/Else gelöst werden. Das Konzept ist das gleiche, nur dass dabei mehrere Bedingungen ausgewertet werden. Ihre Logik könnte in etwa so aussehen:

Abbildung 5.7:  Das If/Elseif/Else Konstrukt

Der "Else" Knoten ist übrigens sowohl bei If/Else, als auch bei If/Elseif/Else optional.

5.8
Aufruf der allgemeinen Prozedur

Nun können Sie versuchen, Ihre neue "setState" Prozedur aufzurufen. Erstellen Sie hierzu analog zu Abschnitt 4.8 einen Prozeduraufruf Knoten. Sie benötigen natürlich immer noch einen QF-Test ID Wert für das "id" Argument. Zusätzlich können Sie jetzt (optional) den Wert für die Variable "select" angeben, zum Beispiel:

Abbildung 5.8:  Prozeduraufruf für "setState"

Anmerkung: Falls Sie eine Prozedur mit einem Rückgabewert erstellen möchten, z.B. eine getState Prozedur, können Sie für diesen Zweck einen Return Knoten innerhalb der Prozedur verwenden. Der zurückgegebene Wert kann dann an eine lokale oder globale Variable außerhalb der Prozedur zugewiesen werden. Dies geschieht mit Hilfe des Attributs "Variable für Rückgabewert" des Knotens "Prozeduraufruf", das im obigen Bild gezeigt wird. Weitere Informationen finden Sie im Referenzhandbuch.

5.9
Dokumentieren der Prozedur

Nachdem Sie die Implementierung Ihrer Prozedur erfolgreich abgeschlossen haben, möchten wir Ihnen nun einen bequemen Weg zeigen, um eine Dokumentation dafür zu erzeugen. Für die Programmiersprache Java gibt es eine standardisierte Methode um Quellcode zu dokumentieren - sie heißt javadoc. Dabei werden spezielle Schlüsselworte (Tags) in Kommentaren in den Quellcode eingefügt, die vom javadoc Tool ausgewertet und in Form eines wohlstrukturierten HTML Dokuments aufbereitet werden.

QF-Test bietet einen äquivalenten Mechanismus an, um Packages und Prozeduren zu dokumentieren. Wir werden Ihnen im Folgenden zeigen, wie es funktioniert. Unter qfs_pkgdoc.html können Sie vorab einen Blick auf ein Beispiel werfen, wie das Resultat aussehen kann.

Nun beginnen wir damit, unsere Prozedur für die Dokumentation aufzubereiten. Öffnen Sie dazu bitte den "setState" Prozedurknoten, falls dieser nicht ohnehin noch geöffnet ist. Wie Sie in Abbildung 5.9 sehen können, verwendet die Prozedur zwei Parameter. Um für diese eine Dokumentation zu erzeugen, fügen wir zwei Zeilen in das Feld "Bemerkung" des Knotens ein. Diese beginnen mit dem Schlüsselwort @param, gefolgt von dem Parameternamen und einer passenden Beschreibung. @param ist ein spezielles Schlüsselwort, um die Beziehung der Beschreibung zu den Prozedurparametern anzuzeigen. Zusätzlich kann eine allgemeine Beschreibung der Prozedur am Anfang des Bemerkungsfelds eingefügt werden. Beachten Sie, dass es möglich ist, mit HTML Tags den Text zu formatieren.

Abbildung 5.9:  Kommentare für die Package Dokumentation

Fügen Sie nun bitte entsprechende Kommentare in Ihre "setState" Prozedur ein, so dass wir die Erzeugung der Dokumentation starten können.

Der Generierungsprozess ist sehr einfach. Öffnen Sie einfach über das Menü »Datei«-»HTML/XML Pkgdoc erstellen...«.

Den folgenden Dialog zur Auswahl von Optionen zur Generierung können Sie unverändert mit "OK" bestätigen. Anschließend sollte automatisch Ihr Standard-Browser erscheinen (Sie müssen möglicherweise manuell zu ihm wechseln, falls dieser sich nicht automatisch in den Vordergrund schiebt) und das Folgende präsentieren.

Abbildung 5.10:  Die Package Dokumentation

Wir sehen die Gliederung des Dokumentes in drei Teile. Die Package-Übersicht, die Prozedur-Übersicht und die detaillierte Beschreibung des Packages "checkbox". Im Package "checkbox" gibt es die Prozedur "setState" mit dem allgemeinen Beschreibungstext und seinen Parametern.

Mit dem Pkgdoc Feature können Sie sehr einfach eine wertvolle Beschreibung von Packages und Prozeduren erstellen, speziell wenn Sie allgemeine Funktionalität z.B. in einer Bibliothek zur Verfügung stellen wollen. Solch eine Bibliothek ist auch Teil der QF-Test Distribution. Sie wird ausführlich in Kapitel 7 behandelt.

Sie können nun ein wenig mit den Möglichkeiten der Pkgdoc Generierung spielen. Zum Beispiel können Sie einen allgemeinen Beschreibungstext zum Package "checkbox" hinzufügen und andere Schlüsselworte wie @version, @author, @result, @throws ausprobieren. Eine vollständige Liste der Tags finden Sie im Handbuch.

Hinweis Sie können die Package Dokumentation in QF-Test auch automatisch im Batch-Modus generieren. Details über die entsprechenden Kommandozeilenargumente finden Sie im Handbuch.

5.10
Abspeichern der Testsuite

Inzwischen sind Sie auf dem Weg zur Entwicklung fortgeschrittener Testsuiten weit voran gekommen. Nehmen Sie sich die Zeit, die Arbeit, die Sie bisher in Ihre Testsuite gesteckt haben, zu sichern. Speichern Sie dazu die Testsuite durch Auswahl des Menüeintrags »Datei«-»Speichern unter...« unter dem Namen utils.qft ab. Den Namen können Sie natürlich frei wählen, aber wir werden im folgenden Kapitel noch darauf Bezug nehmen.

Hinweis Wenn Sie QF-Test ohne Lizenz im Demo Modus evaluieren, können Sie Ihre Testsuite nicht speichern. Sie können jederzeit eine vollwertige Evaluationslizenz von Quality First Software GmbH anfordern. Näheres hierzu finden Sie im Web auf der QF-Test Download Seite.

Im nächsten Kapitel werden wir noch tiefer in QF-Test einsteigen und beginnen, die Möglichkeiten zum Erstellen von modularen Bibliotheken zu erforschen. Dieser Punkt ist gut geeignet um eine Pause einzulegen und QF-Test auf eigene Faust (und mit Hilfe des Handbuchs!) zu erkunden, um das bisher Gelernte zu vertiefen.

Videos Downloads Dokumentation Kaufen Gratis Testen