Open Source im professionellen Einsatz

An der Oberfläche

Für die Ausführung von GUI-Tests stellt »QTest« weitere Funktionen bereit, die der Simulation von Maus- und Tastatureingaben dienen. Der Beispieltest verwendet die Funktionen »keyClick(*Widget, Key)« , »keyClicks(*Widget, Sequenz)« und »mouseClick(*Widget, Button, Modifier, Position)« . Gemeinsam ist ihnen, dass sie als erstes Argument einen Zeiger auf das Oberflächenobjekt erwarten, das auf den Prüfstand soll. Dabei interagiert die erste Funktion durch einen einzelnen Tastendruck mit dem Objekt. Als zweiten Parameter erwartet sie entweder einen Buchstaben als »char« oder einen Qt-Keycode.

Abbildung 2: Die Ausgabe des ersten Tests zeigt den erwarteten Fehlschlag und den daher bestandenen Test.

Abbildung 2: Die Ausgabe des ersten Tests zeigt den erwarteten Fehlschlag und den daher bestandenen Test.

Die zweite Funktion bietet die Möglichkeit, gleich eine ganze Reihe von Tastendrücken zu simulieren. Daher erwartet sie als zweites Argument einen »QString« mit der Zeichenkette. Zur Simulation eines Mausklicks dient die dritte Funktion. Sie erwartet als zweites Argument den zu simulierenden Mausknopf, der sich durch einen Modifier ergänzen lässt – beispielsweise die [Strg]-Taste.

Wichtiger ist allerdings das vierte Argument, da es den Ort des Mausklicks definiert. Ohne Angabe erfolgt er auf die Mitte des Objekts. Das reicht für Menüs und einfache Knöpfe aus. Der Koordinatenursprung für die Angabe des Ausführungsortes ist aber nicht die Mitte des Objekts, sondern, wie bei Qt üblich, die obere linke Ecke des Objekts.

Listing 4

Ein GUI-Test anhand einer Spinbox

01 #include "testhexspinbox.h"
02 #include "testhexspinbox.moc"
03 #include "hexspinbox.h"
04 #include <QTest>
05 #include <QPoint>
06
07 void TestHexSpinBox::testHexSpinBox()
08 {
09   HexSpinBox *spinBox = new HexSpinBox();
10   QCOMPARE(spinBox->value(), 0ll);
11   QTest::keyClicks(spinBox, "A9");
12   QCOMPARE(spinBox->value(), 169ll);
13   QTest::keyClick(spinBox, Qt::Key_Up);
14   QCOMPARE(spinBox->value(), 170ll);
15   QPoint clickPoint(spinBox->size().width() - 2, spinBox->size().height() - 2);
16   QTest::mouseClick(spinBox, Qt::LeftButton, 0, clickPoint);
17   QCOMPARE(spinBox->value(), 169ll);
18   delete spinBox;
19 }
20
21 QTEST_MAIN(TestHexSpinBox);

Ferngesteuert klicken

Den praktischen Einsatz dieser Funktionen zeigt Listing4. Es testet eine Implementierung von »QAbstractSpinBox« , um Hexadezimalzahlen einzugeben (Abbildung3). Die Methode instanziert in Zeile9 das UI-Element. Komplexere Anwendungen bestehen aus mehr als einem Widget. Damit die Testfunktionen auch auf private Kinder des Hauptwidget zugreifen dürfen, verwenden Tester die Methoden »findChild()« und »findChildren()« . Die Klasse »TestMainWindow« in den Beispielquellen nutzt diese Funktionen zum Test des Dateimenüs.

Die nachfolgenden Tests prüfen, ob der Anfangswert zunächst 0 und nach der Eingabe der Hex-Folge »A9« tatsächlich dem Dezimalwert 169 entspricht. Der Druck auf die Pfeil-nach-oben-Taste erhöht ihn weiter auf 170.

Abbildung 3: Das Spinbox-Widget wandelt interne Dezimalzahlen in das Hexadezimalsystem um.

Abbildung 3: Das Spinbox-Widget wandelt interne Dezimalzahlen in das Hexadezimalsystem um.

Für den Test der Pfeiltasten am rechten Rand der Box kommt schließlich die Funktion »mouseClick()« zum Einsatz, die hier auf die Taste mit dem Pfeil nach unten klickt. Da sich diese rechts unten in der Box befindet, lässt sich der Klickpunkt durch den Abzug weniger Pixel von der Breite und der Höhe berechnen. Nach dem Klick prüft Zeile17 wieder das Resultat. Das Listing schließt erneut mit dem Makro, das die Testklasse zur Anwendung wandelt.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook