Navigace

Hlavnφ menu

 

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

CookieServlet.java:

import javax.servlet.http.HttpServlet;
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.

TestCookieServlet.java:

import org.apache.cactus.ServletTestCase;
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.

V²sledok cactus testu s pou₧itφm XSL

Ak vßs zaujφma, ako vyzerß v²sledok testu, ak nepou₧ijete XSL transformßciu, potom zadajte nasledovnΘ URL:

V²sledok Cactus testu bez XSL
Branick², Marek (23. 4. 2004)