Grafische Benutzeroberflächen mit SikuliX testen

Wie man mit dem Testframework SikuliX eine GUI testet möchte ich in diesem Tutorial beschreiben.

Die Webseite zum Testframework SikuliX ist komplett in englisch gehalten.
Des Weiteren ist diese Seite nicht wirklich übersichtlich und vieles erschließt sich nicht von selbst daher soll dieses Tutorial einen geordneten Überblick über das Testframework liefern.

Das Hauptaugenmerk soll jedoch auf die Erstellung von Testfällen in Oracle Java stehen.

Ab dem 22.08.2018 ist die neue Version 1.4 zum Download unter https://raiman.github.io/SikuliX1/downloads.html erhältlich. 
Der Entwickler verspricht mit dieser neuen Version eine deutliche Verbesserung der Erkennung von Bildern.

Testanwendung

In diesem Tutorial verwende ich eine einfache Oracle Java Swing Anwendung welche ich im Kapitel Downloads zum herunterladen anbieten möchte.

Oracle Java Swing Anwendung zum Testen des Testframeworks SikuliX
Oracle Java Swing Anwendung zum Testen des Testframeworks SikuliX

Die Anwendung verfügt über:

  • einen Titel,
  • mehrere Schaltflächen,
    • wobei sich zwei Schaltflächen wiederholen,
  • mehrere Textfelder
  • zwei Eingabefelder, und
  • eine Schaltfläche „OK“

Des Weiteren verfügt das Fenster über die Schaltflächen 

  • minimieren,
  • maximieren, 
  • schließen, sowie 
  • dem Kontextmenü des Icons
Standardkontextmenü einer Anwendung unter Microcosft Windows
Standardkontextmenü einer Anwendung unter Microcosft Windows

Erstellen von Testfälle

Einrichtung

Als erstes muss das JavaArchiv „sikulixapi.jar“ heruntergeladen und in das Projekt integriert werden. 

Build Tools 

Wenn ein Buildmanagement wie Apache Maven, Gradle oder ähnliches verwendet wird so findet man unter  https://www.mvnrepository.com/search?q=sikulix die benötigten Abhängigkeiten. Jedoch sind diese nicht auf den aktuell Stand, somit muss man ein lokales Repository anlegen und dort die JAR Datei ablegen.

Apache Maven Projekt einrichten

Wie man Apache Maven einrichtet habe ich im gleichnamigen Tutorial Maven: Einrichten von Apache Maven bereits erläutert. In diesem Kapitel möchte ich darauf eingehen wie eine lokale JAR Datei in Apache Maven eingebunden wird.

Ablage der JAR Datei „sikulixapi.jar“

Es ist von Vorteil die JAR Datei in das Projekt abzulegen.
Man kann diese auch extern ablegen, jedoch muss man dann bei einem exportieren des Projektes daran denken alle benötigten Ressourcen zusammenzutragen.

Ordnerstruktur - Ablage der lokalen JAR Datei für Apache Maven
Ordnerstruktur – Ablage der lokalen JAR Datei für Apache Maven

Hat man also nun die lokale Datei im Projekt (wie in der Grafik ersichtlich) abgelegt so muss man in der Datei „pom.xml“ folgenden Eintrag ergänzen:

Nachdem die Änderungen vorgenommen wurde, muss der Buildprozess mit „mvn install“ einmal angestoßen werden. Danach ist dann SikuliX im Projekt verwendbar.

Einbinden von JUnit5

Zusätzlich möchte ich JUnit5 nutzen um die Testfälle zu gruppieren.
Das Testframework JUnit5 wird als Dependency in der Datei „pom.xml“ eingebunden.

Eclipse Projekt

Der einfachste Weg ist wohl ein Eclipse Projekt, in diesem kann man dann die JAR Datei über das Kontextmenü „Build Path“ -> „Add to Build Path“ hinzufügen.

