JavaEE Testing-Projekt "Aliens JSP"

Auf der sicheren Seite mit Testing

Wer Qualität erzeugen und gewährleisten möchte, der kommt nicht um das Thema "Automatisiertes Testing" schon lange nicht mehr herum. Lange Zeit galt die JavaEE-Welt als nur schwer oder garnicht testbar, oftmals wurde alles nur händisch oder nur die halbe Wahrheit getestet.

Testing alleine ist noch kein Allheilmittel gegen Konzeptionsfehler, hilft aber solche nicht nur ausfindig zu machen, sondern auch nachträgliche Korrekturen oder Anpassungen im Einklang der gesamten Applikation zu bringen. Leider wird oftmals eine Testabdeckung angefordert, doch die Qualität des Tests ist damit noch lange nicht erzeugt. Viel zu oft birgt die neue Erweiterung den zufälligen Tod der restlichen Features auf der Website, und wird meist mit dem berühmten "bei mir läuft's" quittiert.

JSFUnit the hero
Durch ein JSF-Projekt im Rahmen meiner Arbeit bin ich dann auf JSFUnit gestoßen, natürlich auch direkt gescheitert, da dies nicht so, wie es angab, mit meinem Testing-Framework TestNG zurecht kommen wollte. Nach intensiver Recherche (und einem Stackoverflow-Eintrag später) habe ich dann aufgehört mich mit JSFUnit zu beschäftigen und nach anderen Alternativen gesucht, schon weil die Entwicklung an JSFUnit mittlerweile gestorben war.

Arquillian to the rescue
Einige Zeit später habe ich dem Thema Testing dann doch wieder Zeit widmen können und bin auf Arquillian gestoßen, welches das Leiden des ungetesteten Codes bezwingen sollte, sogar Support für TomEE und TestNG hat es mitgebracht.

I can see Aliens (JSP)

Man nehme ein bisschen Maven, eine Idee Bootstrap, dann noch ein bisschen Java und ganz viele Aliens, schon ist das erste Projekt geboren.

Das Netz wimmelt nur so vor lauter Aliens, allerdings habe ich bisher noch kein Projekt gefunden, dass möglichst viele Test-Arten in einem einzigen Projekt vereint. Natürlich wollte ich auch Support für SonarQube (ehemals Sonar) und Unterstützung für alle drei großen Betriebssystem-Arten direkt zur Verfügung haben. Und was macht der findige Entwickler, der sowas nicht finden kann? Genau, er baut sich mangels vorhandener Alternative solch ein Projekt selbst, und genau das habe ich auch getan: eine Kommunikationsplatform für Entführte von Aliens und andere Verschwörungen.

Was ist alles an Technik drin?
Das ganze Projekt ist ein JavaEE-Webprojekt, welches in JSP umgesetzt ist. Für die Speicherung der Daten wurde auf JPA 2 gesetzt, die Persistenz wird dabei durch EclipseLink übernommen. Für das automatisierte Testing habe ich Arquillian und diverse Extensions (Drone, Graphene, Warp, ...) verwendet, um dadurch meine Applikation weitestgehend durchtesten zu können. Damit auf dem lokalen Entwicklungsrechner und auch auf dem Continuous Integration-System (z.B. Jenkins) nicht unterschiedliche Browser verwendet werden bzw. installiert werden müssen, setze ich in meinem Setup den Headless-Browser PhantomJS ein, welcher dank WebDriver-Schnittstelle (danke hierbei an die Entwickler von Selenium) wunderbar mit Arquillian zusammenarbeitet und damit ein allumfassendes Projekt hergibt.

Was für Testarten sind alle enthalten?

Für mich war es wichtig, dass man nicht nur den Erfolg oder die Niederlage sieht, sondern auch, dass man den Umfang der Tests irgendwo optisch erfassen kann, und genau hier kommt dann auch SonarQube zum Einsatz. Zeitgleich wollte ich aber keine getrennten Projekte erzeugen, da ich das als unnötigen Overhead empfinde und größtenteils eher für Verwirrung stiftet als für Ordnung. Doch ein großes Lob für das nächste Tool, was wichtig für mich war und mir überhaupt die Nutzung von SonarQube ermöglicht hat: JaCoCo.

Was für Probleme gab es?
Es hat sich hier mal wieder gezeigt, dass das von mir gemochte Testing-Framework TestNG nicht ausreichend unterstützt wird, obwohl es angeblich damit gehen sollte, vielleicht habe ich aber auch etwas übersehen.
Man sollte immer Bedenken, dass, gerade bei richtig großen Systemen, die schwergewichtigen Tests richtig lange brauchen können, bis sie durchgelaufen sind. Vor allem wenn man durch das CI-System diese Tests ausführen lassen möchte, und nicht auf der lokalen Entwicklungskiste, müssen diverse Tricks heraus gekramkt werden, damit all diese Wünsche auch in Erfüllung gehen können. Leider wurde ich auch hier wieder etwas enttäuscht, denn TestNG und JUnit werden selbst von Arquillian nicht vollständig gleichwertig versorgt, daher habe ich innerhalb des Projektes sogar die Testing-Frameworks mischen müssen und beides gleichzeitig eingesetzt: JUnit und TestNG, getrennt durch Maven-Profile.
Mittlerweile bin ich auf JUnit zurückgefallen und kann durch mehrere Maven-Failsafe-Plugin-Executions meine Funktionalen Tests und meine Integrationstests sehr gut einsetzen, sogar ohne dem Umweg der Maven-Profile.

work in progress