+ All Categories
Home > Documents > (c) 2002 by Peter Roßbach [email protected] – JAX [email protected] Test infected: Web Testing mit...

(c) 2002 by Peter Roßbach [email protected] – JAX [email protected] Test infected: Web Testing mit...

Date post: 05-Apr-2015
Category:
Upload: brigitte-angerer
View: 109 times
Download: 3 times
Share this document with a friend
Popular Tags:
66
) 2002 by Peter Roßbach [email protected] – JAX 2002 Test infected: Test infected: Web Testing mit Web Testing mit HttpUnit und Cactus HttpUnit und Cactus Framework Framework Peter Roßbach Peter Roßbach ([email protected]) ([email protected])
Transcript
Page 1: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Test infected:Test infected:

Web Testing mit HttpUnit und Web Testing mit HttpUnit und Cactus FrameworkCactus Framework

Peter Roßbach Peter Roßbach

([email protected])([email protected])

Page 2: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

AgendaAgenda

Web Komponenten TestWeb Komponenten Test JUnitJUnit HTTPUnitHTTPUnit ServletUnitServletUnit CactusCactus

Build VerificationBuild Verification cruisecontrolcruisecontrol

AnmerkungenAnmerkungen

Page 3: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

MotivationMotivation

XP-Techniken für das TestenXP-Techniken für das Testen Kostengünstige Lösung für das Kostengünstige Lösung für das

Testen von Web-AnwendungenTesten von Web-Anwendungen Automatisierung der ErzeugungAutomatisierung der Erzeugung Automatisierte TestsAutomatisierte Tests Protokollierung und Protokollierung und

Benachrichtigung der Tests Benachrichtigung der Tests Teamentwicklung fördernTeamentwicklung fördern

Page 4: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Page 5: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Testing GameTesting Game

Simple Design

Continuous Integration

Coding Standards

Short Releases

Planning Game

Refactoring

Programming

Testing

Page 6: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

ZieleZiele

Unit Test während der EntwicklungUnit Test während der Entwicklung Funktionale Test für Web-Funktionale Test für Web-

AnwendungenAnwendungen Automatisierung der ErzeugnisseAutomatisierung der Erzeugnisse VersionisierungVersionisierung ProtokollierungProtokollierung LasttestLasttest

Page 7: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Effektiv TestenEffektiv 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

Page 8: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

TestArtenTestArten Unit Tests White-Box Tests isolierter

Einheiten Akzeptanztests Black-Box Tests funktionaler

Anforderungen weitere Systemtests

Lasttests Performanztests Usability-Tests ...

Page 9: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JunitJunit

Java-Framework zum Schreiben und Ausführen automatischer Unit Tests

Tests werden in Java codiert. Entsprechende Frameworks sind

für andere Programmiersprachen erhältlich.

AutorenAutoren Kent Beck and Erich GammaKent Beck and Erich Gamma

Page 10: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT TestprozessJUNIT Testprozess

Rumpf anlegen

Klasse Testcase

Testcase schreiben

Anforderung klären

Kompilieren

Funktionalität implementieren

Testcase erfolgreich

Testcase scheitert

Anforderung verfeinern

Refactoring

Testcase ausführen

Nächste Anforderung

Page 11: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT PizzaBinderTestJUNIT PizzaBinderTestpackage de.objektpark.jspTutorial.model;package de.objektpark.jspTutorial.model;

import junit.framework.*;import junit.framework.*;

public class PizzaBinderTest extends TestCase {public class PizzaBinderTest extends TestCase {

public PizzaBinderTest (String testName) public PizzaBinderTest (String testName)

{ super(testName); }{ super(testName); }

public static Test suite() {public static Test suite() {

return new TestSuite(PizzaBinderTest.class);return new TestSuite(PizzaBinderTest.class);

}}

protected void setUp() throws Exception { ... }protected void setUp() throws Exception { ... }

protected void tearDown() throws Exception { ... }protected void tearDown() throws Exception { ... }

public void testBind() throws Exception {public void testBind() throws Exception {

List objects = null;List objects = null;

objects = retriever("pizza");objects = retriever("pizza");

assert(" no pizza bind",assert(" no pizza bind",

objects.get(0) instanceof Pizza);objects.get(0) instanceof Pizza);

}}

}}

