<p id='prepend'>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.</p>
<p>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¥ <code>ServletTestCase</code>, 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 <a href='http://interval.cz/serial.asp?serial=5' title='Interval.cz: Java Servlets'>Java Servlets</a>.</p>
<p>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.</p>
<p>Vytvorme si teda servlet, pou₧φvaj·ci cookies, ktorΘho funkΦnos¥ budeme nesk⌠r testova¥.</p>
<br /> if (TEST_COOKIE_NAME.equals(cookies[i].getName())) {
<br /> return cookies[i];
<br /> }
<br /> }
<br /> }
<br /> return new Cookie(TEST_COOKIE_NAME, "0");
<br /> }
<br />}
</div>
<p>PopφÜme si v skratke, Φo vlastne <code>CookieServlet</code> vykonßva. Na zaΦiatku h╛adß cookie s nßzvom <code>testCookie</code> definovan· konÜtantou <code>TEST_COOKIE_NAME</code>. 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 <code>HttpServletResponse</code>.</p>
<p>Teraz si vytvorφme prφsluÜn² servlet test case, a otestujeme nßÜ <code>CookieServlet</code>.</p>
<p>Tento test simuluje, ₧e u₧φvate╛ prv² krßt po₧iadal o servlet. Test <code>testGetFirstCookie()</code> zistφ, Φi met≤da <code>getCookie()</code> vrßtila cookie, ktorß nie je null, mß meno definovanΘ konÜtantou <code>TEST_COOKIE_NAME</code> a jej hodnota je nastavenß na Φφslo nula.</p>
<p>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 <code>doGet()</code> triedy <code>CookieServlet</code>, bol vhodne upraven² objekt <code>HttpServletRequest</code>. Deje sa tak v met≤de <code>beginGetUpdatedCookie()</code>, kde sa nastavφ novß hodnota cookie (3).</p>
<p>Teraz sa m⌠₧e vykona¥ met≤da <code>testGetUpdatedCookie()</code>, ktorß zavolß met≤du <code>doGet()</code> 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 <code>endGetUpdatedCookie()</code>. Tßto met≤da umo₧≥uje vykona¥ testy za ·Φelom overenia, Φi servlet sprßvne upravil cookie, ktorß bola poslanß klientovi.</p>
<p>Overφ sa, Φi cookie poslanß v objekte <code>HttpServletResponse</code> nie je null, a znova, Φi jej nßzov je toto₧n² s konÜtantou <code>CookieServlet.TEST_COOKIE_NAME</code>. ╚o sa t²ka hodnoty, musφ by¥ rovnß Ütyri, teda presne o jeden vΣΦÜia ako bola pred vykonanφm met≤dy <code>doGet()</code>.</p>
<p>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 <a href='podklady/branicky/831/cact_04.zip'>balφΦek</a> 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.</p>
<div class='image'><img src='podklady/branicky/831/cookie_test_xsl.png' alt='V²sledok cactus testu s pou₧itφm XSL' title='V²sledok cactus testu s pou₧itφm XSL' /></div>
<p>Ak vßs zaujφma, ako vyzerß v²sledok testu, ak nepou₧ijete XSL transformßciu, potom zadajte nasledovnΘ URL:</p>
<div class='image'><img src='podklady/branicky/831/cookie_test.png' alt='V²sledok Cactus testu bez XSL' title='V²sledok Cactus testu bez XSL' /></div>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3280' title='(36 komentß°∙)'>Interval.cz a jeho Φtenß°i</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3296' title='(30 komentß°∙)'>PHP pro pokroΦilΘ - znovu t°φdy a objekty</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3301' title='(24 komentß°∙)'>Kompletnφ pr∙vodce XSLT - ·vod do problematiky</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3276' title='(21 komentß°∙)'>Webovß grafika podle TomßÜe BarΦφka</a></li>