Cactus – inicializačné parametre a autentifikácia pri testoch
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ť.
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ý.
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.
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.
Mohlo by vás také zajímat
-
Jak nainstalovat šablonu ve WordPressu
23. července 2024 -
Jak lze snadno upravovat soubory v PDF?
14. září 2023 -
Proč investovat do nejvýkonnějších VPS s AMD EPYC procesory
14. června 2024 -
Zvýšení výkonu WiFi signálu: Jak a proč používat WiFi zesilovače
28. června 2023
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024