V predošlom článku sme si ukázali, ako je možné testovať vykonávanie metód, zodpovedných za sledovanie session. Vyskúšali sme si to na príklade jednoduchého nákupného košíka. V tomto článku sa pozrieme bližšie na testovanie toho, ako je možné servletu predať rôzne inicializačné parametre bez nutnosti modifikácie deskriptora webovskej aplikácie. Povieme si tiež niečo o tom, ako pripraviť prostredie na testovanie aplikácií vyžadujúcich autentifikáciu klienta.

Testovanie inicializačných parametrov servleta

Začneme tou jednoduchšou témou, a to je správne nastavenie a spracovanie rôznych inicializačných parametrov servleta. Riešením je využitie implicitného objektu config deklarovaného ServletTestCase redirektorom, ktorý je typu org.apache.cactus.server.ServletConfigWrapper. Pomocou tohto objektu je možné nastaviť ľubovolné inicializačné parametre, bez nutnosti modifikácie súboru web.xml.

Pre tých, čo nevedia, tak každému registrovanému servletu v aplikácii, je možné priradiť akékoľvek množstvo inicializačných parametrov, využitím deskriptora aplikácie. Tieto parametre sú dostupné pre servlet prostredníctvom objektu ServletConfig, ktorý je vytvorený servlet kontajnerom a poskytnutý servletu prostredníctvom jeho metódy init(). Servlet kontajner musí garantovať, že skôr ako servlet začne obsluhovať požiadavky, musí byť metóda init() úspešne ukončená. Pre viac konkrétnych informácií vás odkazujem na článok Java Servlets – web.xml.

Vytvorenie Cactus testu vhodného pre otestovanie inicializačných parametrov je náročné, pretože vlastne musíme na seba zobrať úlohu servlet kontajnera. Konkrétne musíme mať istotu, že bude zavolaná metóda init() a bude jej predaný implicitný parameter. Chyba pri volaní tejto metódy môže spôsobiť výnimku NullPointerException.

Pred napísaním akéhokoľvek testu, špeciálne testu pre server-side kód, je vhodné si najprv premyslieť, či určitá črta alebo špecifické správanie servera je podmienkou na to, aby test úspešne prešiel. Rovnako aj pri testovaní inicializačných parametrov je možné si položiť túto otázku. Odpoveď však nie je celkom jednoznačná. V prípade ak testujete či inicializačné parametre sú správne spracované servletom, nepotrebujete nutne poznať správanie sa servlet kontajnera. Na druhej strane, ak testujete či inicializačné parametre správne zabezpečia využitie nejakého externého zdroja, je vhodné poznať správanie servera. Vtedy vám môže Cactus framework poslúžiť.

ConfigParamServlet.java:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ConfigParamServlet extends HttpServlet {
 public static final String CONFIG_PARAM = „some_param“;
 public static final String CONFIG_VALUE = „some_value“;
 public String param_value;
 public void init(ServletConfig config)
                       throws ServletException {
  super.init(config);
  param_value = config.getInitParameter(„some_param“);
 }
 // metóda na overenie správnosti init údajov
 protected boolean validateInitParameters() {
  if (param_value.equals(CONFIG_VALUE)) {
   return true;
  }
  else {
   return false;
  }
 }
}

A samotný test case bude nasledovný.

TestConfigParamServlet.java:

import org.apache.cactus.ServletTestCase;
public class TestConfigParamServlet extends ServletTestCase {
 private ConfigParamServlet servlet;
 public TestConfigParamServlet(String name) {
  super(name);
 }
 public void setUp() {
  this.servlet = new ConfigParamServlet();
 }
 public void testValidInitParameters() throws Exception {
  this.config.setInitParameter(
                           ConfigParamServlet.CONFIG_PARAM,
                           ConfigParamServlet.CONFIG_VALUE);
  // kritický krok!
  this.servlet.init(this.config);
  assertTrue(„Valid Init Parameter.“,
                     this.servlet.validateInitParameters());
 }
}

A tu je výsledok nášho testu. Samozrejme, bolo by vhodné otestovať aj situáciu, kedy test neprejde, aby sme mali istotu, že metóda zodpovedná za validáciu parametrov skutočne funguje.

výsledok testu

Testovanie aplikácií vyžadujúcich autentifikáciu klienta

Ak by ste sa pokúsili realizovať test takejto aplikácie, za takých istých podmienok ako doteraz, pravdepodobne by ste neuspeli. Cactus framework však umožňuje testovať aj takéto aplikácie, avšak momentálne podporuje iba BASIC autentifikačný mechanizmus. Tento mechanizmus umožňuje automaticky vykonať prihlásenie klienta, priamo počas behu testu. Platí tu určité pravidlo, že autentifikácia je nutná vždy, ak servlet filter alebo single servlet, ktorý chceme testovať, využívajú niektorú z nasledovných metód.

  • HttpServletRequest.getRemoteUser()
  • HttpServletRequest.getUserPrincipal()
  • HttpServletRequest.isUserInRole(String)

Ak teda vaša aplikácia vyžaduje takýto stupeň zabezpečenia, musí byť adekvátne nakonfigurovaná. Za týmto účelom treba editovať deployment deskriptor web.xml a konfiguračný súbor tomcat-users.xml. Uvedené platí pre server Tomcat. Je nutné konzultovať dokumentáciu ku konkrétnemu aplikačnému serveru, ako nastaviť zabezpečenie web aplikácie. Nasleduje ukážka toho, ako by mala takáto konfigurácia vyzerať. V súbore web.xml je zaregistrovaný filter s názvom SecureFilterRedirector.

tomcat-users.xml:

<?xml version=’1.0′ encoding=’utf-8′?>
<tomcat-users>
  <role rolename=“filter“/>
  <user username=“user“ password=“pwd“ roles=“filter“/>
</tomcat-users>

web.xml:

<web-app>
 <filter>
  <filter-name>SecureFilterRedirector</filter-name>
  <filter-class>
   org.apache.cactus.server.FilterTestRedirector
  </filter-class>
 </filter>
 <filter-mapping>
  <filter-name>SecureFilterRedirector</filter-name>
  <url-pattern>/SecureFilterRedirector</url-pattern>
 </filter-mapping>
 <security-constraint>
  <web-resource-collection>
   <web-resource-name>FilterTest</web-resource-name>
   <url-pattern>/SecureFilterRedirector</url-pattern>
   <http-method>POST</http-method>
   <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
   <role-name>filter</role-name>
  </auth-constraint>
 </security-constraint>
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
 <security-role>
  <role-name>filter</role-name>
 </security-role>
</web-app>

Uvedený príklad je možné aplikovať na ľubovolné URL, nie len čisto na servlet filtre, ktoré sa často využívajú na kontrolu autentifikácie klienta. Napríklad ak chcete zabezpečiť prístup k servletu, jednoducho pridajte jeho URL ako ďalší element <url-pattern></url-pattern>. Názov role filter v súbore tomcat-users.xml musí odpovedať tomu istému v súbore web.xml. Na záver uvediem ešte príklad, ako programovo vykonať autentifikáciu klienta pred samotným spustením testovacej metódy.

public void beginAuthenticatedUser(WebRequest webRequest) {
 webRequest.setAuthentication(
                      new BasicAuthentication(„user“,“pwd“));
}

Samozrejme si aj k tomuto článku môžete stiahnuť balíček ukážkových príkladov. Voľakedy nabudúce si povieme niečo o testovaní servlet filtrov, pri ktorých využijeme nadobudnuté vedomosti v súvislosti s autentifikáciou.

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