Java Swing GUI Test mit AssertJ

Logo von Oracle Java
Logo von Oracle Java

Wie man eine JavaFX Anwendung testet habe ich bereits im Tutorial JavaFX: Automatisierte GUI Test mit JUnit und TestFX erläutert. In diesem Tutorial möchte ich nun auf das Testen einer Oracle Java Swing Anwendung eingehen.

Testprojekt anlegen

Als erstes richte ich ein kleines Oracle Java 8 Projekt mit Apache Maven in der Entwicklungsumgebung Eclipse ein.

Blankes Maven Projekt in Eclipse erzeugen

Schritt 1 - Navigiere üb er das Menü "File" -> "New" zu "Maven Project"
Schritt 1 – Navigiere üb er das Menü „File“ -> „New“ zu „Maven Project“

 

Schritt 2 - Markiere die Checkbox "Create a simple...."
Schritt 2 – Markiere die Checkbox „Create a simple….“

 

Schritt 3 - Eingeben der Metadaten zum Projekt
Schritt 3 – Eingeben der Metadaten zum Projekt

Einfaches Swing Projekt erzeugen

Nach dem Eclipse das Maven Projekt mit der Typischen Struktur angelegt hat erzeugen wir nun eine kleine GUI welche wir mit AssertJ testen wollen.

SimpleSwingGui für AssertJ Tests
SimpleSwingGui für AssertJ Tests

Die „Anwendung“ enthält zwei Eingabefelder für den Vornamen & dem Nachnamen sowie eine Schaltfläche mit der Bezeichnung „say Hello“.

Dieses ist wirklich minimalistisch gehalten soll aber für dieses Tutorial ausreichen.

 

AssertJ im Projekt einrichten

Da ich das Projekt mit Apache Maven erzeugt habe kann man hier bequem die Abhängigkeiten (Dependencies) des Projektes in der pom.xml hinzufügen.

Es werden zusätzlich die Abhängigkeiten für JUnit & Hamcrest benötigt.

Nachdem die Datei pom.xml um die oben genannten Abhängigkeiten erweitert wurde muss das Projekt neu gebaut werden, dazu wird der Befehl

auf dem Projekt ausgeführt.

Ersten JUnit Test anlegen

Wollen wir also als erstes die GUI mit den folgenden Funktionen testen:

  • Eingabe von Vorname & Nachname,
  • Betätigen der Schaltfläche,
  • Öffnen des Hinweisdialoges,
    • Betätigen der Schaltflächen „OK“ & „Abbrechen“

Video

Während der Ausführung des Test sollte die Tastatur und die Maus nicht betätigt werden denn damit würde man den Testfall zu stoppen bringen.

Ausführen eines einfachen AssertJ Testfalls aus Eclipse

Das Video habe ich in 1/4 der Geschwindigkeit abgespielt damit man etwas sieht. D.h. solltest du den Test nachbauen wirst du je nach Rechenleistung mehr oder weniger von der Ausführung sehen.

Ein komplexes Beispiel

Nachdem wir nun ein einfaches Beispiel erzeugt und erläutert haben wollen wir nun ein kleinen Businessprozess in einer Beispielanwendung „durchspielen“.

Die „Anwendung“ hat folgende Funktion:

  • aufnehmen einer Adresse,
  • aufnehmen eines Alters (nur ganze Zahlen zwischen 1 und 100),
  • Schaltfläche zum
    • übernehmen,
    • zurücksetzen der Daten
  • Tabelle welche die Werte
    • ID (Timestamp),
    • Adresse,
    • Alter,
    • Zeitstempel (Formatiert) anzeigt
  • Schaltflächen für
    • exportieren (CSV Format), oder
    • importieren (CSV Format) der Daten
    • Schließen der Anwendung
Eine etwas komplexere Swing Anwenundg zum Testen
Eine etwas komplexere Swing Anwenundg zum Testen

Quellcode

Die nachfolgende Klasse befindet sich im Projekt „SwingTest“ welches ich am ende dieses Tutorials zum Download anbiete.

Erstellen der Testfälle

Es wird nun die Swing Anwendung getestet. Dazu erzeuge ich ein neues Maven Projekt in Eclipse und werde dort die oben genannte Klasse hineinkopieren und verwenden.

Video

Im nachfolgenden YouTube Video möchte nun ausführlich erläutern wie man das Maven Projekt mit AssertJ, JUnit einrichtet.

Sollte eine Frage offen bleiben dann kannst du mir diese gerne als Kommentar oder per E-Mail hinterlassen.

 

Troubleshooting

Fehlerhafte Darstellung des Fensters

Beim erzeugen der TestCases ist mir zuerst aufgefallen dass, das Fenster nicht korrekt dargestellt wurde. Ich habe zuerst das java.awt.FlowLayout verwendet, wenn die Anwendung „normal“ gestartet wurde sah alles gut aus (siehe Bild oben) jedoch beim  ausführen des Testfalls wurde das komplette Layout verändert.

Verändertes Layout während der Ausführung von AssertJ Testfall.
Verändertes Layout während der Ausführung von AssertJ Testfall.

Nach einer kurzes suche, habe ich zu diesem Fehler nichts gefunden aber viele Beispiele zu diesem Testframework und dort habe ich gesehen das nirgends das FlowLayout verwendet wird. Daher gehe ich mal davon aus das der Fehler bekannt ist.

Ein wechsel vom FlowLayout zum MigLayout brachte den erhofften Erfolg.

Diese Lösung ist für das erzeugen von Testfällen in bereits bestehende Projekte eigentlich ein K.O. Kriterium.

ComponentLookupException: Unable to find component using matcher

Wenn man einen Test auf einer java.awt.Component ausführen möchte so „holt“ man sich das Objekt vom aktuellen Fenster mit:

Wenn dieses Objekt aber nicht sichtbar ist dann erhält man folgende Exception

Der wichtige Teil dieser Exception ist dass, das Framework erwartet das die Komponente sichtbar ist („requireShowing=true“).

Wie kann man also eine Komponente suchen (und im Idealfall finden) welche nicht sichtbar ist?

Dafür gibt es die Matcher für so ziemlich jede JComponent gibt es einen entsprechenden Matcher, diese beginnen mit <JComponentName>Matcher.
In diesem Fall musste ich den JLabelMatcher verwenden.

Nun wurde die Komponente gefunden under Test war „grün“.

Download

Damit man bequem das gesamte Tutorial durchspielen kann, möchte ich hier nun das Eclipse Projekt zum Download anbieten.

 

Quellen und Referenzen

Auf der Seite der Entwickler findet man einen Link zu den Java Doc’s  sowie zu den Seiten wie man das Testframework einrichtet.

Fazit

Mit dem Testframework AssertJ und JUnit kann man relativ einfach und vorallem schnell einen Testfall erzeugen. Da ich in meinen Projekten immer (bzw. wenn möglich) Apache Maven verwende kann ich diese Testfälle einfach beim Build automatisch starten.

 

 

Ersten Kommentar schreiben

Antworten

Deine E-Mail-Adresse wird nicht veröffentlicht.


*