Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Test infected: Web Testing mit HttpUnit und Cactus Framework

Ähnliche Präsentationen


Präsentation zum Thema: "Test infected: Web Testing mit HttpUnit und Cactus Framework"—  Präsentation transkript:

1 Test infected: Web Testing mit HttpUnit und Cactus Framework
Peter Roßbach

2 Agenda Web Komponenten Test Build Verification Anmerkungen JUnit
HTTPUnit ServletUnit Cactus Build Verification cruisecontrol Anmerkungen

3 Motivation XP-Techniken für das Testen
Kostengünstige Lösung für das Testen von Web-Anwendungen Automatisierung der Erzeugung Automatisierte Tests Protokollierung und Benachrichtigung der Tests Teamentwicklung fördern

4 JUNIT ANT *..* Tomcat

5 Testing Game Coding Planning Game Standards Programming Simple Design
Short Releases Refactoring Testing Continuous Integration

6 Ziele Unit Test während der Entwicklung
Funktionale Test für Web-Anwendungen Automatisierung der Erzeugnisse Versionisierung Protokollierung Lasttest

7 Effektiv Testen möglichst zeitnah zur Programmierung
automatisiert und damit wiederholbar muss Spaß machen Testen so oft wie Kompilieren so einfach wie Kompilieren Fehler finden, nicht Fehlerfreiheit beweisen

8 TestArten Unit Tests White-Box Tests isolierter Einheiten
Akzeptanztests Black-Box Tests funktionaler Anforderungen weitere Systemtests Lasttests Performanztests Usability-Tests ...

9 Junit Java-Framework zum Schreiben und Ausführen automatischer Unit Tests Tests werden in Java codiert. Entsprechende Frameworks sind für andere Programmiersprachen erhältlich. Autoren Kent Beck and Erich Gamma

10 Anforderung verfeinern
JUNIT Testprozess Klasse Testcase Anforderung klären Rumpf anlegen Testcase schreiben Kompilieren Testcase ausführen Funktionalität implementieren Testcase scheitert Nächste Anforderung Testcase erfolgreich Anforderung verfeinern Refactoring

