Testen von GUI-Applikationen

Viele Programme sind keine Konsolen-Programme sondern Programme mit Graphischer Oberfläche. Diese sind vielleicht mit Perl/Tk, WxPerl oder einer ganz anderen Sprache entwickelt. Auch GUIs sollten getestet werden. Ist beim Menü überall die richtige Funktion hinterlegt? Machen die Funktionen das was sie tun sollen?

X11::GUITest

Mit X11::GUITest können Applikationen mit Graphischen Oberflächen (GUI) getestet werden, die ein X11-Framework verwenden. Diese Frameworks sind zum Beispiel GTK+,Qt,Xt und Motif. Es gibt aber noch weitere Frameworks.

Für das Modul X11::GUITest stehen nicht so viele Funktionen zur Verfügung wie für Win32::GuiTest.

Da Tastatureingaben immer an das aktive Fenster geschickt werden, muss das Programm im aktiven Workspace laufen und es darf zwischendurch kein anderes Fenster aktiviert werden. Es wäre wünschenswert, wenn man Tastatureingaben an ein ausgewähltes Fenster schicken könnte.

Unter Solaris ist folgender Test erfolgreich gelaufen:

Das Skript test.pl erzeugt ein Fenster mit Perl/Tk und wenn der Anwender Alt-C drückt, wird eine Datei erzeugt. Das Skript sieht wie folgt aus.
   1 #!/usr/bin/perl
   2
   3 use strict;
   4 use warnings;
   5 use Tk;
   6 
   7 my $mw = tkinit();
   8 $mw->bind('<Alt-c>',\&test);
   9 
     10 MainLoop;
     11 
     12 sub test{
     13     open(my $fh,'>','test.txtt') or die $!;
     14     print $fh 'FooBar';
     15     close $fh;
     16
     17     exit;
     18 }
Das Skript leistet nichts großartiges, soll aber ein Beispiel sein, wie man mit X11::GUITest die Funktionalität einer GUI überprüfen kann. Doch wie testet man jetzt diese GUI? Auch hier reicht ein kleines Skript.
   1 #!/usr/bin/perl
   2
   3 use strict;
   4 use warnings;
   5 use X11::GUITest qw(StartApp SendKeys FindWindowLike);
   6
   7 # starte die GUI
   8 StartApp('/pfad/zu/test.pl');
   9 
     10 # Zeit lassen zu Starten
     11 sleep(2);
     12
     13 # Der Titel wird von Perl/TK gesetzt wenn nicht explizit angegeben
     14 my ($window) = FindWindowLike('Test');
     15 
     16 if(!$window){
     17     die "Couldn't find a window\n";
     18 }
     19 
     20 # Sende Alt-C
     21 SendKeys('%(c)');
     22 sleep(2);
     23 print 'ok' if(-e 'test.txtt');
Wie man sieht, ist es relativ einfach, eine GUI zu testen.

Win32::GuiTest

Win32::GuiTest ist das Windows-Pendant zu X11::GuiTest. Als Beispiel-Applikation soll der Editor von Herbert Breunung, der Editor ``kephra'', getestet werden.

Wichtig ist, dass man eine sehr neue Version von Win32::GuiTest verwendet, da viele wichtige Funktionen erst in den neuesten Versionen implementiert sind. In dem Test, soll überprüft werden, ob die ``Speichern unter...''-Funktion richtig funktioniert.

Dazu wird nur die Funktion SendKeys? benötigt. Das Modul bietet für sehr viele wichtige Funktionen die entsprechenden Methoden.

Das Beispielprogramm sieht dann so aus:
   1 #!/usr/bin/perl
   2
   3 use strict;
   4 use warnings;
   5 use Win32::GuiTest qw(:ALL);
   6
   7 my $dir = 'C:\PCE-0.3\pce';
   8 chdir $dir;
   9
     10 system("start pce.exe");
     11 sleep(2);
     12 my @windows = FindWindowLike(undef,"PCE");
     13
     14 print "Couldn't find a window\n" unless(@windows);
     15 print "more than one window\n" if scalar(@windows) > 1;
     16 
     17 # simulate Ctrl+Shift+S
     18 SendKeys("+^s");
     19 # send PID + '.txt'
     20 SendKeys($$.".txt");
     21 # press <ENTER>
     22 SendKeys("{ENTER}");
In einem Beispiel, in dem die Maus navigiert werden soll, um das Programm über die Toolbar neu zu speichern, wird die Funktion MoveMouseAbsPix? benötigt, um die Maus zu einem bestimmten Punkt zu navigieren. Mit SendMouse? wird dann der Mausklick simuliert. Das Beispielprogramm sieht folgendermaßen aus:

Für alle Funktionen ein Beispiel zu zeigen, wäre zu aufwendig, weshalb es bei den zwei gezeigten Beispielen bleibt.

Zwischenfazit ``GUI-Testing''

Das GUI-Testing sollte aus mehreren Teilen bestehen: Dem Test des Codes, Test der Oberfläche und dem Usability-Test. Wie man den Code testen kann, ist in den vorangegangenen Abschnitten beschrieben worden. Den Usability-Test kann man nicht wirklich automatisieren. Hier müssen echte Personen ran.

Der Test der Oberfläche dient dazu, dass die Buttons auch das richtige tun und dass die Verknüpfung von Oberfläche und Code das gewünschte Ergebnis erzielt. Diese Tests sollten gemacht werden, denn was bringt schon der beste Code, wenn sich unter dem ``Datei öffnen''-Button die ``Suche''-Funktionalität verbirgt. Und wenn man etwas speichern will, wird auf einmal die Festplatte gelöscht.

Das sind Fehler, die in keinem Programm passieren sollten. Mit Win32::GuiTest und X11::GUITest sind zwei Module vorhanden, die diese Tests der Oberfläche erleichtern.

-- ReneeBaecker - 15 Apr 2009
Topic revision: 2009-04-15, ReneeBaecker
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.