Page 12: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT SwingUiJUNIT SwingUi

Page 13: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT TesttippsJUNIT Testtipps Jeder Aspekt der Klasse sollte Jeder Aspekt der Klasse sollte

einem Test unterzogen werden:einem Test unterzogen werden: Randparameter TestRandparameter Test Unzulässige WerteUnzulässige Werte SchleifeninvariantenSchleifeninvarianten

Sie können nur die Sie können nur die Funktionsergebnisse testen:Funktionsergebnisse testen: ReturnwerteReturnwerte Zustand der ObjekteZustand der Objekte

Page 14: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT TesttippsJUNIT Testtipps Schreiben Sie kleine Methoden Schreiben Sie kleine Methoden

in Ihren Klassen und in den in Ihren Klassen und in den TestCases.TestCases.

Schreiben Sie die Test i.d. Regel Schreiben Sie die Test i.d. Regel vor Implementierung oder vor Implementierung oder nahezu zeitgleich.nahezu zeitgleich.

Keine gleichzeitige Keine gleichzeitige Verbesserung des Codes und Verbesserung des Codes und Korrektur von Fehlern.Korrektur von Fehlern.

Page 15: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT TesttippsJUNIT Testtipps

Trennung vonTrennung von Bug FixingBug Fixing RefactoringRefactoring Re-DesignRe-Design Neue FunktionalitätenNeue Funktionalitäten

TestvorgehenTestvorgehen Bottom UpBottom Up Top DownTop Down

Page 16: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JUNIT Web-TestumgebungJUNIT Web-Testumgebung

JUNIT 3.7JUNIT 3.7 Jakarta Ant 1.4.1Jakarta Ant 1.4.1 Intellij IDEA 2.5Intellij IDEA 2.5 Jakarta Tomcat 4.0.4 od 4.1.0Jakarta Tomcat 4.0.4 od 4.1.0 James 2.0.2James 2.0.2 HttpUnitHttpUnit CactusCactus CruiseControlCruiseControl

Page 17: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Agenda TestingAgenda Testing

J2EEJ2EE TestanforderungTestanforderung HttpUnitHttpUnit SerlvetUnitSerlvetUnit CactusCactus

Page 18: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

J2EE UmgebungJ2EE UmgebungClient Applikations Logik EIS

(X)HTML /XML

JavaApplet

(Java)Application

J2EE Application Server

Web Container

EJB Container

Java APIs

Java APIs

Session Beans

Entity Beans

TagLibsServlets JSPs

RDMS

Java App

Mail Server

Corba

JDBC

JavaMail

RMI

IIOP

JNDI

JMS

DS

Message Queue

MessageDriven Beans

Page 19: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

J2EE Test AnforderungJ2EE Test Anforderung Trennung von Kommunikation Trennung von Kommunikation

und Funktionalitätund Funktionalität Testbarkeit der Komponenten im Testbarkeit der Komponenten im

Entwurf berücksichtigenEntwurf berücksichtigen Verwendung des erprobten Verwendung des erprobten

JUNIT-FrameworkJUNIT-Framework Test von Java Klassen ohne Test von Java Klassen ohne

Server DeploymentServer Deployment Test von Servlet/JSP oder EJB, Test von Servlet/JSP oder EJB,

die auf dem Server ablaufendie auf dem Server ablaufen

Page 20: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

J2EE Test VorgehenJ2EE Test Vorgehen

Funktionaler Unit TestFunktionaler Unit Test HttpUnitHttpUnit

Code + Logik Unit TestCode + Logik Unit Test Mock ObjekteMock Objekte ServletUnitServletUnit

Integration Unit TestIntegration Unit Test CactusCactus

Page 21: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnitHTTPUnit

HTTPUnit basiert auf JUNITHTTPUnit basiert auf JUNIT HTTPUnit nutzt JTidy zum HTML HTTPUnit nutzt JTidy zum HTML