11 JUNIT PizzaBinderTest
package de.objektpark.jspTutorial.model; import junit.framework.*; public class PizzaBinderTest extends TestCase { public PizzaBinderTest (String testName) { super(testName); } public static Test suite() { return new TestSuite(PizzaBinderTest.class); } protected void setUp() throws Exception { ... } protected void tearDown() throws Exception { ... } public void testBind() throws Exception { List objects = null; objects = retriever("pizza"); assert(" no pizza bind", objects.get(0) instanceof Pizza);

12 JUNIT SwingUi

13 JUNIT Testtipps Jeder Aspekt der Klasse sollte einem Test unterzogen werden: Randparameter Test Unzulässige Werte Schleifeninvarianten Sie können nur die Funktionsergebnisse testen: Returnwerte Zustand der Objekte

14 JUNIT Testtipps Schreiben Sie kleine Methoden in Ihren Klassen und in den TestCases. Schreiben Sie die Test i.d. Regel vor Implementierung oder nahezu zeitgleich. Keine gleichzeitige Verbesserung des Codes und Korrektur von Fehlern.

15 JUNIT Testtipps Trennung von Testvorgehen Bug Fixing Refactoring
Re-Design Neue Funktionalitäten Testvorgehen Bottom Up Top Down

16 JUNIT Web-Testumgebung
Jakarta Ant 1.4.1 Intellij IDEA 2.5 Jakarta Tomcat od 4.1.0 James 2.0.2 HttpUnit Cactus CruiseControl

17 Agenda Testing J2EE Testanforderung HttpUnit SerlvetUnit Cactus

18 J2EE Application Server
J2EE Umgebung Client Applikations Logik EIS JDBC Web Container RDMS (X)HTML / XML Java Mail Servlets JSPs TagLibs Mail Server J2EE Application Server Java APIs RMI Java Applet Java App EJB Container IIOP Corba (Java) Application JNDI Session Beans MessageDriven Beans Entity Beans DS JMS Java APIs Message Queue

19 J2EE Test Anforderung Trennung von Kommunikation und Funktionalität
Testbarkeit der Komponenten im Entwurf berücksichtigen Verwendung des erprobten JUNIT-Framework Test von Java Klassen ohne Server Deployment Test von Servlet/JSP oder EJB, die auf dem Server ablaufen

20 J2EE Test Vorgehen Funktionaler Unit Test Code + Logik Unit Test
HttpUnit Code + Logik Unit Test Mock Objekte ServletUnit Integration Unit Test Cactus

21 HTTPUnit HTTPUnit basiert auf JUNIT
HTTPUnit nutzt JTidy zum HTML Parsing und Xerces für XML Remote Test für HTTP Server OpenSource Lizenz Autor ist Russel Gold Aktuelle Version ist 1.3 Unterstützung Servlet API >=2.0

22 HTTPUnit Eigenschaften
Cookie Support HTTP Authentification SSL Support Response HTML als Objekte XML als DOM Test für alle Klassen Eigener Pseudo Web Server Servlet Emulation

23 HTTPUnit Architektur Web Server Testclient Servlet Container
JSP Cgi-bin Junit TestRunner HttpUnit TestCase HttpUnit Web- Conversation Ressourcen

24 HTTPUnit Klassen WebConversation
Web-Browser Emulation, Cookie Management, Relative Url, Request/Response Ausführen / HTTP u. HTTPS GetMethodWebRequest HTTP GET Request PostMethodWebRequest HTTP POST Request WebResponse Ergebnis eines Requests WebLink HTML Link im WebResponse WebForm HTML Form im WebResponse SubmitButton FROM Submit Buttons WebTable HTML Table im WebResponse TableCell HTML Table Cell WebFrame HTML Frameset im WebResponse HttpUnitOptions Globale Options

25 HTTPUnit Login Seite

26 HTTPUnit JSP_indexTest
public class JSP_indexTest extends Testcase { ... public void testLogin() throws Exception { WebConversation wc = new WebConversation(); WebResponse resp = wc.getResponse(getHostPath()); WebLink link = resp.getLinkWith("Anmelden"); resp = wc.getResponse(link.getRequest()); assertIncludeForm(resp, 1); WebForm form = resp.getForms()[0] ; assertLoginForm(form); assertLoginCustomer(wc, form.getRequest(),"3"); }

27 HTTPUnit JSP_indexTest
private void assertIncludeForm( WebResponse aResponse, int expectedforms) throws Exception { WebForm[] forms = aResponse.getForms(); if (expectedforms > 0) { assertNotNull("login with no fields", forms); int length = forms.length; assert("Expected " + expectedforms, expectedforms == length); } else { assert("No forms expected", null != forms); }

28 HTTPUnit JSP_indexTest
private void assertLoginForm(WebForm form) throws Exception { String[] parameterNames = form.getParameterNames(); int length = parameterNames.length; assert("Number of parameters wrong -- was <" + length + "> expected <10>", 9 == length); assertEquals("First parameter doAction", "doAction", parameterNames[0]); assertEquals("First parameter id", "id", parameterNames[1]); assertEquals("First parameter firstname", "firstname", parameterNames[2]); assertEquals("First parameter lastname", "lastname", parameterNames[3]); ... }

29 HTTPUnit JSP_indexTest
private void assertLoginCustomer( WebConversation wc, WebRequest req, String id) throws Exception { req.setParameter("id", id); WebResponse resp = wc.getResponse(req); assertIncludeForm(resp, 1); assertNotNull( (resp.getForms()[0]).getSubmitButton("next")); }

30 IDEA Integration Junit Editor Ant

31 HTTPUnit Demo Start JBuilder oder IDEA Start Tomcat mit jspTutorial
Start Junit Testcase Bewertung des Ergebnisses Inside Code Änderung der Testcases

32 HTTPUnit Anmerkungen Blackbox Test
Seitenablaufplan als Basis der Testfalldefinition Kontrolle des Design Kontrolle der Links Kontrolle zwischen Entwickler und Designer XML und HTML Ausgabe testbar Unabhängigkeit von Server Technologie (ASP,JSP,PHP)

33 Cactus 1.2 Neues Jakarta Projekt aus der J2EEUnit entstanden
Container Side Testing Testcases haben Client und Remote Bestandteil Deployment der Testcases auf dem Server Autor ist Vincent Massol

34 Cactus Eigenschaften Test Prüfung auf dem Client und dem Server
Testen von Situationen, die nur auf dem Server existieren Support von Servlet API 2.2 und 2.3 Getestet mit Tomcat 3.2.x, x; Resin 1.2,1.3 ; Weblogic 5.1, 6.x Umfangreiche Testcases und gute Dokumentation

35 Cactus Architektur Web Server Testclient Servlet Container
Junit TestRunner Cactus TestCase Cactus Redirector Proxy Cactus TestCase Server seitige Testklassen

36 Cactus ServletTestCase
Implizite Attribute der ServletTestCase Klasse Attribute Klasse config javax.servlet.ServletConfig session javax.servlet.http.HttpSession response javax.servlet.http.HttpServletResponse request javax.servlet.http.HttpServletRequest

37 Cactus Servlet Example I
public void testReadServletOutputStream() throws IOException { SampleServlet servlet = new SampleServlet(); servlet.doGet(request, response); } public void endReadServletOutputStream (HttpURLConnection theConnection) throws IOException assertEquals("<html><head/><body>A GET request</body></html>", AssertUtils.getResponseAsString(theConnection));

38 Cactus Servlet Example II
public void beginSendParams(ServletTestRequest theRequest) { theRequest.addParameter("param1", "value1"); theRequest.addParameter("param2", "value2"); } public void testSendParams() SampleServlet servlet = new SampleServlet(); Hashtable params = servlet.getRequestParameters(request); assert(params.get("param1") != null); assert(params.get("param2") != null); assertEquals("value1", params.get("param1")); assertEquals("value2", params.get("param2"));

39 Cactus Servlet Example III
public void beginXXX(WebRequest theRequest) { theRequest.setURL("jakarta.apache.org", "/mywebapp", "/test/test.jsp", null, null); theRequest.addCookie("cookiename", "cookievalue"); } public void testXXX() { MyServletToTest servlet = new MyServletToTest(); servlet.init(config); servlet.methodToTest(); // Servlet methods assertEquals("someValue", session.getAttribute("someAttribute")); assertEquals("jakarta.apache.org", request.getServerName()); } public void endXXX(WebResponse theResponse) { cookie = theResponse.getCookie("cookiename"); assertEquals("cookievalue", cookie.getValue()); assertEquals("some content here", theResponse.getText());

40 Cactus JspTestCase Implizite Attribute der JspTestCase Klasse
config javax.servlet.ServletConfig session javax.servlet.http HttpSession response javax.servlet.http HttpServletResponse request javax.servlet.http.HttpServletRequest out javax.servlet.jsp.JspWriter pageContext org.apache.cactus.server.PageContextWarpper

41 Cactus JSP Example I public class ForwardTest extends JspTestCase {...
public void testForward() throws ServletException,IOException { pageContext.forward("/test/test.jsp") ; } public void endForward(HttpURLConnection theConnection) throws IOException { StringBuffer sb = new StringBuffer(); BufferedReader input = new BufferedReader( new InputStreamReader(theConnection.getInputStream())); while (null != ((String str = input.readLine()))) { sb.append(str); input.close (); assertEquals( "<html><body>Hello !</body></html>", sb.toString());

42 Cactus JSP Example II public class ForwardTest extends JspTestCase
{... public void testForward() throws ServletException,IOException { pageContext.forward("/test/test.jsp") ; } public void endForward(WebResponse theResponse) { assertEquals( "<html><body>Hello !</body></html>", theResponse.getText() );

43 Cactus EJB Example a public class ConverterTest extends ServletTestCase { ... private Converter converter ; public void setUp() throws Exception { Context ctx = new InitialContext(); ConverterHome home = (ConverterHome) PortableRemoteObject.narrow( ctx.lookup("java:comp/ejb/Converter"),ConverterHome.class); this.converter = home.create(); }

44 Cactus EJB Example b public class ConverterTest extends ServletTestCase { ... public void testConvert() throws Exception { assertNotNull("Can‘t access Converter", converter) ; double dollar = this.converter.convertYenToDollar(100.0); assertEquals("dollar", 1.0, dollar, 0.01); } public void tearDown() throws Exception { if( converter != null) this.converter.remove() ;

45 Cactus EJB Example c <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" " <web-app> <servlet> <servlet-name>ServletRedirector</servlet-name> <servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletRedirector</servlet-name> <url-pattern>/ServletRedirector/</url-pattern> </servlet-mapping> [...] <ejb-ref> <ejb-ref-name>ejb/Converter</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>org.apache.cactus.sample.ejb.ConverterHome</home> <remote>org.apache.cactus.sample.ejb.Converter</remote> </ejb-ref> </web-app>

46 Cactus Demo Test, ob Session und ServletContext korrekt gestartet sind
Pizza und Ingredient testen TagLib Test im “Build Verification“-Abschnitt

47 Cactus Anmerkungen White Box Test
Unterstützung vieler Servlet Container Remote Testing via HTTP Test von Client und Server Zustände Pro Testfall zwei HTTP Verbindungen ( response, result) Testbarkeit aller J2EE Komponenten Version 1.3 verfügbar

48 Agenda Integration Build Verfication Ant CruiseControl

49 Build Verfication Tägliche Integration der Änderung
Automatisches Erzeugen via ant build Prepare Compile Packaging Deploy Test Release

50 Build Verification Test
Continuous Integration Martin Fowler Matthew Foemmel Self Testing Code Complete Automatic Test Single Source Master Build Cruisecontrol 1.2.1a

51 BVT Architektur CruiseControl Ant build resource src web Project
checking CVS files checkout Web Client Test Web Container buildservlet masterbuild cruisecontrol Build timer test deploy produce Mail Client Java Mail Logfiles protocol JMX Admin

52 BVT CruiseControl

53 BVT JMX Admin

54 BVT Demo Starten der Dienste Einbringen einer Änderung
Beobachten des Integrationslaufs Benachrichtigung Anschauen der Protokolle Administration

55 BVT Ergebnisse I Verantwortung des Teams wächst
Hohe Sicherheit der Stabilität der Änderung Anzahl der TestCases wächst stärker vor Releases Nicht der gesamte Code muss getestet werden Testfälle und Abdeckung müssen beobachtet werden -> Review der Testfälle

56 BVT Ergebnisse II Zeitplan muss Testfall- Anpassungen bei ReDesign berücksichtigen Zeitersparnisse der Integrationstest vs. Pflege der Testfälle Review der Kodierung der Testfälle Konventionen und Pattern suchen

57 Tipps und Tricks I Aufteilen der Erzeugnisse eines Projektes
Suche nach hilfreichen ant tasks Cactus,Quick,Jtidy,Junit, jspc Erweiterung des xsl-Skript durch Links auf die Erweiterungen Integration sollte auf Produktionsplattform ablaufen Schnelle Reaktionen

58 Tipps und Tricks II Test von verschiedenen Server mit Cactus
JSP Compiler (Tomcat JSPC) zum Syntax Check Automatische Installation eines Releases Markieren eines Erfolgreichen Builds mit CURRENT Tag Integration von Statistiken Anzahl Klassen vs Testklassen Anzahl erfolgreicher Builds

59 Tipps und Tricks III Durchführung des Tests Build JSPC Test
Java Beans Test Deployment Validierung der Deployment Descriptoren Start der Server Serverseitige Testfälle Sicherung der Ergebnisse

60 Tipps und Tricks IV Gesamtes Team bekommt CruiseControl Status Email
Verantwortlichen für die Stabilität des Integrationstest bennenen Besetzung der Rolle Deployers Grenze zwischen Qualitätssicherung und Entwicklertest vereinbaren Wartung der TestCase einplanen

61 Noch nicht genug! Mailto: pr@webapp.de „Play with the Tools!“
Lassen Sie sich von mir beraten.

62 Testtools CruiseControl http://cruisecontrol.sourceforge.net/ JMeter
Watchdog JUnit Cactus JUnitX JTest QACenter Jbuilder Opentools Ant Rational Test Suite

63 Test Veröffentlichungen
Junit Primer Test Infect EJB HttpUnit Servlet Testing Junitservlet J2EEUnit JUnitPerf JUnit best practices Continuous Integration Junit.org Articles

64 Test-Bücher Hightower/Lesiecki (Wiley 2001)
Java Tools for eXtreme Programming Newkrik/Martin (Addsion Weseley 2001) Extreme Programming in Practice Splaine/Jaskiel (STQE Publishing 2001 The Web Testing Handbook Link (dpunkt verlag 2002) Unit Tests mit Java

65 JSP-Bücher Fields/Kolb (Manning 2000)
Web Development with Java Server Pages Kassem et al. (Addison Wesley 2000) Designing Enterprise Applications with the Java 2 Plattform, Enterprise Edition (APM-Book) Pekowsky ( Addison Wesley 2000) JavaServer Pages Turau (IX- dpunkt 2000) Java Server Pages -Dynamische Generierung von Web-Dokumenten Avedal et al. (Wrox 2000) Professional JSP Bergsten ( O‘Reilly 2000) JavaServerPages Rossbach/Schreiber (1999,2000) Java Server und Servlets

66 Links Sun JSP Home Page http://java.sun.com/jsp/ OReilly JSP Book
Jakarta(Tomcat, Ant, Taglib...) Jsp Tutorial Manning Book Jason Hunter Site JawaWorld Bea Orion Jrun Allaire WebApp Framework


Herunterladen ppt "Test infected: Web Testing mit HttpUnit und Cactus Framework"

Ähnliche Präsentationen


Google-Anzeigen