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

Žádný příspěvek v diskuzi

Odpovědět