9.3. Unittests mit Cactus

Cactus erweitert JUnit und liefert alles was zum Testen von Servlets, JSP-Seiten und Filtern gebraucht wird:

9.3.1. Installation

Nach dem Download des Cactus-Archivs (aktuell ist z.Z. Cactus-1.5) muss man zunächst dafür sorgen, dass alle Jar-Files, die auf der Server-Seite gebraucht werden im jeweiligen Container gefunden werden. Mit Tomcat geht das am einfachsten so, dass man die JARs aspectjrt.jar, cactus.jar, commons-logging.jar, commons-httpclient.jar und junit.jar (jeweils mit Versionsnummer) in den „common/lib“-Pfad von Tomcat kopiert. Alternativ kann man all diese JARs auch jeweils ins Lib-Verzeichnis der Web-Applikation kopieren. Dann steht die Testmöglichkeit mit Cactus eben nicht allen Web-Applikationen automatisch zur Verfügung, sondern immer nur der einen, die die JARs auch mitbringt.

Anschließend wird ein spezielles Servlet, der „ServletTestRunner“, entweder in der globalen web.xml oder in der web.xml der jeweiligen Applikation konfiguriert.

Die globale web.xml von Tomcat findet sich in „conf/web.xml“. Zwei Abschnitte sind einzufügen[7]:

Am Anfang:

<servlet>
   <servlet-name>ServletTestRunner</servlet-name>
   <servlet-class&gt;
     org.apache.cactus.server.runner.ServletTestRunner
   </servlet-class&gt;
</servlet>

Und am Ende:

<servlet-mapping>
     <servlet-name>ServletTestRunner</servlet-name>
     <url-pattern>/ServletTestRunner</url-pattern>
</servlet-mapping>

9.3.2. Ein erster Test

Als zweiten Schritt muss man nun noch einen Test schreiben, der ein Servlet testet und seiner Web-Applikation hinzufügen. Hierzu wird einfach eine Klasse erzeugt, die „ServletTestCase“ erweitert und ähnlich wie bei JUnit eine oder mehrere testXxx-Methoden enthält. Beispiel:

import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import de.rinke.SaveToSessionServlet;
public class TestServlets extends ServletTestCase
{
     public TestServlets(String theName)
     {
         super(theName);
     }
     public static Test suite()
     {
         return new TestSuite(TestServlets.class);
     }
     public void beginSaveToSessionOK(WebRequest webRequest)1
     {
         webRequest.addParameter("testparam", "it works!");
     }
     public void testSaveToSessionOK()1
     {
         SaveToSessionServlet servlet = new SaveToSessionServlet();
         servlet.saveToSession(request);
         assertEquals("it works!", session.getAttribute("testAttribute"));
     }
     
     public void testHelloWorld() {1
         assertNotNull( null );
     }
}
  • Als Erweiterung zu normalen Unittest mit JUnit wird der Aufruf des Servlets mit beginXxx Methoden vorbereitet. Hier werden bestimmte Parameter in den Request „eingesetzt“, die das Servlet als Aufrufparameter erwartet. Normalerweise kommen diese Parameter aus dem Request des Browsers im TestCase werden die Parameter extra erzeugt.
  • Dieser Test wird dann erfolgreich sein, wenn das Servlet ein bestimmtes Attribut in der Session erzeugt. Das passende Servlet zu schreiben sollte nicht schwer fallen.
  • Dieser Test wird immer scheitern, weil eine der Assert-Methoden hier „assertNotNull“ also „stelle sicher, dass ungleich null“ direkt mit „null“ aufgerufen wird. Dies ist hier nur zum Ausprobieren eingesetzt, um zu demostrieren, wie ein TestCase scheitert.

Wenn man ein solches Projekt anlegt und die richtige URL im Browser aufruft, wird der TestCase auf dem Server ausgeführt und das Ergebnis angezeigt (http://localhost:8080/tomcat-test/ServletTestRunner?suite=de.rinke.test.TestServlets):

Abbildung 9.1. Testergebnis in XML

Wenn man das Ganze noch etwas hübscher aussehen lassen will, kann man noch ein Stylesheet hinzufügen und schon sieht das so aus (http://localhost:8080/tomcat-test/ServletTestRunner?suite=de.rinke.test.TestServlets&xsl=cactus-report.xsl):

Abbildung 9.2. Testergebnis mit einem Stylesheet formatiert

Das komplette Projekt kann man hier herunterladen.

Fussnoten

[6] Leider funktioniert das aktuelle Cactus-Plugin nicht richtig mit Eclipse 2.1