JavaFX testen mit Monocle


Ausgangssituation:
JavaFX ist laut Oracle die Nachfolgetechnologie für Swing. Da ich aktuell auch auf einige Merkwürdigkeiten bei Swing gestossen war, wäre es also durchaus sinnvoll, sich mit JavaFX zu beschäftigen.

Der erste Kontakt – irgendwann im Frühjahr 2014:
JavaFX wurde erst mit Java 8 so in die normalen Java-SE-Distribution aufgenommen, daß man keine Dependencyhandstände machen muß und keine zusätzlichen Jars deployed werden müssen. Ein erstes “Hello World” ist damit schnell gebaut. Unverständlicherweise gibt es von Oracle her kein UI-Testframework. Die Recherche im Internet liefert aber einige Drittanbieterbibliotheken für UI-Tests unter JavaFX. Das einfachste und leichtgewichtigste scheint derzeit TestFX zu sein. Auch damit lassen sich schnell erste Erfolge erzielen.

Testen im CI-Build – die Theorie:
Früher oder später sollen die Tests aber auch automatische z.B. im Maven-Build laufen, wofür ein Headlessmode benötigt wird. Bei JavaFX kann man dazu die Glass-Implementierung Monocle verwenden. Die nötigen VM-Parameter sind relativ leicht im Internet zu finden:

-Dglass.platform=Monocle
-Dmonocle.platform=Headless
-Dprism.order=sw

Testen im CI-Build – Praxis und Probleme:
Trägt man die gefundenen Informationen zusammen und versucht einen automatisierten Test, so stößt man alsbald auf eine ClassNotFoundException beim Laden der Klasse MonoclePlatformFactory. Dieses liegt daran, daß Monocle im aktuellen Entwicklungsstand nicht in den Desktopdistributionen von Java SE enthalten ist, wie dieser (jüngere) Beitrag in der OpenJDK-Entwicklermailingliste bestätigt:

This is an early access build and is not the final build of 8u20.
Monocle was mistakenly included in some of our early access builds, but
was removed prior to the fcs build.

Lösungen – Dezember 2014:
Im oben bereits erwähnten Diskussionsthread wird auf ein Subprojekt von TestFX verwiesen, wo die minimale, für headless Tests ausreichende Monocleversion hinterlegt ist: https://github.com/TestFX/Monocle. Hat man damit eine eigene Monocleversion gebaut verbleibt noch das Problem, daß Java bei der JavaFX-initialisierung aktuell wohl den Classpath ignoriert und nur Glass-Implementierungen lädt, die innerhalb der aktuellen JRE liegen.

Lösung: man erstellt eine Kopie des JDKs und kopiert die selbstgebaute Monoclebibliothek dort hinein nach jre/lib/ext.

Das neue JDK kann später durch ein reguläres Java-Release ersetzt werden, wenn Monocle mit ausgeliefert wird.

Update: Natürlich ist nicht alles ganz so einfach. Jetzt bin ich noch darüber gestolpert, das TestFX erstmal mit dem klassischen AWT-Robot arbeitet. Auf ustesis.wordpress.com steht dazu ja auch, daß man TestFX noch etwas refactoren müsse. Zum Glück sind die nötigen Änderungen dort schon eingeflossen. Allerdings scheint der aktuelle Build noch nicht in den öffentlichen Maven-Repos zu sein. Also ist auch hier nochmal Handarbeit nötig:

  1. Das Projekt https://github.com/TestFX/TestFX clonen.
  2. TestFX bauen und in das lokale Repository deployen.
  3. Die Mavendependency auf das neugebaute Artefakt ändern.
  4. Die VM-Options für die Tests um die um -Dtestfx.robot=glass ergänzen.

Bildquelle: http://commons.wikimedia.org/wiki/File:Lorgnette2BedfordMuseum.JPG

Advertisements
This entry was posted in Uncategorized and tagged , , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s