Integrationstests mit JBoss Arquillian 1.0

Das Testen von Container-Komponenten im Java-EE-Umfeld ist eine anstrengende Sache. Denn automatisierte Testroutinen muss man sich mühselig selbst basteln. Mit der nun freigegebenen Version 1.0.0 des JBoss-Projekts Arquillian steht nun eine erste komplette Suite für Integrationstests zur Verfügung.

In Pocket speichern vorlesen Druckansicht
Lesezeit: 19 Min.
Von
  • Markus Eisele
Inhaltsverzeichnis

Das Testen von Container-Komponenten im Java-EE-Umfeld ist eine anstrengende Sache. Denn automatisierte Testroutinen muss man sich mühselig selbst basteln. Mit der nun freigegebenen Version 1.0.0 des JBoss-Projekts Arquillian steht nun eine erste komplette Suite für Integrationstests zur Verfügung.

Verglichen mit der Aufgabe der Arquillianer im Film "Men in Black" scheint die Mission des JBoss-Projekts Arquillian einfach. Man will kein Universum retten, sondern bloß einen einfachen Testrahmen bereitstellen, der alle Aufgaben des Container-Lebenszyklus und -Deployments vom Testaufbau separiert. Die Entwickler sollen eine breite Palette an Integrationstests für ihre Java-EE-Anwendungen erhalten. Besonders das isolierte Überprüfen fachlicher Komponenten war bisher teilweise unmöglich, da einfache Unit-Tests dafür vielfach nicht ausreichen. Ein Hauptgrund dafür liegt im Design der Komponenten, sie arbeiten nur selten vollständig autonom. Abhängigkeiten bestehen in der Regel zur Ablaufumgebung (Runtime) und zu anderen Komponenten.

Diese Aspekte sind für das Funktionieren eines Programmbestandteils jedoch genauso wichtig wie die fachlichen. Selbst bei sauberer Schichtentrennung benötigt man eine Kombination aus sogenannten Mocks (Schnittstellensimulationen) und Unit-Tests, um zumindest die Integrationsschnittstellen zu prüfen. Trotz aller Mühe bleibt das tatsächliche Verhalten der Komponente im Zielcontainer vollständig ungetestet. Weder Transaktionskontrolle, Dependency Injection noch andere, deklarative Dienste lassen sich ausreichend auf korrekte Funktion abklopfen. Meist bleibt es bis zuletzt offen, ob zur Laufzeit tatsächlich die gewünschten Dienste gebunden werden und die übergebenen Daten im richtigen Format ankommen. Das sicherzustellen ist allerdings ein wesentlicher Bestandteil von Entwicklungsprozessen, den man als Integrationstest bezeichnet.

Die Kunst, einen automatisierten Integrationstest zu entwerfen und regelmäßig durchzuführen, beherrschen nur wenige Entwickler, eine Tatsache, die viele Projekte instabil macht. Arquillian dämmt diese Schwierigkeiten ein. Das Framework ermöglicht Entwicklern das einfache Testen von Integrationsaspekten der in Containern ausgeführten Komponenten. Dabei ist es egal, ob es sich um einen lokalen (embedded) oder entfernten (remote/managed) Container handelt.

Mit Arquillian sind Integrationstests also ebenso einfach handhabbar wie Unit-Tests. Das gelingt, weil zum Testen der konkrete Container selber und nicht eine künstliche Laufzeitumgebung verwendet wird. Dabei ist die Geschichte von Arquillian an sich schon spannend. Angefangen hat alles 2009 als Test Harness für die CDI-Spezifikation (Context und Dependency Injection; JSR 299). Daraus hat sich das alleinstehende Arquillian-Projekt entwickelt, das eine vollständige Testplattform bietet, die auch das kommende CDI 1.1 (JSR 346) wiederverwenden wird.

Arquillian verbindet als übergeordnete Instanz ein Unit-Testing-Framework (JUnit oder TestNG), ShrinkWrap (JBoss Packaging for Java) sowie ein oder mehrere Container (Java EE Container, Servlet-Container, Java SE CDI et cetera, siehe Abbildung). Im Kern stellt Arquillian eine benutzerdefinierte Testumgebung (Test Runner) für JUnit beziehungsweise TestNG zur Verfügung. Sie delegiert die Kontrolle des Testlebenszyklus an die jeweiligen lokalen oder entfernten Container. Ein Arquillian-Testfall sieht fast genauso aus wie einer unter JUnit oder TestNG. Er kümmert sich um drei Dinge: den Zielcontainer für den Testfall, das Deployment und den Transport des Archivs in den Container.

Arquillian führt verschiedene Komponenten zusammen. Im Kern stellt das Framework eine Testumgebung für JUnit bzw. TestNG bereit.

Sowohl das Steuern des Containers als auch das Deployment haben nichts Magisches an sich, das Verpacken eines einfachen Testfalls in ein vom Container akzeptiertes Format hingegen schon. Letzteres erledigt ShrinkWrap, die Komponente, die als erste im Testlebenszyklus startet. Sie legt ein geeignetes Archiv zur Laufzeit an und richtet es auf dem Zielcontainer ein. Im Anschluss stößt sie das Deployment an, und die Testfälle werden durchgeführt. Abschließend wird das Archiv wieder vom Container entfernt. Als Runtime-Umgebungen kommen mittlerweile ein gutes Dutzend Produkte infrage, darunter JBoss AS (ab Version 4.2), Oracle GlassFish (ab 3.1), Jetty (ab 6.1), Tomcat (ab 5.5), Weld SE und EE 1.0/1.1, Apache OpenWebBeans 1.0, Apache OpenEJB 3.1, WebSphere 7 und 8 sowie WebLogic Server (ab 10.3)

Startpunkt für die ersten Gehversuche mit Arquillian ist die neue Arquillian-Website. Neben einer Menge von Schnelleinstiegen und Dokumentationen findet man dort auch den direkten Weg zum Sourcecode, der auf GitHub öffentlich verfügbar ist. Neben Maven 3 gehört auch ein JDK 1.5 oder besser neuer zu einer aktuellen Entwicklungsumgebung, wie Arquillian sie voraussetzt.