Parsing und Xerces für XMLParsing und Xerces für XML Remote Test für HTTP ServerRemote Test für HTTP Server OpenSource LizenzOpenSource Lizenz Autor ist Russel GoldAutor ist Russel Gold Aktuelle Version ist 1.3Aktuelle Version ist 1.3 Unterstützung Servlet API >=2.0Unterstützung Servlet API >=2.0

Page 22: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit EigenschaftenHTTPUnit Eigenschaften

Cookie SupportCookie Support HTTP AuthentificationHTTP Authentification SSL SupportSSL Support ResponseResponse

HTML als ObjekteHTML als Objekte XML als DOMXML als DOM

Test für alle KlassenTest für alle Klassen Eigener Pseudo Web ServerEigener Pseudo Web Server Servlet EmulationServlet Emulation

Page 23: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit ArchitekturHTTPUnit Architektur

Testclient Web ServerServlet Container

Junit TestRunner

HttpUnit TestCase

ServletJSP

Cgi-bin

Ressourcen

HttpUnit Web-

Conversation

Page 24: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit KlassenHTTPUnit KlassenWebConversationWebConversation Web-Browser Emulation, Cookie Web-Browser Emulation, Cookie

Management, Relative Url, Management, Relative Url, Request/Response Ausführen / HTTP u. Request/Response Ausführen / HTTP u. HTTPSHTTPS

GetMethodWebRequestGetMethodWebRequest HTTP GET RequestHTTP GET Request

PostMethodWebRequestPostMethodWebRequest HTTP POST RequestHTTP POST Request

WebResponseWebResponse Ergebnis eines RequestsErgebnis eines Requests

WebLinkWebLink HTML Link im WebResponseHTML Link im WebResponse

WebFormWebForm HTML Form im WebResponseHTML Form im WebResponse

SubmitButtonSubmitButton FROM Submit ButtonsFROM Submit Buttons

WebTableWebTable HTML Table im WebResponseHTML Table im WebResponse

TableCellTableCell HTML Table CellHTML Table Cell

WebFrameWebFrame HTML Frameset im WebResponseHTML Frameset im WebResponse

HttpUnitOptionsHttpUnitOptions Globale OptionsGlobale Options

Page 25: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit Login SeiteHTTPUnit Login Seite

Page 26: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit JSP_indexTestHTTPUnit 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");

}

...

}

Page 27: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit JSP_indexTestHTTPUnit JSP_indexTestprivate 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);

}

}

Page 28: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit JSP_indexTestHTTPUnit JSP_indexTestprivate 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]);

...

}

Page 29: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit JSP_indexTestHTTPUnit 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"));

}

Page 30: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

IDEA IntegrationIDEA IntegrationJunit

AntEditor

Page 31: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit DemoHTTPUnit Demo

Start JBuilder oder IDEAStart JBuilder oder IDEA Start Tomcat mit jspTutorialStart Tomcat mit jspTutorial Start Junit TestcaseStart Junit Testcase Bewertung des ErgebnissesBewertung des Ergebnisses Inside CodeInside Code Änderung der TestcasesÄnderung der Testcases

Page 32: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

HTTPUnit AnmerkungenHTTPUnit Anmerkungen Blackbox TestBlackbox Test Seitenablaufplan als Basis der Seitenablaufplan als Basis der

TestfalldefinitionTestfalldefinition Kontrolle des DesignKontrolle des Design Kontrolle der LinksKontrolle der Links Kontrolle zwischen Entwickler Kontrolle zwischen Entwickler

und Designerund Designer XML und HTML Ausgabe testbarXML und HTML Ausgabe testbar Unabhängigkeit von Server Unabhängigkeit von Server

Technologie (ASP,JSP,PHP)Technologie (ASP,JSP,PHP)

Page 33: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus 1.2Cactus 1.2

Neues Jakarta Projekt aus der Neues Jakarta Projekt aus der J2EEUnit entstandenJ2EEUnit entstanden

Container Side TestingContainer Side Testing Testcases haben Client und Testcases haben Client und