Eclipse - JAR zum Build Path hinzufügen
Eclipse – JAR zum Build Path hinzufügen

Java & JUnit

Nachdem die Einrichtung erfolgt ist können die ersten Testfälle erstellt werden, hier kann man entweder JUnit verwenden oder einfachen Java Code. Ich empfehle die Verwendung von JUnit.
Mit der neuen JUnit5 Version kann man mit Annotations  Testfälle gruppieren dieses hat den Vorteil das man ein Set erstellt und dann je nach belieben ausführen kann.

Das gesamte Eclipse Projekt findest du auch bequem zum Download am Ende dieses Tutorials.

Annotations zum Gruppieren von Testfällen

Ich erstelle mir hier 2 Annotations welche ich für die nachfolgenden Testfälle verwenden möchte.

Als erstes eine Annotation für alle Testfälle, dieses erlaubt mit mit nur einem Tag alle Testfälle auszuwählen.

Es soll einmal ein Set geben welches nur sehr wenige Testfälle ausführt, dieses kann zbsp. nützlichlich sein wenn man eine Änderung am Code durchgeführt hat und nur den einen Teil der Software testen möchte.

Nun noch ein Testset mit den Testfällen welche ausgeführt werden sollen wenn zbsp. weitreichende Änderungen durchgeführt wurden.

Bildausschnitte für die Testfälle erzeugen

Das Testframework SikuliX arbeitet mit Testausschnitten, d.h. es wird eine Region auf einer Anwendung als Bildschirmfoto aufgenommen und mit diesem Bild wird eine Aktion ausgeführt.

Greenshot

Die Bildschirmausschnitte erzeuge ich mit der Anwendung Greenshot.
Die Anwendung kann man kostenlos auf der Seite http://getgreenshot.org/downloads/ für Microsoft Windows heruntergeladen werden. Wenn du einen Mac hast dann bekommst du diese Software für 1.99$. („Ein Schelm, wer Böses dabei denkt.“)

Nach dem Download und der Installation kann man mit der Schaltfläche „druck“ auf der Tastatur Greenshot bequem starten. 
Sollte man ein Video gestartet haben, so wird dieses Bild eingefroren (läuft aber im Hintergrund weiter).

Bildformat und Größe

Die Anwendung Greenshot, bietet die Möglichkeit, die Bilder in den folgen Formaten zu speichern:

    • *.bmp
    • *.gif
    • *.jpg
    • *.png  
    • *.tiff 
    • *.ico

Von diesen genannten Bildformaten unterstützt das Testframework SikuliX jedoch  „nur“ *.jpg und *.png. 

Die Größe des Ausschnittes sollte so klein wie möglich, jedoch auch Redundanz frei sein.
Das heißt, im Idealfall sollte der Bildausschnitt, genau nur einmal auf dem Monitor präsent sein.

Wenn man eine klick Aktion mit hilfe eines Bildausschnittes erzeugen möchte so wird die Mitte des Bildes verwendet.
Diesen Umstand muss man beim erstellen der Bilder beachten.

Die IDE zum Testframework SikuliX biete hier eine Hilfe bei dem erzeugen der Bildausschnitte an und zeigt ein Kreuz im Bild an, so erkennt man wo genau die Aktion ausgeführt wird. Dieses kann zum Beispiel bei Checkboxen eine sehr gute Hilfe sein.

SikuliX IDE Bildschirmfoto
SikuliX IDE Bildschirmfoto

Multimonitor-Betrieb

Für Entwickler ist es heute üblich, nicht nur einen Monitor zu verwenden sondern min. 2 (auf arbeit habe ich sogar 3 Stück angeschlossen).
Das Testframework SikuliX kann in der aktuellen Version 1.4 nur auf dem Monitor 1 arbeiten d.h. Anwendungen welche auf dem 2ten bis nten Monitor laufen können nicht verarbeitet werden.

Testfälle

Testfall #1 – prüfen ob die Anwendung läuft

