JSFUnit 1.2.0
http://www.jboss.org/jsfunit/
LGPL
JSFUnit 1.2.0
Datum: 5.05.2010
JSFUnit 1.2.0
Datum: 5.05.2010
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.
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.
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.
Bei JSFUnit handelt es sich um eine Javabibliothek, die unter jeder gängigen Java-Entwicklungsumgebung, wie z.B. Eclipse verwendet werden kann.
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.
Auf der JBoss Homepage sind verschiedene Guides zu finden:
Weitere hilfreiche Anleitungen:
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.
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.
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.
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.
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:
- jboss-jsfunit-core-1.2.0.Final.jar
- aspectjrt-1.2.1.jar
- cactus-13-1.7.1.jar
- junit-3.8.1.jar
- nekohtml-1.9.14.jar
- htmlunit-2.7.jar
- htmlunit-core-js-2.7.jar
- cssparser-0.9.5.jar
- commons-httpclient-3.1.jar
- commons-io-1.4.jar
- sac-1.3.jar
- commons-lang-2.4.jar
- commons-codec-1.4.jar
- commons-logging-1.1.1.jar
- commons-collections-3.2.jar
- cactus-ant-13-1.7.1.jar
- cargo-0.5.jar
- ant-1.5.4.jar
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:
- xercesImpl-2.8.1.jar
- xalan-2.7.0.jar
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
- JUnit-version:
- JSFUnit benötigt JUnit 3.8.1, weil die Klasse "junit.runner.TestSuiteLoader" benötigt wird. In JUnit 4+ ist diese Klasse nicht vorhanden.
- JDK-version:
- Mindestens Java 1.5 ist für JSFUnit erforderlich, da der Quellcode von JSFUnit Generics, etc. verwendet.
Überdeckungstools
Zurück zur JSF-Werkzeugübersicht
Zurück zu den Werkzeugen
Zurück zur CSI-Hauptseite