Remote BestandteilRemote Bestandteil Deployment der Testcases auf Deployment der Testcases auf

dem Serverdem Server Autor ist Vincent MassolAutor ist Vincent Massol

Page 34: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus EigenschaftenCactus Eigenschaften Test Prüfung auf dem Client und Test Prüfung auf dem Client und

dem Serverdem Server Testen von Situationen, die nur Testen von Situationen, die nur

auf dem Server existieren auf dem Server existieren Support von Servlet API 2.2 und Support von Servlet API 2.2 und 2.32.3

Getestet mit Tomcat 3.2.x, 3.3 Getestet mit Tomcat 3.2.x, 3.3 4.x; Resin 1.2,1.3 ; Weblogic 5.1, 4.x; Resin 1.2,1.3 ; Weblogic 5.1, 6.x6.x

Umfangreiche Testcases und Umfangreiche Testcases und gute Dokumentationgute Dokumentation

Page 35: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus ArchitekturCactus Architektur

Testclient Web ServerServlet Container

Junit TestRunner

Server seitige

Testklassen

Cactus TestCase

Cactus Redirector

Proxy

Cactus TestCase

Page 36: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus ServletTestCaseCactus ServletTestCase

AttributeAttribute KlasseKlasseconfigconfig javax.servlet.ServletConfigjavax.servlet.ServletConfig

sessionsession javax.servlet.http.HttpSessionjavax.servlet.http.HttpSession

responseresponse javax.servlet.http.HttpServletResponsejavax.servlet.http.HttpServletResponse

requestrequest javax.servlet.http.HttpServletRequestjavax.servlet.http.HttpServletRequest

Implizite Attribute der ServletTestCase Klasse

Page 37: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus Servlet Example ICactus 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));

}

Page 38: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus Servlet Example IICactus 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"));

}

Page 39: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus Servlet Example IIICactus 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());

}

Page 40: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus JspTestCaseCactus JspTestCase

AttributeAttribute KlasseKlasseconfigconfig javax.servlet.ServletConfigjavax.servlet.ServletConfig

sessionsession javax.servlet.http HttpSessionjavax.servlet.http HttpSession

responseresponse javax.servlet.http HttpServletResponsejavax.servlet.http HttpServletResponse

requestrequest javax.servlet.http.HttpServletRequestjavax.servlet.http.HttpServletRequest

outout javax.servlet.jsp.JspWriterjavax.servlet.jsp.JspWriter

pageContextpageContext org.apache.cactus.server.PageContextWarporg.apache.cactus.server.PageContextWarpperper

Implizite Attribute der JspTestCase Klasse

Page 41: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus JSP Example ICactus JSP Example Ipublic 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());

}

Page 42: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus JSP Example IICactus 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() );

}

}

Page 43: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus EJB Example aCactus EJB Example apublic 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();

}

...

}

Page 44: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus EJB Example bCactus EJB Example bpublic 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() ;

}

}

Page 45: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus EJB Example cCactus EJB Example c<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

<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>

Page 46: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus DemoCactus Demo

Test, ob Session und Test, ob Session und ServletContext korrekt gestartet ServletContext korrekt gestartet sindsind

Pizza und Ingredient testenPizza und Ingredient testen TagLib Test im “Build TagLib Test im “Build

Verification“-AbschnittVerification“-Abschnitt

Page 47: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Cactus AnmerkungenCactus Anmerkungen

White Box TestWhite Box Test Unterstützung vieler Servlet ContainerUnterstützung vieler Servlet Container Remote Testing via HTTPRemote Testing via HTTP Test von Client und Server ZuständeTest von Client und Server Zustände Pro Testfall zwei HTTP Verbindungen Pro Testfall zwei HTTP Verbindungen

( response, result)( response, result) Testbarkeit aller J2EE KomponentenTestbarkeit aller J2EE Komponenten Version 1.3 verfügbarVersion 1.3 verfügbar

Page 48: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Agenda IntegrationAgenda Integration

Build VerficationBuild Verfication AntAnt CruiseControlCruiseControl

Page 49: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Build VerficationBuild Verfication