Als erstes prüfen wir, ob die Anwendung läuft. Dazu erstelle ich mir einen Bildausschnitt von der Titelleiste der Anwendung.

ABER Achtung, es muss hier unterschieden werden ob die Anwendung gerade den Fokus hat oder nicht.
Denn wenn die Anwendung nicht den Fokus hat, sind die Elemente (Icon, Text und Schaltflächen) grau.

Titel der Testanwendung
Titel der Testanwendung

Ich prüfe in diesem Testfall ob der oben gezeigt Bildausschnitt auf dem Monitor zu finden ist.
Wenn sich dieser Bildausschnitt nicht auf dem Bildschirm befindet so wird eine FindFailed Exception geworfen.

Was passiert hier?

In der Methode „setUp“, welche in diesem Testfall mit der Annotation „@BeforeAll“ anotiert wurde, wird das Objekt „Screen“ erstellt. Mit diesem Objekt kann man nun verschiedene weitere Methoden aufrufen welche auf dem Monitor ausgeführt werden sollen.

Die Methode „click(<<String>>);“ erwartet einen Dateinamen, diese Zieldatei muss ein Bild sein. Dieses Bild wird nun auf dem aktuellen Monitor gesucht und angeklickt.

Wenn der Bildausschnitt nicht gefunden wurde, so wird eine FindFailedException geworfen und der Testfall abgebrochen. In meinem Fall teste ich durch „assertDoesNotThrow“ das die Exception nicht geworfen wurde.

Testfall #2 – einen Bereich hervorheben

Man kann einen Bereich suchen und dann einen Rahmen mit einer beliebigen Farbe drumherum zeichnen.

Der erste Parameter der Methode „highlight“ ist die dauer der Anzeige des Rahmens, d.h. wie lange der Rahmen sichtbar ist.
Der zweite Parameter ist der Farbwert, in diesem Beispiel habe ich ein HEX Wert für die Farbe rot gewählt. Statt eines Hexadezimalen Wertes für die Farbe kann man auch das Wort auf englisch benutzen wie zbsp. „blue“, „red“ oder „green“.

Wenn man einen bestimmten Farbwert sucht, so kann man die Seite http://www.color-hex.com nutzen. Dort findet man immer den Hex Wert und den RGB Wert zu einer Farbe.

 

Testfall #3 – eine Schaltfläche anklicken

Nachdem die Anwendung gefunden wurde, möchten wir nun eine Aktion auf dieser ausführen. Dazu klicke ich die Schaltfläche „0“.

der Methode „click“ wird wiederum ein String übergeben welcher den Dateinamen zu einem Bild enthält.

Testfall #4 – ein Textfeld befüllen

Die Testanwendung enthält die Felder für „Vorname“ & „Name“ sowie die Schaltfläche „OK“.

Erzeugen wir nun einen Testfall in welchem wir den Vornamen „Max“ sowie den Nachnamen „Mustermann“ eintragen und die Schaltfläche „OK“ betätigen.
Nachdem die Schaltfläche „OK“ betätigt wurde, muss ein Dialog angezeigt werden in welchem diese Daten angezeigt werden.

Ergebnis

Dialog mit einem Rahmen
Dialog mit einem Rahmen

Testfall #5 – eine doppelt vorhandenes Element Testen

In meiner Testanwendung ist die Schaltfläche „1“ doppelt vorhanden.
Wenn man nun den Bildausschnitt um die Schaltfläche erstellt dann findet SikuliX diesen ausschnitt zwei mal.

Abarbeiten von doppelt gefundenen Elementen in einem JUnit Testfall.
Abarbeiten von doppelt gefundenen Elementen in einem JUnit Testfall.

In diesem Beispiel habe ich nun alle gefundenen Elemente mit einem grünen Rahmen, für 3 Sekunden markiert.

Resourcen zum Download

Testanwendung

 

Eclipse Projekt

 

 

 

Verwandte Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.