V minulom článku sme vytvorili základnú kostru, na ktorej môžeme stavať naše testy. Preto je vhodný čas, aby sme začali s praktickým využívaním možností testovacieho frameworku Cactus. Konkrétne sa pozrieme, ako otestovať metódy zodpovedné za spracovanie informácií získavaných cez webové formuláre.

Na začiatku si treba ujasniť, čo vlastne ideme testovať. Nejdeme testovať správnosť údajov, ktoré zadajú užívatelia do formulára. Po prvé, na to často stačí využiť JavaScript, a po druhé, pri testovaní nebudeme žiadny formulár používať. Na simulovanie užívateľského vstupu využijeme metódy typu beginXXX(WebRequest). To, čo ideme naozaj testovať, je správna funkčnosť metód zodpovedných za spracovanie dát zadaných prostredníctvom formulára. Môže ísť o jednu alebo o viacero metód., záleží na vás. Ja sa zameriam na jednu konkrétnu metódu, zodpovednú za validáciu zadaného prihlasovacieho mena a hesla. Validácia bude spočívať v kontrole na NULL a prázdny reťazec.

Mali by sme vedieť, že po odoslaní formulára browser automaticky pridá každé pole do odoslanej požiadavky. V našom prípade pôjde o LoginServlet, ktorý obdrží, verifikuje a spracuje prihlasovacie informácie. Nasleduje jeho zdrojový kód.

LoginServlet.java:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
 /* Cactus nevolá túto metódu automaticky. Ak ju chcete
 testovať musí ju vaša testovacie metóda explicitne zavolať. */

 public void doPost(
          HttpServletRequest req, HttpServletResponse res)
          throws IOException, ServletException {
  if (!validateParameters(req)) {
   req.setAttribute(„errorMessage“,
       „Zadajte prihlasovacie meno a heslo“);
   req.getRequestDispatcher(„/login.jsp“).forward(req, res);
   return;
  }
 }
 //ideme testovať správne vykonávanie tejto metódy
 boolean validateParameters(HttpServletRequest req) {
  String username = req.getParameter(„username“);
  String password = req.getParameter(„passwd“);
  if ((username == null || „“.equals(username)) ||
       (password == null || „“.equals(password))) {
   return false;
  } else {
   return true;
  }
 }
}

Tento typ servletu musí vždy kontrolovať parametre na NULL a na prázdny reťazec. Parameter je NULL vtedy, ak sa nenachádza v prijatej požiadavke, a obsahuje prázdny reťazec, ak síce je v požiadavke, ale nemá zadanú hodnotu. Je čas vytvoriť vhodný test case. Nasleduje zdrojový kód triedy, ktorú použijeme na testovanie LoginServlet.

TestLoginServlet.java:

import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
public class TestLoginServlet extends ServletTestCase {
 private LoginServlet servlet;
 //konštruktor triedy TestLoginServlet
 public TestLoginServlet(String name) {
  super(name);
 }
 //vytvoríme inštanciu servleta LoginServlet
 public void setUp() {
  this.servlet = new LoginServlet();
 }
 /* Inicializujeme parametre username a passwd,
 a tým simulujeme spracovanie prihlasovacieho formulára.
 Tento test predpokladá, že obidva parametre sú zadané. */

 public void beginValidParameters(WebRequest webreq) {
  webreq.addParameter(„username“, „testname“,
                                    WebRequest.POST_METHOD);
  webreq.addParameter(„passwd“, „testpasswd“,
                                    WebRequest.POST_METHOD);
 }
 /* Týmto testom overíme, či validačná metóda
 pracuje správne, za podmienky, že sú zadané obidva parametre. */

 public void testValidParameters() {
  assertTrue(„Parametre v poriadku.“,
             this.servlet.validateParameters(this.request));
 }
 /* Inicializujeme iba parameter passwd,
 a tým simulujeme neexistenciu parametra username.
 Tento test predpokladá, že existuje iba jeden parameter. */

 public void beginUserParameterNull(WebRequest webreq) {
  webreq.addParameter(„passwd“, „testpasswd“,
                                    WebRequest.POST_METHOD);
 }
 /* Týmto testom overíme, či validačná metóda pracuje
 správne, za podmienky, že existuje iba parameter passwd. */

 public void testUserParameterNull() {
  assertTrue(„Prihlasovacie meno je NULL.“,
            !this.servlet.validateParameters(this.request));
 }
 /* Inicializujeme parametre username a passwd,
 avšak parameter username obsahuje prázdny reťazec.
 Tento test predpokladá, že obidva parametre sú zadané. */