Tägliche Integration der Tägliche Integration der ÄnderungÄnderung

Automatisches Erzeugen via ant Automatisches Erzeugen via ant buildbuild PreparePrepare CompileCompile PackagingPackaging DeployDeploy TestTest ReleaseRelease

Page 50: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Build Verification TestBuild Verification Test

Continuous IntegrationContinuous Integration Martin FowlerMartin Fowler Matthew FoemmelMatthew Foemmel

Self Testing CodeSelf Testing Code Complete Automatic TestComplete Automatic Test Single SourceSingle Source Master BuildMaster Build Cruisecontrol 1.2.1aCruisecontrol 1.2.1a

Page 51: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

BVT ArchitekturBVT ArchitekturCruiseControl

Ant build

resourcesrcweb

Project

WebClient

Test Web Container

buildservlet

Source

checking

CVS

files

checkout

masterbuild

cruisecontrol

Build timer

test

deploy

produce

JMX AdminMail Client

JavaMail

Logfiles

protocol

Page 52: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

BVT CruiseControlBVT CruiseControl

Page 53: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

BVT JMX AdminBVT JMX Admin

Page 54: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

BVT DemoBVT Demo

Starten der DiensteStarten der Dienste Einbringen einer ÄnderungEinbringen einer Änderung Beobachten des Beobachten des

IntegrationslaufsIntegrationslaufs BenachrichtigungBenachrichtigung Anschauen der ProtokolleAnschauen der Protokolle AdministrationAdministration

Page 55: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

BVT Ergebnisse IBVT Ergebnisse I

Verantwortung des Teams Verantwortung des Teams wächstwächst

Hohe Sicherheit der Stabilität Hohe Sicherheit der Stabilität der Änderungder Änderung

Anzahl der TestCases wächst Anzahl der TestCases wächst stärker vor Releasesstärker vor Releases

Nicht der gesamte Code muss Nicht der gesamte Code muss getestet werdengetestet werden

Testfälle und Abdeckung Testfälle und Abdeckung müssen beobachtet werden -> müssen beobachtet werden -> Review der TestfälleReview der Testfälle

Page 56: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

BVT Ergebnisse IIBVT Ergebnisse II

Zeitplan muss Testfall- Zeitplan muss Testfall- Anpassungen bei ReDesign Anpassungen bei ReDesign berücksichtigenberücksichtigen

Zeitersparnisse der Zeitersparnisse der Integrationstest vs. Pflege der Integrationstest vs. Pflege der TestfälleTestfälle

Review der Kodierung der Review der Kodierung der TestfälleTestfälle

Konventionen und Pattern Konventionen und Pattern suchen suchen

Page 57: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Tipps und Tricks ITipps und Tricks I

Aufteilen der Erzeugnisse eines Aufteilen der Erzeugnisse eines ProjektesProjektes

Suche nach hilfreichen ant tasksSuche nach hilfreichen ant tasks Cactus,Quick,Jtidy,Junit, jspcCactus,Quick,Jtidy,Junit, jspc

Erweiterung des xsl-Skript durch Erweiterung des xsl-Skript durch Links auf die ErweiterungenLinks auf die Erweiterungen

Integration sollte auf Integration sollte auf Produktionsplattform ablaufenProduktionsplattform ablaufen

Schnelle ReaktionenSchnelle Reaktionen

Page 58: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Tipps und Tricks IITipps und Tricks II

Test von verschiedenen Server Test von verschiedenen Server mit Cactusmit Cactus

JSP Compiler (Tomcat JSPC) JSP Compiler (Tomcat JSPC) zum Syntax Checkzum Syntax Check

Automatische Installation eines Automatische Installation eines ReleasesReleases

Markieren eines Erfolgreichen Markieren eines Erfolgreichen Builds mit CURRENT TagBuilds mit CURRENT Tag

Integration von StatistikenIntegration von Statistiken Anzahl Klassen vs TestklassenAnzahl Klassen vs Testklassen Anzahl erfolgreicher Builds Anzahl erfolgreicher Builds

