Name

JSFUnit 1.2.0

Homepage

http://www.jboss.org/jsfunit/

Lizenz

LGPL

Untersuchte Version

JSFUnit 1.2.0
Datum: 5.05.2010

Letzter Untersuchungszeitpunkt

JSFUnit 1.2.0
Datum: 5.05.2010

Kurzbeschreibung

JSFUnit ist ein Testframework für JSF Applikationen. Es wurde entwickelt, um Integrations- und Unittests von JSF Applikationen mit hilfe eines Frameworks zu vereinfachen. JSFUnit Tests werden im Container ausgeführt, was ihnen vollen Zugriff auf die Managed Beans, den FacesContext, EL Expressions und den internen JSF Komponentenbaum ermöglicht.

Fazit

JSFUnit ist im Allgemeinen ein gutes und zuverlässiges Testwerkzeug. Die Dokumentation hat einen relativ geringen Umfang, ist aber verständlich geschrieben und deckt die Grundlagen ab. Darüberhinaus ist der Benutzer aufgrund von mangelnden Informationsquellen auf Hilfesuche in Foren und Userblogs angwiesen.
Weiterhin wird das lesen des Stacktrace, und somit das Lokalisieren und Beseitigen von Fehlern, durch unverständlich formulierte Fehlermeldungen erschwert. Nachdem der Einstieg überwunden ist, erfolgt die Benutzung weitestgehend routiniert und einfach.

Einsatzgebiete

JSFUnit wird eingesetzt um JSF Anwendungen automatisiert zu testen. Es unterstüt verschiedene Methoden von Software-Tests. Durch die Automatisierung kann vor Allem der Aufwand bei regelmäßig durchzuführenden Regressionstests verringert werden.

Einsatzumgebungen

Bei JSFUnit handelt es sich um eine Javabibliothek, die unter jeder gängigen Java-Entwicklungsumgebung, wie z.B. Eclipse verwendet werden kann.

Installation

Um JSF und JSFUnit nutzen zu können, wird ein installierter, unterstützter Anwendungsserver benötigt. Eine Istallationsanleitung für Apache Tomcat befindet sich hier: Installation Apache Tomcat.

Dokumentation

Auf der JBoss Homepage sind verschiedene Guides zu finden:
Weitere hilfreiche Anleitungen:

Wartung der Projektseite

Die Projektseite von JSFUnit ist gut strukturiert und besitzt einen übersichtlichen Aufbau. Die Seite wird häufig gepflegt und bietet zusätzlich zur Dokumentation ein Wiki, ein Userforum, Mailinglisten und einen Blog mit Details zu aktuellen Versionen.

Nutzergruppen und Support

Auf der JBoss Webseite gibt es verschiedene Möglichkeiten Probleme zu melden oder über das Werkzeug im Allgemeinen zu diskutieren.
Das Wiki beinhaltet nützliche Informationen für den Einsteig in JSFUnit und listet weitere hilfreiche Links zu externen Seiten.
Im Userforum können Probleme & Lösungen diskutiert oder Erfahrungen mit anderen Entwicklern ausgetauscht werden.
Ähnlich wie das Forum bietet die Mailing Liste die Möglichkeit Erfahrungen auszutauschen und Probleme zu melden.
Im JSFUnit Blog werden nützliche Informationen zu neuen Updates aufgelistet.

Intuitive Nutzbarkeit

Anhand der Anleitungen kann ein erfahrener Nutzer problemlos einfache JSF Projekte erstellen und diese mit JSFUnit testen. Für Einsteiger kann es sich als kompliziert erweisen, Tests zu schreiben, die über den Umfang der Dokumentation und Beispiele hinaus gehen. Da gute, ausführliche Anleitungen von Drittanbietern schwer zu finden sind, ist der Benutzer in dem Fall auf Hilfe aus der Community angewiesen. Benutzer ohne Erfahrung im Arbeiten mit Frameworks in Java, stoßen dabei auf Schwierigkeiten.

Automatisierung

Test Cases kö:nnen automatisiert einzeln oder, zu Test Suiten gruppiert, stapelweise ausgeführt werden.

Abhängig davon, wie die Tests ausgeführt werden (siehe hier), werden die Ergebnisse im Fehlerfall Java üblich als Stacktrace, oder im HTML Format aufbereitet im Browser dargestellt.

Einführendes Beispiel

Beschreibung:

Zunächst wird Eclipse für den Einsatz von JSFUnit vorbereitet. Anschließend werden zwei Testfälle generiert und ausgeführt.
Um die Beschreibungen besser nachvollziehen zu können, richten sich die Beschreibungen nach einem Beispielprojekt.

Konfiguration von JSFUnit:

Um JSFUnit nutzen zu können, müssen zunächst ein paar Bibliotheken hinzugefügt werden: Die Versionen der Bibliotheken können natürlich geringfügig abweichen. Arbeiten Sie nicht mit dem Application Server von JBoss, so müssen noch 2 zusätzliche Bibliotheken hinzugefügt werden: Diese Libraries werden nach WEB-INF\lib kopiert. Anschließend muss im Eclipse-Project Explorer "Refresh" gewählt werden, damit Eclipse die neuen Libraries erkennt.