 public void beginUserParameterEmpty(WebRequest webreq) {
  webreq.addParameter(„username“, „“,
                                    WebRequest.POST_METHOD);
  webreq.addParameter(„passwd“, „testpasswd“,
                                    WebRequest.POST_METHOD);
 }
 /* Týmto testom overíme, či validačná metóda
 pracuje správne, za podmienky, že sú zadané obidva parametre.
 Parameter username však obsahuje prázdny reťazec.*/

 public void testUserParameterEmpty() {
  assertTrue(„Prihlasovacie meno nie je zadané.“,
            !this.servlet.validateParameters(this.request));
 }
 /* Inicializujeme iba parameter username,
 a tým simulujeme neexistenciu parametra passwd.
 Tento test predpokladá, že existuje iba jeden parameter. */

 public void beginPasswdParameterNull(WebRequest webreq) {
  webreq.addParameter(„username“, „testname“,
                                    WebRequest.POST_METHOD);
 }
 /* Týmto testom overíme, či validačná metóda pracuje
 správne, za podmienky, že existuje iba parameter username. */

 public void testPasswdParameterNull() {
  assertTrue(„Heslo je NULL.“,
            !this.servlet.validateParameters(this.request));
 }
 /* Inicializujeme parametre username a passwd,
 avšak parameter passwd obsahuje prázdny reťazec.
 Tento test predpokladá, že obidva parametre sú zadané. */

 public void beginPasswdParameterEmpty(WebRequest webreq) {
  webreq.addParameter(„username“, „testname“,
                                    WebRequest.POST_METHOD);
  webreq.addParameter(„passwd“, „“,
                                    WebRequest.POST_METHOD);
 }
 /* Týmto testom overíme, či validačná metóda
 pracuje správne, za podmienky, že sú zadané obidva parametre.
 Parameter passwd však obsahuje prázdny reťazec.*/

 public void testPasswdParameterEmpty() {
  assertTrue(„Heslo nie je zadané.“,
            !this.servlet.validateParameters(this.request));
 }
}

Test máme napísaný. Je načase ho vyskúšať. Keď sa dobre pozriete na vytvorený test case, určite sa zamyslíte, ako vlastne celý test bude bežať. Ako, alebo kde ho vlastne spustím? Veď samotný test case nemá metódu main(). Stav je dnes taký, že Cactus testy je možné spúšťať a vyhodnocovať viacerými spôsobmi, napríklad pomocou nástroja Ant, integrovaním do vývojového prostredia, spustením z príkazového riadku alebo využitím špeciálneho servlet test runnera. Bližšie informácie k jednotlivým spôsobom nájdete na stránke Starting Cactus tests.

Pravdepodobne najjednoduchší a najzaujímavejší spôsob je ten naposledy uvedený. Aby ste si mohli test sami hneď vyskúšať, pripravil som pre vás balíček s príkladom, ktorý obsahuje všetky potrebné súbory. Stačí ich umiestniť na server, reštartovať ho a do prehliadača zadať nasledovné URL:

Url testu

Prezrite si, prosím, dôkladne uvedené URL. Ako názov webovej aplikácie som zvolil „test“ a je samozrejme na vás, aký si vyberiete vy. Nezabudnite ho však zmeniť v URL. Aby test prebehol, potrebujete už spomenutý test runner, čo je vlastne trieda s veľmi dlhým názvom org.apache.cactus.server.runner.ServletTestRunner. Tento, v podstate, servlet je dobré zaregistrovať vo web.xml rovnako ako aj príslušný redirektor. Príklad:

<web-app>
 <servlet>
  <servlet-name>ServletTestRunner</servlet-name>
  <servlet-class>
   org.apache.cactus.server.runner.ServletTestRunner
  </servlet-class>
 </servlet>
 <servlet>
  <servlet-name>ServletRedirector</servlet-name>
  <servlet-class>
   org.apache.cactus.server.ServletTestRedirector
  </servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>ServletTestRunner</servlet-name>
  <url-pattern>/ServletTestRunner</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
  <servlet-name>ServletRedirector</servlet-name>
  <url-pattern>/ServletRedirector</url-pattern>
 </servlet-mapping>
</web-app>

Servlet test runner očakáva povinný parameter suite s hodnotou predstavujúcou názov testovacej triedy (test case). Nepovinným parametrom je xsl s hodnotou obsahujúcou odkaz na XSLT stylesheet. Výstupom servlet test runnera je XML, ktoré môžete transformovať na HTML práve prostredníctvom XSLT, tak ako je to na nasledujúcom obrázku.

Výsledok testu v grafickej podobe

Máme za sebou prvé pokusy s testovaním čiastkových kusov kódu. Odborne sa to označuje ako unit testing. V ďalších článkoch budeme testovať funkčnosť rôznych typických oblastí, s ktorými sa môžete pri programovaní servletov a JSP stretnúť.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

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

Odpovědět