Page 59: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Tipps und Tricks IIITipps und Tricks III

Durchführung des TestsDurchführung des Tests BuildBuild JSPC TestJSPC Test Java Beans TestJava Beans Test DeploymentDeployment Validierung der Deployment Validierung der Deployment

DescriptorenDescriptoren Start der ServerStart der Server Serverseitige TestfälleServerseitige Testfälle Sicherung der ErgebnisseSicherung der Ergebnisse

Page 60: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Tipps und Tricks IVTipps und Tricks IV

Gesamtes Team bekommt Gesamtes Team bekommt CruiseControl Status EmailCruiseControl Status Email

Verantwortlichen für die Verantwortlichen für die Stabilität des Integrationstest Stabilität des Integrationstest bennenenbennenen

Besetzung der Rolle DeployersBesetzung der Rolle Deployers Grenze zwischen Grenze zwischen

Qualitätssicherung und Qualitätssicherung und Entwicklertest vereinbaren Entwicklertest vereinbaren

Wartung der TestCase einplanenWartung der TestCase einplanen

Page 61: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Noch nicht genug!Noch nicht genug!

Mailto: [email protected]: [email protected] „„Play with the Tools!“Play with the Tools!“ http://www.tom4.dehttp://www.tom4.de Lassen Sie sich von mir beraten.Lassen Sie sich von mir beraten.

Page 62: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

TesttoolsTesttoolsCruiseControlCruiseControl http://cruisecontrol.sourceforge.net/http://cruisecontrol.sourceforge.net/

JMeterJMeter http://java.apache.org/jmeter/http://java.apache.org/jmeter/

WatchdogWatchdog http://jakarta.apache.org/watchdog/http://jakarta.apache.org/watchdog/

JUnitJUnit http://www.junit.org/http://www.junit.org/

CactusCactus http://jakarta.apache.org/commons/cactus/http://jakarta.apache.org/commons/cactus/index.htmlindex.html

JUnitXJUnitX http://www.exterme-java.de/http://www.exterme-java.de/

JTestJTest http://www.parasoft.com/products/jtest/http://www.parasoft.com/products/jtest/index.htmindex.htm

http://www.javaworld.com/jw-03-2001/jw-http://www.javaworld.com/jw-03-2001/jw-0323-lw-jtest.html0323-lw-jtest.html

QACenterQACenter http://www.compuware.com/products/http://www.compuware.com/products/qacenter/qacenter/

Jbuilder OpentoolsJbuilder Opentools http://www.borland.com/http://www.borland.com/

AntAnt http://jakarta.apache.org/ant/http://jakarta.apache.org/ant/

Rational Test SuiteRational Test Suite http://www.rational.com/http://www.rational.com/

Page 63: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Test VeröffentlichungenTest Veröffentlichungen

Junit PrimerJunit Primer http://www.clarkware.com/articles/http://www.clarkware.com/articles/JUnitPrimer.htmlJUnitPrimer.html

Test Infect EJBTest Infect EJB http://www.javaworld.com/javaworld/jw-05-http://www.javaworld.com/javaworld/jw-05-2000/jw-0526-testinfect.html2000/jw-0526-testinfect.html

HttpUnitHttpUnit http://httpunit.sourceforge.net/http://httpunit.sourceforge.net/

Servlet TestingServlet Testing http://www.delphis.com/javacon2000/http://www.delphis.com/javacon2000/servlet.htmlservlet.html

JunitservletJunitservlet http://sourceforge.net/projects/junitservlethttp://sourceforge.net/projects/junitservlet

J2EEUnitJ2EEUnit http://sourceforge.net/projects/j2eeunit/http://sourceforge.net/projects/j2eeunit/

JUnitPerfJUnitPerf http://www.clarkware.com/software/http://www.clarkware.com/software/JUnitPerf.htmlJUnitPerf.html

JUnit best practices JUnit best practices http://www.javaworld.com/javaworld/jw-12-http://www.javaworld.com/javaworld/jw-12-2000/jw-1221-junit_p.html2000/jw-1221-junit_p.html

