240 likes | 355 Views
Testen von Webanwendungen mit HttpUnit und Cactus. Volker Frehe. Agenda. Motivation Testen mit JUnit Testen mit HttpUnit Testen mit Cactus Zusammenfassung. Motivation. Webanwendungen werden immer komplexer Keine reine Informationsvermittlung Abwicklung von Geschäftprozessen Problem
E N D
Testen von Webanwendungen mit HttpUnit und Cactus Volker Frehe
Agenda • Motivation • Testen mit JUnit • Testen mit HttpUnit • Testen mit Cactus • Zusammenfassung
Motivation • Webanwendungen werden immer komplexer • Keine reine Informationsvermittlung • Abwicklung von Geschäftprozessen • Problem • Fehler öffentlich • Unzufriedene Kunden Vertrauensverlust • Falsche Rechnungen o.ä. Umsatzeinbußen • Fehlerbehebung im Endprodukt teuer oder unmöglich • Lösung • Testen während der Entwicklung (try & error) • Einsatz von Tools zum automatisierten Testen
Testen mit JUnit - Grundlagen • Open Source Framework zur Erzeugung von Unit-Tests für Java-Anwendungen • Unit-Tests testen Komponenten eines Systems, z.B. Klassen oder Methoden • Testfälle sind in Java geschriebene Klassen • Integration des Frameworks in Entwicklungsumgebung, wie z.B. Eclipse, möglich
Testen mit JUnit - Testaufbau • Aufbau der Testfälle nach folgendem Muster: • Aufbauen und Initialisieren der benötigten Strukturen (Erzeugung der notwendigen Objekte, …) • Aufruf der zu testenden Methode • Überprüfen der Methode (mit assert-Methoden) • Aufräumen der verwendeten Strukturen • Methoden setUp() und tearDown() werden vor bzw. nach jeder Testmethode zur Initialisierung und zum Aufräumen ausgeführt • Testmethoden werden testXXX() benannt um von JUnit automatisch erkannt zu werden – verschiedene Tests werden nacheinander ausgeführt
Testen mit JUnit - Testauswertung • Mit Assert-Methoden werden Test-Bedingungen formuliert welche wahr sein müssen • Häufigste verwendete Methode: assertEquals ([String message,] expected, actual) • message optionaler Parameter, welcher bei Fehlschlag ausgegeben wird • expected und actual werden auf Übereinstimmung getestet • assertEquals liefert true bei erfolgreicher Ausführung und false bei fehlgeschlagener Ausführung zurück • weitere Assert-Methoden z.B. für bestimmte Datentypen oder auf eine Bedingung
Testen mit JUnit - Testausführung • Ausführung der Testfälle mit dem JUnit TestRunner • 2 Arten von Testrunner – grafisch und textuell • Aufruf entweder direkt aus Entwicklungsumgebung oder per Kommandozeile • java junit.swingui.TestRunnerKlassenname • Ergebnis wird mittels farbigem Balken dargestellt (Fehler werden ebenfalls ausgegeben)
Testen mit JUnit - Beispiel • Zu testende Methode public double Wurzel(double Zahl){ … //eigene Methode zur Erzeugung einer Wurzel } • Testklasse import junit.framework.*; public class TestRechner extends TestCase{ public TestRechner(String name){String name} super(name); } public void testWurzel(){ double Zahl = 276545; Wurzel1 = Wurzel(Zahl); Wurzel2 = Math.sqrt(Zahl); asserEquals(Wurzel2, Wurzel1, 0.0001); //0.0001 = Genauigkeit } public static void main(String[] args) { junit.swingui.TestRunner.run(TestRechner.class); } }
Testen mit HttpUnit - Grundlagen • Framework zur Erweiterung von JUnit zur Ausführung von funktionalen Tests für Webseiten • Schnittstelle zwischen Testprogramm und Http-Protokoll • Simuliert Eigenschaften eines Browsers zur Http Authentifikation • Bereitstellung von Methoden zum Umgang mit • Formularen • Tabellen • Links • Cookies • Frames • Sessions • …
Testen mit HttpUnit - Anfrage • 3 Klassen zum Senden einer Anfrage und Empfangen des Resultates notwendig • WebConservation • baut Verbindung auf und startet die Sitzung • WebRequest • formuliert Anfrage welche an Server gesendet wird • Web Response • erhält Antwort vom Server • Beispiel: WebConservation conv = new WebConversation(); WebRequest req = GetMethodWebRequest("http://www.url.de"); WebResponse response = conv.getResponse(req);
Testen mit HttpUnit - Formulare • Methoden zum ausführen von Formularen • Mit Methode getForms() der Klasse WebResponse Auswahl des relevanten Formulars • getRequest() wählt Ziel-Url des Formulars • setParameter() füllt Formulardaten aus • Beispiel WebConversation conv = new WebConversation(); WebResponse resp = conv.getResponse("http://www.url.de"); WebForm form = response.getForms()[0]; WebRequest loginreq = form.getRequest(); loginreq.setParameter ("username", Volker); loginreq.setParameter ("password", meinPasswort); WebResponse loginresp = conv.getResponse(loginreq);
Testen mit HttpUnit - Selektion • Selektion von Teilen der Antwort zur Analyse durch diverse Methoden der Klasse WebResponse möglich • getTables()[0] liefert erste Tabelle als WebTable Objekt (Zugriff auf einzelne Zellen möglich) • getText() liefert Antwort als kompletten Text (inklusive Header) • getTitle() liefert Seitentitel • getNewCookieNames()[] listet alle Cookies auf – Werte können mit getNewCookieValue(String name) ausgelesen werden • ... • getDOM() liefert ein org.w3c.dom.Document • Baumstruktur ermöglicht Suchen nach Inhalt • Auswahl z.B. über XPath
Testen mit HttpUnit - Auswertung • Auswertung der Ergebnisse durch von JUnit bereitgestellte assert-Methoden • Ergebnis-Darstellung im JUnit TestRunner • Beispiel eines Login-Testfalls: import junit.framework.*; import com.meterware.httpunit.*; public class TestWebSite extends TestCase{ public TestWebsite(String name){ super(name); } public void testLogin(){ WebConversation conv = new Webconversation(); WebResponse resp = conv.getResponse("http://www.url.de"); WebForm form = response.getForms()[0]; WebRequest loginreq form.getRequest(); loginreq.setParameter ("username", Volker); loginreq.setParameter ("password", meinPaswort); WebResponse loginresp = conv.getResponse(loginreq); assertEquals ("Interner Bereich", loginresponse.getTitle()); } public static void main(String[] args) { junit.swingui.TestRunner.run(TestWebsite.class); } }
Testen mit HttpUnit - Zusammenfassung • Ausführung von funktionalen Tests von Webanwendungen • Umgang mit Formularen möglich • Überprüfung der zurück gelieferten Daten mit Hilfe der JUnit assert-Methoden • Testen beschränkt sich auf zurück gelieferte Seiten • Quelltext muss (meist) nicht bekannt sein • aber Informationen über die erwarteten Ergebnisse
Testen mit Cactus - Grundlagen • Open Source Framework zur Erweiterung von JUnit zum Testen von serverseitigen Java-Anwendungen • Testen von Servlets, JSPs, Filtern und EJBs möglich • Installation auf Client sowie auf Server notwendig • Ausführung der Tests auf Client, sowie auf Serverseite • 2 Http-Kanäle werden geöffnet • Weitere Betrachtung nur von Servlets • hohe Übereinstimmung zu JSPs, Filtern und EJBs
Testen mit Cactus - Funktionsweise • begin() und end() werden auf Clientseite vor bzw. nach jedem Test ausgeführt • setUp() und tearDown() verfahren ebenso auf Serverseite • beginXXX() und endXXX() werden auf Client für den spezifischen Testfall vor Übermittlung an bzw. nach Empfang der Daten von dem Redirector ausgeführt • Redirector arbeitet als Schnittstelle – Übergabe der Daten von Client an Server, so wie Sammlung und Rücklieferung der Ergebnisse
Testen mit Cactus - Redirector • Redirector arbeitet auf Serverseite wie TestRunner auf Clientseite • Verschieden Java-Anwendungen benutzen verschiedene Redirector • Eintrag in web.xml Datei auf Server bestimmt welcher Redirector benutzt wird und wo er liegt • Beispiel-Eintrag zum Testen von Servlets: <filter> <filter-name>ServletRedirector</filter-name> <filter-class> org.apache.cactus.server.ServletTestRedirector </filter-class> </filter> <filter-mapping> <filter-name>ServletRedirector</filter-name> <url-pattern>/ServletRedirector</url-pattern> </filter-mapping>
Testen mit Cactus – Anfrage • Die Anfrage an den Server wird auf Clientseite in der beginXXX()-Methode erstellt public void beginXXX(WebRequest theRequest){ theRequest.setURL("url.de", "/app", "test.jsp", null, null); } • Weitere Parameter zur Ausführung des Servlet können mit setParameter() hinzugefügt werden • Methoden auf Serverseite wird das erstellte WebRequest Objekt automatisch unter dem Namen request zur Verfügung gestellt
Testen mit Cactus – Auswertung • Auswertung auf Server und auf Clientseite • Auf Serverseite in der Methode testXXX() • Initialisierung des Servlets • Ausführung einzelner Methoden des Servlets • Überprüfung durch assert-Methoden • Ergebnisse werden vom Redirector gesammelt und zusammen mit der zurück gelieferten Seiten an den Client geschickt • Auswertung des Resultats in der endXXX() Methode auf Clientseite • Fehler (aus endXXX() und testXXX()) werden im TestRunner ausgegeben
Testen mit Cactus – Beispiel 1/2 • Servlet bekommt eine Zahl übergeben, quadriert sie und liefert das Ergebnis zurück: import java.io.*; import javax.servlet.*; public class RechnerServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; response.setContentType("text/html"); out = response.getWriter(); out.println("<html><head><body>"); out.println("Ergebnis: "+quadrat(request.getParameter("zahl"))); out.println("</body></html>"); out.close(); } public double quadrat(double x){ return (x*x); } }
Testen mit Cactus – Beispiel 2/2 • Test import junit.framework.*; import org.apache.cactus.*; public class TestRechner extends TestCase{ public TestRechner(String name){ super(name); } public void beginQuadrat(WebRequest theRequest){ theRequest.setURL("url.de", "/mywebapp", "rechner.jsp", null, null); theRequest.setParameter("zahl", "3"); } public void testXXX(){ Rechnerservlet servlet = new Rechnerservlet(); servlet.init(config); assertEquals("25", servlet.quadrat(5)); } public void endXXX(WebResponse theResponse){ assertEquals("Ergebnis: 9", theResponse.getText()); } public static void main(String[] args) { junit.swingui.TestRunner.run(TestRechner.class); } }
Testen mit Cactus - Zusammenfassung • Möglichkeit Servlets, JSPs, Filter so wie EJBs zu testen • JSPs, Filter und EJBs synonym zu Servlets, lediglich kleine Änderungen (z.B. Redirector) • 2 verschiedene Tests • Clientseite testet zurück geliefertes Ergebnis • Serverseite testet einzelne Methoden • Um einzelne Methoden zu prüfen, muss Quelltext bekannt sein
Zusammenfassung und Fazit • Cactus und HttpUnit bieten unterschiedliche Testarten für Webseiten • HttpUnit • Testet Webseiten auf Funktionalität • Keine Informationen über Quelltext nötig • Cactus • Testet serverseitige Java-Anwendungen • Test des gesamten Servlet als auch einzelner Methoden • Informationen über Quelltext nötig • Keine Konkurrenz zwischen den Frameworks, sondern Ergänzung • Mittlerweile Integration von HttpUnit in Cactus möglich
Ende Vielen Dank für die Aufmerksamkeit!