Cactus - testovanie cookies
V predchßdzaj·com Φlßnku sme zaΦali so skutoΦn²m testovanφm Φiastkov²ch kusov k≤du (unit testing). IÜlo o testovanie sprßvnej funkΦnosti met≤dy zodpovednej za spracovanie a kontrolu prihlasovacφch ·dajov u₧φvate╛a. V tomto Φlßnku budeme v praktick²ch ukß₧kach pokraΦova¥ s t²m, ₧e sa zameriame na testovanie funkΦnosti servletu, zodpovednΘho za obsluhu cookies.
NaÜφm cie╛om je otestova¥ servlet, ktor² pou₧φva cookies na zis¥ovanie poΦtu prφstupov konkrΘtneho u₧φvate╛a. Musφme teda vytvori¥ ServletTestCase
, ktor² otestuje, Φi servlet sprßvnym sp⌠sobom vytvßra a spravuje cookies. Len pre zopakovanie, cookies s· malΘ k·sky dßt, ktorΘ si server a browser navzßjom posielaj· pri pou₧φvanφ webovskej aplikßcie alebo prechßdzanφ webovsk²ch strßnok. Aplikßcie vyu₧φvaj· cookies na takzvan² session tracking, preto₧e identifikaΦnΘ Φφslo cookie je unikßtne pre ka₧dΘho klienta, Φφm ho identifikuje. Je tu vÜak riziko, ₧e u₧φvate╛ zakß₧e pou₧φvanie cookies. Preto musφ by¥ aplikßcia navrhnutß tak, aby sprßvne pracovala aj v prφpade, ₧e nie je mo₧nΘ cookies pou₧i¥. Bli₧Üie informßcie nßjdete naprφklad v serißli o Java Servlets.
Vrßtim sa eÜte na chvφ╛u ku Cactusu ako takΘmu. Treba si uvedomi¥, ₧e jeho primßrnou ·lohou je potvrdi¥ alebo vyvrßti¥ funkΦnos¥ Φastφ k≤du. Teda v ₧iadnom prφpade nem⌠₧e plne nahradi¥ debugging. Prßve naopak, Φasto mu predchßdza. V s·vislosti s webovsk²mi aplikßciami mß Cactus nesporn· v²hodu v tom, ₧e testy be₧ia v priestore servlet kontajnera. To zaruΦuje, ₧e ak vÜetky testy prejd·, tak aj po nasadenφ aplikßcie na server bud· jednotlivΘ testovanΘ Φasti funkΦnΘ. Tento fakt je d⌠le₧it² najmΣ pri testovanφ kritick²ch aspektov webovskej aplikßcie, naprφklad session tracking, ktor² typicky kombinuje tri technol≤gie - cookies, prepis URL a servlet-session API.
Vytvorme si teda servlet, pou₧φvaj·ci cookies, ktorΘho funkΦnos¥ budeme nesk⌠r testova¥.
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Cookie;
import java.io.IOException;
public class CookieServlet extends HttpServlet {
public static final String TEST_COOKIE_NAME = "testCookie";
protected void doGet
(HttpServletRequest req, HttpServletResponse res)
throws IOException {
Cookie cookie = this.getCookie(req);
int count = Integer.parseInt(cookie.getValue());
count++;
cookie.setValue(String.valueOf(count));
res.addCookie(cookie);
}
protected Cookie getCookie(HttpServletRequest req) {
Cookie[] cookies = req.getCookies();
if (cookies != null) {
for (int i=0; i < cookies.length; i++) {
if (TEST_COOKIE_NAME.equals(cookies[i].getName())) {
return cookies[i];
}
}
}
return new Cookie(TEST_COOKIE_NAME, "0");
}
}
PopφÜme si v skratke, Φo vlastne CookieServlet
vykonßva. Na zaΦiatku h╛adß cookie s nßzvom testCookie
definovan· konÜtantou TEST_COOKIE_NAME
. Ak tak·to cookie nenßjde, Φo znamenß, ₧e u₧φvate╛ po₧iadal o servlet po prv² krßt, potom je tßto cookie vytvorenß a nastavenß na Φφslo nula. Nßsledne je hodnota cookie inkrementovanß o jednotku a pridanß do objektu HttpServletResponse
.
Teraz si vytvorφme prφsluÜn² servlet test case, a otestujeme nßÜ CookieServlet
.
import org.apache.cactus.WebRequest;
import org.apache.cactus.WebResponse;
import javax.servlet.http.Cookie;
public class TestCookieServlet extends ServletTestCase {
private CookieServlet servlet;
public TestCookieServlet(String name) {
super(name);
}
protected void setUp() throws Exception {
this.servlet = new CookieServlet();
}
public void testGetFirstCookie() throws Exception {
Cookie cookie = this.servlet.getCookie(this.request);
assertNotNull("Cookie.", cookie);
assertEquals(
"Cookie Name.",
CookieServlet.TEST_COOKIE_NAME,
cookie.getName());
assertEquals("Cookie Value.","0",cookie.getValue());
}
public void beginGetUpdatedCookie(WebRequest req) {
req.addCookie(CookieServlet.TEST_COOKIE_NAME, "3");
}
public void testGetUpdatedCookie() throws Exception {
this.servlet.doGet(this.request,this.response);
}
public void endGetUpdatedCookie(WebResponse res)
throws Exception {
org.apache.cactus.Cookie cookie =
res.getCookie(CookieServlet.TEST_COOKIE_NAME);
assertNotNull("Returned Cookie.", cookie);
assertEquals("Cookie Value.", "4", cookie.getValue());
}
}
Tento test simuluje, ₧e u₧φvate╛ prv² krßt po₧iadal o servlet. Test testGetFirstCookie()
zistφ, Φi met≤da getCookie()
vrßtila cookie, ktorß nie je null, mß meno definovanΘ konÜtantou TEST_COOKIE_NAME
a jej hodnota je nastavenß na Φφslo nula.
Nasleduje ∩alÜφ test, ktor² je vÜak rozdelen² do troch krokov (begin - test - end), a t²m je o nieΦo komplikovanejÜφ. Vy₧aduje toti₧, aby pred zavolanφm met≤dy doGet()
triedy CookieServlet
, bol vhodne upraven² objekt HttpServletRequest
. Deje sa tak v met≤de beginGetUpdatedCookie()
, kde sa nastavφ novß hodnota cookie (3).
Teraz sa m⌠₧e vykona¥ met≤da testGetUpdatedCookie()
, ktorß zavolß met≤du doGet()
nßÜho servleta, simuluj·c tak vykonanie HTTP GET. Ak sa tßto met≤da kompletne vykonß, Cactus h╛adß met≤du s nßzvom endGetUpdatedCookie()
. Tßto met≤da umo₧≥uje vykona¥ testy za ·Φelom overenia, Φi servlet sprßvne upravil cookie, ktorß bola poslanß klientovi.
Overφ sa, Φi cookie poslanß v objekte HttpServletResponse
nie je null, a znova, Φi jej nßzov je toto₧n² s konÜtantou CookieServlet.TEST_COOKIE_NAME
. ╚o sa t²ka hodnoty, musφ by¥ rovnß Ütyri, teda presne o jeden vΣΦÜia ako bola pred vykonanφm met≤dy doGet()
.
Teraz u₧ m⌠₧eme test nasadi¥ na server a vysk·Üa¥ ho. Je samozrejme nutnΘ ma¥ sprßvne vytvoren² web.xml deskriptor. Ak ste vÜak Φφtali aj predchßdzaj·ci Φlßnok a sk·sili ste si prφklad sami, malo by to tak by¥. Ja som vÜak znova pre vßs pripravil balφΦek so vÜetk²mi potrebn²mi s·bormi. Po skompilovanφ obidvoch tried je vhodn² Φas nasadi¥ ich na server, urobi¥ reload aplikßcie a do browsera zada¥ nasledovnΘ URL.
Ak vßs zaujφma, ako vyzerß v²sledok testu, ak nepou₧ijete XSL transformßciu, potom zadajte nasledovnΘ URL: