home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 June / Chip_2004-06_cd1.bin / chplus / interval / clanek10.htm < prev    next >
Encoding:
Extensible Markup Language  |  2004-05-01  |  16.6 KB  |  215 lines

  1. <?xml version='1.0' encoding='windows-1250'?>
  2. <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
  3. <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='cs' lang='cs'>
  4. <head>
  5. <meta http-equiv='Content-Type' content='text/html; charset=windows-1250' />
  6. <meta http-equiv='Content-language' content='cs' />
  7. <meta http-equiv='Cache-control' content='no-cache' />
  8. <meta http-equiv='Pragma' content='no-cache' />
  9. <meta http-equiv='Expires' content='0' />
  10. <meta name='robots' content='index, follow' />
  11. <meta name='googlebot' content='index, follow, noarchive' />
  12. <meta name='description' content='Interval.cz - Internetov² magazφn o webdesignu, v²voji webov²ch aplikacφ a e-komerci. VÜe podstatnΘ o technologiφch XHTML, HTML, CSS, DHTML, JavaScript, XML, .NET, ASP, PHP, Java, J2ME, SQL, WAP...' />
  13. <meta name='keywords' content='Interval' />
  14. <meta http-equiv='imagetoolbar' content='no' />
  15. <meta http-equiv='MSThemeCompatible' content='no' />
  16. <meta name='MSSmartTagsPreventParsing' content='true' />
  17. <meta name='ICBM' content='49.1915, 16.626' />
  18. <meta name='DC.Title' content='Interval.cz' />
  19. <meta name='DC.Identifier' content='http://interval.cz' />
  20. <meta name='DC.Language' content='cs' />
  21. <link rel='alternate' type='text/xml' title='RSS' href='http://interval.cz/__rss/rss.asp' />
  22. <link rel='shortcut icon' href='favicon.ico' />
  23. <link rel='first' href='http://interval.cz/clanek.asp?article=2561' />
  24. <link rel='prev' href='http://interval.cz/clanek.asp?article=2848' />
  25. <link rel='up' href='http://interval.cz/serial.asp?serial=27' />
  26. <link rel='home' href='http://interval.cz' />
  27. <link rel='search' href='http://interval.cz/search_ex.asp' />
  28. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/html4.css' />
  29. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/basic_all.css' />
  30. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/homepage_all.css' />
  31. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/articles_all.css' />
  32. <link rel='stylesheet' type='text/css' media='print' href='__services/styles/articles_print.css' />
  33. <title>Interval.cz - denn∞ o tvorb∞ webu a e-komerci</title>
  34. </head>
  35. <body class='interval interval-articles'>
  36. <div id='page-header'><div id='interval-logo'><h1 title='Interval.cz - denn∞ o tvorb∞ webu a e-komerci (logo & index link)'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Interval.cz<span></span></a></h1></div><div id='advertising-page-header'></div><div class='page-maker'> </div></div>
  37. <div id='page-topmenu'><h2 class='textversion'>Navigace</h2><div id='page-mainmenu'><h3 class='textversion'>Hlavnφ menu</h3><ul><li class='first selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Titulnφ strana</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=14'>Webdesign</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=15'>V²voj aplikacφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=18'>E-komerce</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=17'>Nßstroje</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=16'>Magazφn</a></li><li class='right selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.inshop.cz'>Knihkupectvφ</a></li><li class='right'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interforum.interval.cz'>Interforum</a></li></ul></div><div id='page-mainmenu-maker'> </div></div>
  38. <div id='page-body'><div id='page-left'><div id='article'>
  39.  
  40.  
  41.  
  42. <h2>Cactus - testovanie cookies</h2>
  43. <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>
  44.  
  45.  
  46. <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>
  47. <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>
  48. <p>Vytvorme si teda servlet, pou₧φvaj·ci cookies, ktorΘho funkΦnos¥ budeme nesk⌠r testova¥.</p>
  49. <p><a href='podklady/branicky/831/CookieServlet.html' title='Farebne zv²raznen² zdrojov² k≤d CookieServlet.java'>CookieServlet.java</a>:</p>
  50.  
  51. <div class='sample'>
  52. import javax.servlet.http.HttpServlet;
  53. <br />import javax.servlet.http.HttpServletResponse;
  54. <br />import javax.servlet.http.HttpServletRequest;
  55. <br />import javax.servlet.http.Cookie;
  56. <br />import java.io.IOException;
  57. <br />
  58. <br />public class CookieServlet extends HttpServlet {
  59. <br />
  60. <br /> public static final String TEST_COOKIE_NAME = "testCookie";
  61. <br />
  62. <br /> protected void doGet
  63. <br />    (HttpServletRequest req, HttpServletResponse res)
  64. <br />       throws IOException {
  65. <br />
  66. <br />  Cookie cookie = this.getCookie(req);
  67. <br />  int count = Integer.parseInt(cookie.getValue());
  68. <br />  count++;
  69. <br />  cookie.setValue(String.valueOf(count));
  70. <br />  res.addCookie(cookie);
  71. <br /> }
  72. <br />
  73. <br /> protected Cookie getCookie(HttpServletRequest req) {
  74. <br />  Cookie[] cookies = req.getCookies();
  75. <br />  if (cookies != null) {
  76. <br />   for (int i=0; i < cookies.length; i++) {
  77. <br />    if (TEST_COOKIE_NAME.equals(cookies[i].getName())) {
  78. <br />     return cookies[i];
  79. <br />    }
  80. <br />   }
  81. <br />  }
  82. <br />  return new Cookie(TEST_COOKIE_NAME, "0");
  83. <br /> }
  84. <br />}
  85. </div>
  86.  
  87. <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>
  88. <p>Teraz si vytvorφme prφsluÜn² servlet test case, a otestujeme nßÜ <code>CookieServlet</code>.</p>
  89. <p><a href='podklady/branicky/831/TestCookieServlet.html' title='Farebne zv²raznen² zdrojov² k≤d TestCookieServlet.java'>TestCookieServlet.java</a>:</p>
  90.  
  91. <div class='sample'>
  92. import org.apache.cactus.ServletTestCase;
  93. <br />import org.apache.cactus.WebRequest;
  94. <br />import org.apache.cactus.WebResponse;
  95. <br />
  96. <br />import javax.servlet.http.Cookie;
  97. <br />
  98. <br />public class TestCookieServlet extends ServletTestCase {
  99. <br />
  100. <br /> private CookieServlet servlet;
  101. <br />
  102. <br /> public TestCookieServlet(String name) {
  103. <br />  super(name);
  104. <br /> }
  105. <br />
  106. <br /> protected void setUp() throws Exception {
  107. <br />  this.servlet = new CookieServlet();
  108. <br /> }
  109. <br />
  110. <br /> public void testGetFirstCookie() throws Exception {
  111. <br />  Cookie cookie = this.servlet.getCookie(this.request);
  112. <br />  assertNotNull("Cookie.", cookie);
  113. <br />  assertEquals(
  114. <br />     "Cookie Name.",
  115. <br />     CookieServlet.TEST_COOKIE_NAME, 
  116. <br />     cookie.getName());
  117. <br />  assertEquals("Cookie Value.","0",cookie.getValue());
  118. <br /> }
  119. <br />
  120. <br /> public void beginGetUpdatedCookie(WebRequest req) {
  121. <br />  req.addCookie(CookieServlet.TEST_COOKIE_NAME, "3");
  122. <br /> }
  123. <br />
  124. <br /> public void testGetUpdatedCookie() throws Exception {
  125. <br />  this.servlet.doGet(this.request,this.response);
  126. <br /> }
  127. <br />
  128. <br /> public void endGetUpdatedCookie(WebResponse res) 
  129. <br />    throws Exception {
  130. <br />  org.apache.cactus.Cookie cookie =
  131. <br />     res.getCookie(CookieServlet.TEST_COOKIE_NAME);
  132. <br />  assertNotNull("Returned Cookie.", cookie);
  133. <br />  assertEquals("Cookie Value.", "4", cookie.getValue());
  134. <br /> }
  135. <br />}
  136. </div>
  137.  
  138. <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>
  139. <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>
  140. <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>
  141. <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>
  142. <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>
  143.  
  144. <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>
  145.  
  146. <p>Ak vßs zaujφma, ako vyzerß v²sledok testu, ak nepou₧ijete XSL transformßciu, potom zadajte nasledovnΘ URL:</p>
  147.  
  148. <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>
  149.  
  150.  
  151.  
  152. <div id='article-author'>
  153. <a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/autor.asp?author=134'>Branick², Marek</a> (23. 4. 2004)
  154.  
  155. </div>
  156.  
  157.  
  158.  
  159. </div></div>
  160. <div id='page-right'><h2 class='textversion'>Prav² sloupek</h2>
  161. <div id='search'><h3 class='textversion'>Vyhledßvßnφ</h3><form method='get' action='http://interval.cz/search.asp'><div><input type='text' name='hledej' class='text' /><input type='submit' class='submit' value='Najdi!' /></div></form><div><a href='http://interval.cz/search_ex.asp'>RozÜφ°enΘ vyhledßvßnφ</a></div></div>
  162.  
  163.  
  164.  
  165. <div class='page-right-box book'>
  166.     <h3>Kni₧nφ novinka</h3>
  167.     <div class='page-right-box-in'>
  168.         <div class='book-top'>
  169.             <h4><a href='http://interval.cz/__redirect/redirect.asp?what=interval_booknews&url=http://interval.inshop.cz/inshop/scripts/detail.asp?ItemID=250'>Zrychlete svΘ WWW strßnky!</a></h4>
  170.         </div>
  171.     </div>
  172.     <div class='image'>
  173.         <img src='podklady/knihy/image.jpg' alt='obßlka' title='obßlka' /></a>
  174.     </div>
  175.     <div class='book-bottom'>Cena: <span class='book-price-old'>390 KΦ</span> <span class='book-price-new'>351 KΦ</span></div>
  176. </div>
  177.  
  178.  
  179.  
  180. <div class='page-right-box reading'>
  181.     <h3>NejΦten∞jÜφ</h3>
  182.     <div class='page-right-box-in'>
  183.         <ul>
  184. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3276'>Webovß grafika podle TomßÜe BarΦφka</a></li>
  185. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3301'>Kompletnφ pr∙vodce XSLT - ·vod do problematiky</a></li>
  186. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3298'>Osv∞dΦenφ z ·Φetnictvφ p°es cΘdΘΦko</a></li>
  187. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3295'>Cactus - testovanie cookies</a></li>
  188. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3302'>K Φemu je nßm MathML</a></li>
  189.         </ul>
  190.     </div>
  191. </div>
  192.  
  193.  
  194.  
  195. <div class='page-right-box cauldron'>
  196.     <h3>Diskuznφ kotel</h3>
  197.     <div class='page-right-box-in'>
  198.         <ul>
  199. <li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3305' title='(48 komentß°∙)'>T°etφ d∞lß byznys</a></li>
  200. <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>
  201. <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>
  202. <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>
  203. <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>
  204.         </ul>
  205.     </div>
  206. </div>
  207.  
  208.  
  209.  
  210. <div class='page-right-box emailserv'><h3>Email servis</h3><div class='page-right-box-in'><form action='prihlaseni.asp' method='post'><div class='shell'><input class='text' type='text' name='adresa' /></div><div class='shell'><input class='radio' type='radio' value='1' name='co' checked='checked' />T²dennφ p°ehled Φlßnk∙</div><div class='shell'><input class='radio' type='radio' value='2' name='co' />HELP konference</div><div class='shell'><input class='submit' type='submit' value='P°ihlßsit' /></div></form></div></div>
  211. </div>
  212. <div class='page-maker'> </div><div class='page-maker-white'> </div></div>
  213. <div id='page-foot'><div id='page-foot-menu'><a href='http://interval.cz/reklama.asp'>Inzerce na Interval.cz</a> | <a href='http://interval.cz/redakce.asp'>Redakce Interval.cz</a> | <a href='http://interval.cz/autori.asp'>Hledßme novΘ autory</a></div><div id='issn'>ISSN 1212-8651</div><div id='page-foot-zoner'>© Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje <a href='http://interval.cz/privacy.asp'>prßvnφ p°edpisy</a>o ochran∞ osobnφch ·daj∙.</div></div>
  214. </body>
  215. </html>