Anmerkung:
JSFUnit-Tests müssen im selben Projekt liegen wie die zu testende Anwendung, da sonst kein Zugriff auf den JSF-FacesContext möglich ist.

Cactus benötigt zusätzlich noch eine xsl Datei, die im WebContent Ordner platziert werden muss: cactus-report.xsl download (Diese ist bereits im o.a. Projekt vorhanden)

Jetzt müssen folgende Einträge in der web.xml hinzugefügt werden:

Die Testklasse

Die Testklasse hat folgenden Aufbau:

public class UnserTest extends ServletTestCase
{
...
}

Der Test ist erbt also von der Klasse org.apache.cactus.ServletTestCase. In einer static Methode wird die Testsuite erzeugt:

public static Test suite()
{
return new TestSuite( Test.class );
}

In Tests werden meist die folgenden zwei Membervariablen initialisiert:

private JSFClientSession client;
private JSFServerSession server;

Die Klasse org.jboss.jsfunit.jsfsession.jsfServerSession steuert die Zugriffe auf dem Server (Also Seitenaufrufe und Auswertung der Antworten).
Die Klasse org.jboss.jsfunit.jsfsession.jsfClientSession ist für das Ausfüllen und Abschicken der Formulare verantwortlich. Sie simuliert quasi den Benutzer.

In der überladenen Methode "setUp()" wird der Test initialisiert, d.h. die Startseite "Convertor.faces" (die JSP Seite im Beispielprojekt) wird aufgerufen und Client und Server werden initialisiert.

@Override
  public void setUp() throws IOException
  {
    JSFSession jsfSession = new JSFSession("/Convertor.faces");

    this.client = jsfSession.getJSFClientSession();
    this.server = jsfSession.getJSFServerSession();
  }

Jetzt folgt der eigentliche Test:

public void testConvertorInput() throws IOException
{
...
}

Testmethoden müssen immer mit "test..." beginnen, damit sie vom JUnit 3 Framework erkannt werden.

Testszenario

Es gibt viele verschiedene Möglichkeiten Tests durchzuführen. Hier versuchen wir zunächst, einen Eingabewert in das Inputfeld zu schreiben

public void testConvertorInput() throws IOException
{
	this.client.setValue("formular:inputfeld", "20");
	assertEquals("20", this.client.getElement("formular:inputfeld").getAttribute("value"));
}

Hinweis:Damit Komponenten auf der JSP Seite angesprochen werden können, ist es zwingend erforderlich, dort alle benötigten Komponenten mit id-Tags zu versehen

Im ersten Schritt wird also per setValue der Wert 20 in das Eingabefeld geschrieben und anschließend direkt wieder ausgelesen und überprüft ob der angegebene Wert wirklich hineingeschrieben worden ist.

Jetzt könnte man z.B. noch den Reset-Button testen. Da zuvor schon ein Test gelaufen ist, welcher eine Zahl in das Inputfeld geschrieben hat, kann zusätzlich der Resetbutton gedrückt und dann geprüft werden, ob wieder der Standardwert im Eingabefeld steht:

public void testConvertorReset() throws IOException
{
	this.client.click("formular:resetbutton");
	assertEquals("0.0", this.client.getElement("formular:inputfeld").getAttribute("value"));
}

Test ausführen

Es gibt mehrere Möglichkeiten Tests auszuführen. Zum starten aus einem Webbrowser, muss die folgende URL (eventuell angepasst) im Browser aufgerufen werden.

http://localhost:8080/FahrenheitJSF/ServletTestRunner?suite=test&xsl=cactus-report.xsl

wobei hier FahrenheitJSF der Name des Projektes und "test" der Klassenname unserer Testklasse ist. Es sollte sich ein Fenster öffnen mit einem Bericht, in dem ggf. die Fehlermeldungen enthalten sind.

Die zweite Möglichkeit ist, den Test direkt in Eclipse zu starten. Nach einem Rechtsklick auf die Testklasse, muss dafür Run As " Run Configurations ausgewählt werden.
Es öffnet sich ein Fenster, in dem die Art der Ausführung gewählt werden kann. Wenn die Testklasse dabei richtig erkannt wurde, ist die passende Option bereits ausgewählt. Statt Informationen in einem Link zu codieren, müssen sie jetzt als Argument übergeben werden. Dazu muss oben auf den Reiter Arguments geklickt werden:

und unter VM Arguments folgendes eingegeben werden:

(zum kopieren: -Dcactus.contextURL=http://localhost:8080/FahrenheitJSF/)

Jetzt kann durch einen Click auf Run gestartet werden. Das Ergebnis wird in der JUnit view angezeigt.

Im Erfolgsfall sieht das Ergebnis folgendermaßen aus:

Andernfalls werden auf der Rechten Seite Fehlermeldung und Stacktrace ausgegeben.

Nach Eintritt eines Fehlers oder dem Hinzufügen von neuen Testfällen, empfiehlt es sich, jedes Mal den Server neu zu starten, da sonst noch alte Daten im Cache liegen könnten, die das Ergebnis verfälschen.

Anmerkung

Überdeckungstools

Literatur



Zurück zur JSF-Werkzeugübersicht
Zurück zu den Werkzeugen
Zurück zur CSI-Hauptseite