Continuous IntegrationContinuous Integration http://www.martinfowler.com/articles/http://www.martinfowler.com/articles/continuousIntegration.htmlcontinuousIntegration.html

Junit.org ArticlesJunit.org Articles http://www.junit.org/articles.htmhttp://www.junit.org/articles.htm

Page 64: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

Test-BücherTest-BücherHightower/Lesiecki (Wiley Hightower/Lesiecki (Wiley 2001)2001)

Java Tools for eXtreme Programming Java Tools for eXtreme Programming

http://www.rickhightower.com/JavaXPToolkit/http://www.rickhightower.com/JavaXPToolkit/

Newkrik/Martin (Addsion Newkrik/Martin (Addsion Weseley 2001)Weseley 2001)

Extreme Programming in PracticeExtreme Programming in Practice

Splaine/Jaskiel (STQE Splaine/Jaskiel (STQE Publishing 2001Publishing 2001

The Web Testing HandbookThe Web Testing Handbook

Link (dpunkt verlag 2002)Link (dpunkt verlag 2002) Unit Tests mit JavaUnit Tests mit Java

Page 65: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

JSP-BücherJSP-BücherFields/Kolb (Manning 2000)Fields/Kolb (Manning 2000) Web Development with Java Server PagesWeb Development with Java Server Pages

Kassem et al. (Addison Kassem et al. (Addison Wesley 2000)Wesley 2000)

Designing Enterprise Applications with the Designing Enterprise Applications with the Java 2 Plattform, Enterprise Edition (APM-Java 2 Plattform, Enterprise Edition (APM-Book)Book)

Pekowsky ( Addison Pekowsky ( Addison Wesley 2000)Wesley 2000)

JavaServer PagesJavaServer Pages

Turau (IX- dpunkt 2000)Turau (IX- dpunkt 2000) Java Server Pages -Dynamische Java Server Pages -Dynamische Generierung von Web-DokumentenGenerierung von Web-Dokumenten

Avedal et al. (Wrox 2000)Avedal et al. (Wrox 2000) Professional JSPProfessional JSP

Bergsten ( O‘Reilly 2000)Bergsten ( O‘Reilly 2000) JavaServerPagesJavaServerPages

Rossbach/Schreiber Rossbach/Schreiber (1999,2000)(1999,2000)

Java Server und ServletsJava Server und Servlets

Page 66: (c) 2002 by Peter Roßbach pr@webapp.de – JAX 2002pr@webapp.de Test infected: Web Testing mit HttpUnit und Cactus Framework Peter Roßbach (pr@webapp.de)

(c) 2002 by Peter Roßbach [email protected] – JAX 2002

LinksLinksSun JSP Home PageSun JSP Home Page http://java.sun.com/jsp/http://java.sun.com/jsp/

OReilly JSP BookOReilly JSP Book http://www.TheJspBook.com/http://www.TheJspBook.com/

Jakarta(Tomcat, Ant, Taglib...)Jakarta(Tomcat, Ant, Taglib...) http://jakarta.apache.org/http://jakarta.apache.org/

Jsp TutorialJsp Tutorial http://www.ix.heise.de/ix/artikel/2000/07/152/http://www.ix.heise.de/ix/artikel/2000/07/152/

http://http://www.ix.heise.dewww.ix.heise.de/ix/artikel/2000/08/148//ix/artikel/2000/08/148/

http://www.ix.heise.de/ix/artikel/2000/09/172/http://www.ix.heise.de/ix/artikel/2000/09/172/

Manning BookManning Book http:/jspTags.com/http:/jspTags.com/

Jason Hunter SiteJason Hunter Site http://www.servlets.com/http://www.servlets.com/

JawaWorldJawaWorld http://www.javaworld.com/http://www.javaworld.com/

Bea Bea http://www.bea.com/http://www.bea.com/

OrionOrion http://www.orionserver.com/http://www.orionserver.com/

Jrun AllaireJrun Allaire http://www.alliare.com/jrun/http://www.alliare.com/jrun/

WebApp FrameworkWebApp Framework http://www.webapp.de/http://www.webapp.de/


Recommended