Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky Diplomová práce Nástroje pro podporu testování Plzeň, 2014 Jan Rada
Originál zadání diplomové práce.
Poděkování Děkuji vedoucímu diplomové práce Doc. Ing. Pavlu Heroutovi, Ph.D. za cenné rady, věcné připomínky a vstřícnost během konzultací.
Prohlášení Prohlašuji, že jsem diplomovou práci vypracoval samostatně a výhradně s použitím citovaných pramenů. V Plzni dne 15. května 2014 Jan Rada
Abstract Supporting tools for testing This diploma thesis deals with the supporting tools for testing, especially the Selenium, JMeter and Redmine tools. The main objective of the thesis was to propose and prepare several small student projects for the needs of the KIV/OKS (Software Quality Assurance) subject instructed at the University of West Bohemia. With regard to the requirement of automated validation of the submitted assignments I selected the combination of the Selenium and JUnit technologies as the most suitable for this purpose. Two simple web applications containing intentionally entered errors were created as a basis for testing. Finally, applications in the Java programming language were created, serving for validation of each of the couple of designed projects. The applications are used for local inspection of projects performed by students before the projects are submitted and are also used as a basis for automated validation as soon as the projects are submitted to the server. Abstrakt Nástroje pro podporu testování Tato diplomová práce se zabývá nástroji pro podporu testování, zejména nástroji Selenium, JMeter a Redmine. Hlavním cílem práce bylo navrhnout a připravit několik malých studentských projektů pro potřeby předmětu KIV/OKS (Ověřování kvality software) vyučovaného na Západočeské univerzitě v Plzni. S ohledem na požadavek automatické validace těchto úloh při jejich odevzdávání jsem pro tento účel vybral jako nejvhodnější použití kombinace technologií Selenium a JUnit. Jako podklad pro testování byly vytvořeny dvě jednoduché webové aplikace obsahující záměrně zanesené chyby. Na závěr byly vytvořeny aplikace v programovacím jazyku Java, které slouží k validaci každého z dvojice navržených projektů. Tyto aplikace jsou využívány k lokální kontrole projektu prováděné studentem před jeho odevzdáním a jsou také použity jako základ automatické validace při odevzdávání projektů na server.
Obsah 1 Úvod 1 2 Testování softwaru 2 2.1 Vymezení pojmu............................. 2 2.2 Důvody testování............................. 2 2.3 Kategorie testů.............................. 3 2.4 Ideální počet a typ testů......................... 4 2.5 Automatizované testování........................ 5 3 Nástroje pro podporu testování 6 3.1 Vymezení pojmu............................. 6 3.2 JUnit.................................... 6 3.3 TestNG.................................. 7 3.4 Selenium.................................. 8 3.4.1 Selenium IDE........................... 8 3.4.2 Selenium RC........................... 11 3.4.3 Selenium WebDriver....................... 12 3.4.4 Selenium Grid........................... 14 3.4.5 Selenium 2 + JUnit........................ 14 3.4.6 Selenium 2 + TestNG...................... 16 3.4.7 Selenium a návrhové vzory.................... 16 3.5 JMeter................................... 17 3.5.1 Základní elementy testového plánu............... 19 3.6 Redmine.................................. 20 4 Validátor 22 4.1 Validační doména............................. 22 4.2 Princip validace.............................. 23 5 Výběr nástrojů pro realizaci projektů 25 5.1 Selenium.................................. 25 5.2 JMeter................................... 26 5.3 Redmine.................................. 27 5.4 Shrnutí................................... 27
6 Webová aplikace pro testování 28 6.1 Převodník................................. 29 6.1.1 Úmyslné chyby.......................... 30 6.2 Diskusní fórum.............................. 31 6.2.1 Úmyslné chyby.......................... 32 7 Projekt oks-09 33 7.1 Cíl projektu................................ 33 7.2 Analýza.................................. 33 7.3 Řešení................................... 34 7.3.1 Ověření možností Validátoru................... 34 7.3.2 Výsledný způsob kontroly.................... 35 7.4 Kontrolní program............................ 36 7.4.1 Popis tříd programu....................... 37 7.5 Validační doména............................. 39 7.6 Zadání projektu.............................. 40 7.7 Zhodnocení................................ 40 8 Projekt oks-10 41 8.1 Cíl projektu................................ 41 8.2 Analýza.................................. 41 8.2.1 JUnit vs. TestNG......................... 41 8.2.2 Vytváření instance WebDriveru................. 42 8.2.3 Použití konstant pro lokátory.................. 43 8.2.4 Volání privátních metod..................... 43 8.3 Řešení................................... 44 8.4 Kontrolní program............................ 45 8.5 Validační doména............................. 46 8.6 Zadání projektu.............................. 46 8.7 Zhodnocení................................ 46 9 Závěr 47 Slovník použitých termínu a zkratek 48 Použité zdroje a literatura 50 Přílohy 52 Příloha A Specifikace webové aplikace Převodník............. 53 Příloha B Specifikace webové aplikace Diskusní fórum........... 56
Příloha C Obsah přiloženého CD...................... 61 Příloha D Uživatelská příručka....................... 63
1 Úvod Od začátku letního semestru akademického roku 2013/2014 je na Katedře informatiky a výpočetní techniky Fakuty aplikovaných věd Západočeské univerzity v Plzni vyučován předmět KIV/OKS (Ověřování kvality software). Náplní tohoto předmětu je seznámit studenty se základními principy zajištění kvality a testování software včetně získání praktických zkušeností se softwarovými nástroji užívanými k podpoře těchto činností [1]. Pro potřeby předmětu bylo nezbytné navrhnout několik menších studentských projektů sloužících k doplnění výuky a praktickému seznámení s některými nástroji a technologiemi. Tato diplomová práce se zaměřuje zejména na nástroje Selenium, JMeter a Redmine. Cílem práce je prozkoumat možnosti výše uvedených nástrojů, na základě získaných poznatků vybrat některé z nich pro přípravu studentských úloh a tyto úlohy kompletně připravit. Důležitým požadavkem je možnost automatické validace úloh při jejich odevzdávání. V rámci přípravy studentských úloh je zapotřebí formulovat zadání s ohledem na skutečnost, že výstup by mělo být možné automaticky validovat s použitím prostředků již existující aplikace validátoru. Dále je nutné vyhotovit podklady pro řešení navržených úloh (testovanou aplikaci obsahující úmyslně zanesené chyby) a vzorová řešení. Rovněž je vyžadováno pro jednotlivé navržené úlohy vytvořit kontrolní programy. Tyto programy budou mít k dispozici studenti a budou sloužit k lokální kontrole zpracovaných úloh před jejich odevzdáním. Na závěr by měla být připravena automatická kontrola Validátorem, prováděná při odevzdávání úloh na server. Realizace tohoto bodu spočívá v sestavení tzv. validační domény, která je tvořena posloupností kroků vedoucích k odhalení nedostatků v odevzdávaných úlohách. Stěžejní částí této kontroly bude spuštění totožného kontrolního programu, který budou mít k dispozici studenti. 1
2 Testování softwaru Následující text obsahuje vysvětlení a ujasnění některých pojmů z oblasti testování. V této části práce bylo čerpáno zejména z [2], [3] a [4]. 2.1 Vymezení pojmu Testování softwaru je proces, jehož cílem je odhalit chyby v testované aplikaci. Chybou obvykle rozumíme rozpor mezi očekávaným a skutečným chováním, ale za chybu může být například považována i špatná uživatelská přívětivost. Jako chybu obecně označujeme nesoulad skutečného stavu s požadavky na aplikaci. Požadavky jsou definovány specifikací produktu. Ta může mít podobu pouze ústní, myšlenou (zpravidla u projektů velmi malého rozsahu), nebo se může jednat o psaný dokument splňující určité náležitosti. Podle literatury [2] hovoříme o chybě (přesněji softwarové chybě) v následujících případech: Software nedělá něco, co by podle specifikace produktu dělat měl. Software dělá něco, co by podle specifikace produktu dělat neměl. Software dělá něco, o čem se produktová specifikace nezmiňuje. Software nedělá něco, o čem se produktová specifikace nezmiňuje, ale měla by se zmiňovat. Software je obtížně srozumitelný, těžko se s ním pracuje, je pomalý, nebo podle názoru testera software jej koncový uživatel nebude považovat za správný. 2.2 Důvody testování Důvodem pro testování softwaru je odhalení chyb v aplikaci ještě před tím, než mohou nějakým způsobem uškodit. Cílem je chyby zachytit v co možná nejranější fázi vývoje produktu. S rostoucí dobou odhalení chyby totiž výrazně rostou náklady (časové, popř. finanční) spojené s její opravou [5]. Dalším důvodem může být snaha ujistit se, že je produkt takový, jaký byl zamýšlen, a zda vyhovuje specifikaci. 2
Úspěšné vykonání testů ovšem není možné považovat za důkaz správnosti programu. K získání důkazu správnosti by bylo zapotřebí otestovat množinu všech možných vstupů programu (což je většinou vzhledem k její velikosti nereálné), popř. provést matematický důkaz. Testováním lze ale bezpečně odhalit, že je produkt špatně a díky tomu včas zajistit jeho opravu. Vhodné použití testování jednoznačně přispívá ke zvýšení kvality výsledného softwarového produktu. 2.3 Kategorie testů Testy lze členit do kategorií podle množství kritérií. V následující části textu zmíním pouze nejčastěji používaná dělení. Jednou z možností je rozdělení testů na dynamické a statické. Klíčový je v tomto případě fakt, zda se v rámci testu provádí (dynamický test) nebo neprovádí (statický test) spuštění testované aplikace. Dalším často používaným kritériem je úroveň znalosti testovaného kódu. Zde se používá označení testování černé skříňky (black box) nebo bílé skříňky (white box). V některých případech se zavádí i pojem testování šedé skříňky (gray box). Testování černé skříňky znamená, že tester nemá žádné podrobné informace a znalosti o testované aplikaci z hlediska její implementace a testuje pouze na základě známých vstupů a očekávaných výstupů. Tento způsob testování nejlépe simuluje reálné použití aplikace běžným uživatelem. Naopak při testování bílé skříňky jsou testerovi známy veškeré detaily implementace. Díky tomu je možné testy více zacílit na některá problematická místa implementace a více se soustředit na určitou část množiny vstupů. Testování bílé skříňky ovšem přináší riziko, že tester ovlivněný detailní znalostí implementace testy příliš přizpůsobí na míru programu. Testy poté nemusí být účinné. Testování šedé skříňky je kombinací předchozích případů, kdy tester má nějaké informace o implementaci (například zná použitý algoritmus), ale přesná implementace je mu skryta. 3
Testy je možné rozdělit podle fáze životního cyklu softwarového produktu, v níž se testování provádí. Skupiny testů jsou pak následující: jednotkové testy zejména v rané fázi vývoje, testuje se správná funkčnost malých částí systému (jednotek), integrační testy testuje se správná funkčnost různých částí systému (jednotek) zapojených do celku, systémové testy obsáhlé testy napříč celým systémem, akceptační testy kontrola splnění testovacích scénářů, kterými je podmíněno převzetí produktu zákazníkem. Posledním z nejčastěji používaných způsobů členění testů je členění podle tzv. dimenze kvality na testy: funkčnosti testuje se správné chování systému, použitelnosti testuje se uživatelská přívětivost, spolehlivosti testuje se chování při nedostatku nebo nedostupnosti zdrojů, zotavení po chybě, podpory testuje se náročnost instalace, funkčnost na požadovaných SW a HW konfiguracích, výkonu testují se požadované odezvy systému při různých úkonech, a další (lokalizovatelnosti, kompatibility, bezpečnosti, atd.). 2.4 Ideální počet a typ testů Kvůli rozmanitosti vytvářených softwarových produktů není možné ideální počet a typ testů jednoznačně definovat. Obojí se odvíjí od nároků kladených na danou aplikaci. Zcela odlišné nároky budou kladeny na jednoduchou utilitu určenou pro vlastní potřebu, na informační systém, nebo na software provádějící řízení nějakého kritického procesu. Stanovení optimální hladiny testování je tedy záležitostí kvalifikovaného odhadu, jehož úspěšnost je ovlivněna zkušeností testera. Při tomto 4
rozhodování mohou být nápomocné některé metriky poskytované softwarovými nástroji např. pokrytí kódu testy. Typ testů bývá v některých případech omezen samotným produktem. Pokud například nemáme k dispozici jeho zdrojové kódy ani základní informace o implementaci, jsme odkázáni jen na testy černé skříňky. Vyloučeny jsou v tomto případě také statické nebo jednotkové testy. Zaměření produktu souvisí s volbou testů podle dimenze kvality. Například u bankovního systému budou zcela jistě kladeny zvýšené nároky na oblast bezpečnosti. Výsledná množina testů se označuje jako tzv. testovací mix. 2.5 Automatizované testování Základní myšlenkou každého testu je testovací scénář. Ten má podobu několika logicky navazujících kroků a může být předáván ústně nebo může mít například následující podobu: 1. Prostřednictvím příkazové řádky spusťte program faktorial. 2. Jako vstup zadejte pomocí klávesnice číslici 5 a potvrďte stiskem klávesy Enter. 3. Zkontrolujte, zda textový výstup zapsaný do souboru vystup.txt v adresáři vystup odpovídá faktoriálu čísla 5, tedy hodnotě 120. Díky testovacímu scénáři je možné stejný test vykonat opakovaně. U jednoduchých programů malého rozsahu se lze spokojit s manuálním vykonáváním testovacích scénářů přímo testerem. Pokud bychom ale potřebovali otestovat rozsáhlejší aplikaci, byl by tento způsob z hlediska časové náročnosti nevyhovující. S rostoucím počtem prováděných testů by se navíc zvyšovala i pravděpodobnost, že se chyby dopustí samotný tester. Výše uvedený testovací scénář by přitom bylo možné přepsat do podoby jednoduchého skriptu. Tester by pak prováděl pouze jeho spuštění a vyhodnocení výsledku. Z důvodu usnadnění a zefektivnění procesu testování existuje řada testovacích frameworků. Ty zpravidla přinášejí možnost testovací scénář zapsat ve formě zdrojového kódu, který pak může být opakovaně spouštěn. S použitím některých nástrojů lze automatizovat i spouštění testů (například vždy před buildem produktu). Náplň práce testera pak tvoří psaní nových testů a hlášení chyb, které byly testy odhaleny. Tester by měl dále dohlížet na provedení oprav reportovaných chyb. 5
3 Nástroje pro podporu testování 3.1 Vymezení pojmu Označení nástroje pro podporu testování je poměrně široký pojem. Jako zástupce této množiny lze chápat různé testovací frameworky, které jsou přínosné hlavně z hlediska opakovatelnosti testů. Dále do této skupiny můžeme zařadit nástroje sloužící k řízení automatizovaného spouštění testů, jejich vyhodnocování a ukládání výsledků. Také si pod tímto pojmem můžeme představit softwarové produkty zaměřené na reportování chyb a na řízení procesu jejich odstranění. Obecně se tedy dá říci, že mezi nástroje pro podporu testování řadíme jakýkoli softwarový produkt, který s testováním nějakým způsobem souvisí. 3.2 JUnit V této podkapitole jsem čerpal z [6]. JUnit [7] je nejznámější testovací framework zaměřený na tvorbu jednotkových testů v programovacím jazyce Java. V důsledku rozsáhlé uživatelské základny je nástroj podporován většinou vývojových prostředí pro tuto platformu a má široké možnosti integrace. Framework přináší oddělení produkčního kódu od testovacího a jde s jeho pomocí úspěšně nahradit i primitivní formy testování typu kontrolních výpisů na standardní výstup. Použití může mít pozitivní vliv také na strukturu zdrojového kódu aplikace, jelikož nutí programátora psát poměrně krátké jednotky kódu (metody). Podporovány jsou dnes již hojně používané anotace a od několika posledních verzí i parametrizované testy nebo registrace vlastních posluchačů. Tvůrci Kent Beck a Erich Gammy propagují cestu nezávislých testů, u kterých nezáleží na pořadí jejich vykonávání. Podoba jednoduché JUnit testovací třídy (tzv. test case) je znázorněna v ukázce kódu 3.1. 1 public class UkazkovyTest { 2 @Test 3 public void t e s t ( ) { 4 a s serttrue ( TestovanaTrida. vrattrue ( ) ) ; 5 } 6 } Ukázka kódu 3.1: Jednoduchý JUnit test 6
V ukázce kódu 3.1 je použita jediná testovací metoda s názvem test, ve které je prováděno ověření návratové hodnoty statické metody vrattrue. Testovací třídy lze s využitím prostředků JUnit seskupovat do větších celků (nazývaných test suite) reprezentovaných samostatnou třídou a testy v nich obsažené pak spouštět naráz. 3.3 TestNG Framework TestNG ( Test Next Generation ) [8] je inspirován frameworkem JUnit a z hlediska použití je tomuto frameworku také velmi podobný. Autory jsou Cédric Beust a Hani Suleiman. Jedná se o druhý nejpoužívanější testovací framework pro jednotkové testy, takže jeho podpora ve vývojových prostředích je velmi dobrá. Lze jej využívat téměř totožně jako JUnit, ale navíc dovoluje i naprosto odlišný přístup a pohled na testování aplikací jednotkovými testy. Nabízí totiž například členění testů (testových metod) v rámci testové třídy do skupin a definici závislostí mezi jednotlivými testy nebo skupinami. Tím umožňuje ovlivnit pořadí vykonání testů. Rozšířené možnosti TestNG lze s výhodou využít zejména při integraci s jinými frameworky. Princip použití závislostí mezi testy, které jsou vytvořeny s využitím anotací, je patrný z ukázky kódu 3.2. 1 public class UkazkovyTest { 2 @Test 3 public void t e s t 1 ( ) { 4 a s serttrue ( TestovanaTrida. vrattrue ( ) ) ; 5 } 6 7 @Test ( dependsonmethods = { " t e s t 1 " }) 8 public void t e s t 2 ( ) { 9 a s s e r t F a l s e ( TestovanaTrida. v r a t F a l s e ( ) ) ; 10 } 11 } Ukázka kódu 3.2: Jednoduchý TestNG test V ukázce kódu 3.2 je definovanou závislostí (řádek 7) zajištěno, že testovací metoda test2 bude při každém spuštění testů vykonána pouze po úspěšném vykonání metody test1. Třídy s TestNG testy se dají obdobně jako u JUnit sloučit do větších celků, ale zde je každý test suite tvořen konfiguračním souborem ve formátu XML. 7
3.4 Selenium Selenium [9] je sada nástrojů určených primárně k automatizovanému testování webových aplikací. Dovoluje však i jiné způsoby užití například k automatizaci rutinních úkonů prováděných prostřednictvím webového rozhraní nějakého systému. Pomocí Selenium lze dokonale simulovat chování uživatele, jeho interakci s webovou aplikací a testovat tak její funkcionalitu. Jelikož se jedná testování již vytvořené a spuštěné webové aplikace prostřednictvím GUI, spadají Selenium testy do kategorie systémových testů a jejich uplatnění je tedy až v pokročilejších fázích vývoje softwarového produktu. Za vývojem projektu Selenium v dnešní době stojí mnoho osobností, původním tvůrcem je ale Jason Huggins. Selenium je v současnosti nejrozšířenějším a nejpoužívanějším produktem tohoto druhu. 3.4.1 Selenium IDE Selenium IDE je jedním z nástrojů sady Selenium. Je distribuováno ve formě doplňku do internetového prohlížeče Firefox (viz obr. 3.1). Nástroj je cílen zejména na skupinu uživatelů bez programátorských znalostí a zkušeností, kterým i tak dovoluje vytvářet poměrně komplexní testy. Jeho předností je grafické uživatelské rozhraní umožňující vytvářet testy prostřednictvím záznamu uživatelem prováděných akcí. Takto zaznamenané posloupnosti akcí (testové případy), tvořené dílčími kroky, lze dále editovat nebo rovnou beze změn spouštět. Pro potřeby testování je ale nezbytné doplnit přinejmenším kroky provádějící ověřovací příkazy. Testy je samozřejmě možné vytvářet i bez využití záznamu a kroky testů přidávat manuálně. Každý krok testu se skládá z trojice: příkaz (command), cíl (target) a hodnota (value). Příkaz tvoří řetězec reprezentující nějakou akci např. open provádí přechod na URL adresu. Řetězec zadávaný do pole cíl může mít různou interpretaci. Ve většině případů se jedná o lokátor elementu webové stránky, nad kterým má být vykonána požadovaná akce. U výše uvedeného příkazu open je ale v poli cíl očekávána URL adresa, na kterou má být proveden přechod. Do posledního z polí ( hodnota ) se zadává řetězec, který je v rámci akce použitý jako vstup (například do textového pole formuláře). Během vyplňování polí může být nápomocna on-line nápověda zobrazovaná na kartě Reference. Při manuálním vytváření testových případů nebo při editaci testových případů vytvořených záznamem je také velmi užitečná kontextová nabídka zobrazovaná po stisku pravého tlačítka myši na ně- 8
Obrázek 3.1: Selenium IDE grafické uživatelské rozhraní kterém z elementů stránky. Nabídka obsahuje návrhy příkazů dostupných pro daný element. Krok testového případu lze tedy jednoduše vytvořit výběrem požadované akce z kontextové nabídky. Pokud jsou ve vytvořeném testovém případu zadány veškeré přechody mezi stránkami jako relativní adresy (což je doporučováno), je pak snadné test spustit na jiné adrese bez nutnosti jeho velkých úprav. Relativní adresy se vztahují k tzv. base URL zobrazené v horní části okna doplňku, kterou stačí přepsat. Toto je výhodné v situacích, kdy shodný test požadujeme spouštět například na testovací i produkční verzi webové aplikace. Doplněk podporuje vytvoření a uložení sady testů (test suite) složené z více testových případů. Jedná se o jedinou možnost, jak po spuštění doplňku načíst více testových případů naráz. Výchozí formát ukládaných sad testů i testových případů je HTML. Jak jsem již zmínil, Selenium IDE cílí spíše na uživatele bez programátorských znalostí. Velmi dobře ale poslouží i zkušenějším uživatelům při seznamování s pro- 9
duktem Selenium. Tito uživatelé ale budou postupně narážet na různá omezení. Omezením je například absence řídících struktur použitelných v testu. Limitující je také spuštění testů výhradně v internetovém prohlížeči Firefox. Pokročilejší způsoby použití Selenium testů jsou popsány v následujících podkapitolách. Selenium IDE poskytuje export vytvořených testů do podoby zdrojového kódu v různých programovacích jazycích. Z pohledu této práce je zajímavý zejména export do zdrojového kódu Javy využívajícího JUnit testy. Základní příkazy Základní příkazy pro tvorbu testů jsou uvedeny v tabulce 3.1. Příkaz Cíl Hodnota Popis open <adresa> sendkeys <lokátor> <řetězec> clickandwait <lokátor> přechod na požadovanou URL adresu, adresa je prvním parametrem postupný stisk kláves odpovídajících znakům řetězce, který tvoří druhý parametr příkazu, prvním parametrem je lokátor elementu událost stisku levého tlačítka myši, parametrem je lokátor elementu asserttitle <vzor> porovnání titulku stránky se vzorem asserttext <lokátor> <vzor> assertvalue <lokátor> <vzor> porovnání textu elementu (například nadpisu) se vzorem porovnání obsahu elementu (například obsahu vstupního pole formuláře) se vzorem Tabulka 3.1: Selenium IDE základní příkazy Ke každému z dostupných assert příkazů (např. asserttitle) existuje jeho verify varianta (např. verifytitle). Rozdíl mezi assert a verify příkazy spočívá v odlišném chování při výskytu chyby ověření. U assert příkazů je po chybě zbytek testového případu přeskočen. Naopak při selhání verify příkazu je zbytek testu vykonán (i tak je ale označen jako chybný). 10
Lokátory Typy lokátorů (řetězců vyplňovaných do polí target sloužících k výběru elementů webové stránky) použitelných při vytváření testů v Selenium IDE jsou následující: identifer vybírá elementy webové stránky, jejichž atributy id nebo name vyhovují zadanému řetězci, id vybírá elementy webové stránky s daným id, name vybírá elementy webové stránky s daným name, XPath vybírá elementy webové stránky podle XPath výrazu, link vybírá hypertextové odkazy tvořené daným textem, DOM vybírá elementy webové stránky s využitím DOM (elementy vyhovující danému JavaScriptovému popisu elementů v objektovém modelu stránky), CSS vybírá elementy webové stránky vyhovující danému lokátoru kaskádových stylů. Poznámka: Preference lokátorů používaných při záznamu testového scénáře lze upravovat v nastavení Selenium IDE. 3.4.2 Selenium RC Nástroj Selenium RC (někdy též označován jako Selenium 1) je oproti Selenium IDE určen pokročilejším uživatelům a jeho použití vyžaduje alespoň elementární programátorské znalosti. Základem je tzv. Remote Control Server. Jedná se o program napsaný v programovacím jazyku Java, který musí být spuštěn před vykonáváním testů. RC Server zajišťuje vytvoření okna prohlížeče, interpretuje a spouští Selenium příkazy (tzv. Selenese ) a figuruje jako prostředník mezi internetovým prohlížečem a testovanou aplikací. Druhou část Selenium RC tvoří RC Client, což je knihovna poskytující rozhraní mezi použitým programovacím jazykem (ve kterém jsou s použitím knihovny testy napsány) a RC Serverem. Zjednodušené schéma je na obrázku 3.2. 11
Obrázek 3.2: Selenium RC zjednodušené schéma Hlavní výhodou pro zkušené programátory je možnost psát scénáře testů přímo v oblíbeném programovacím jazyce (což je obvykle rychlejší než záznam a editace kroků v Selenium IDE). Díky tomu lze testy obohatit o libovolnou logiku realizovanou standardními konstrukcemi daného programovacího jazyka včetně řídících struktur nebo o použití dalších knihoven. Selenium RC je na oficiálních stránkách označeno jako deprecated (zastaralé) a ačkoli je do jisté míry stále podporováno, tak není příliš vhodné jej používat. Důvodem je zejména horší kompatibilita s novějšími verzemi internetových prohlížečů a nestabilní chování testů. 3.4.3 Selenium WebDriver Selenium WebDriver je plnohodnotnou náhradou za starší Selenium RC. Nástroj je díky jednotnému rozhraní WebDriver, podporovaného internetovými prohlížeči, možné používat bez spuštění jakékoli aplikace serveru (viz obrázek 3.3). Využití pokročilejších funkcí (například spuštění testů na jiném stroji), ale běžící instanci serveru nadále vyžaduje. Použití Selenium WebDriver je na úrovni zdrojového kódu velmi podobné Selenium RC. Přináší ale rozšíření některých možností a celkově je uživatelsky přívětivější. 12
Obrázek 3.3: Selenium WebDriver zjednodušené schéma V některých zdrojích je jako ekvivalentní označení pro Selenium WebDriver uváděno Selenium 2. Přesněji je ale Selenium 2 souhrnný název balíku, který zahrnuje starší Selenium RC (Selenium 1) i novější Selenium WebDriver. Takto budou pojmy chápány také ve zbytku práce. Při psaní testů je nejprve nutné vytvořit instanci třídy implementující rozhraní WebDriver. Použitá třída určuje internetový prohlížeč, který bude použitý k vykonání testů. Dostupné jsou následující implementace: FirefoxDriver, HtmlUnitDriver, InternetExplorerDriver, ChromeDriver, OperaDriver, SafariDriver, PhantomJSDriver, AndroidDriver, iosdriver. Velmi zajímavá je například implementace HtmlUnitDriver, která je založena na prohlížeči HtmlUnit. Tento internetový prohlížeč je naprogramovaný v jazyce Java a nemá grafické uživatelské rozhraní. To umožňuje spuštění testů i na strojích bez grafického rozhraní. Výhodou HtmlUnitDriver je také rychlost vykonání testů. Naopak nedostatkem je horší podpora JavaScriptu. 13
Lokátory Možnosti lokalizace elementů webové stránky při použití Selenium WebDriver jsou tyto: id vybírá elementy webové stránky s daným id, classname vybírá elementy webové stránky s daným názvem class, name vybírá elementy webové stránky s daným name, tagname vybírá elementy webové stránky s daným označením elementu v objektovém modelu stránky, cssselector vybírá elementy webové stránky vyhovující danému lokátoru kaskádových stylů, xpath vybírá elementy webové stránky vyhovující danému XPath výrazu, linktext vybírá hypertextové odkazy tvořené daným textem, partiallinktext vybírá hypertextové odkazy, jejichž část textu odpovídá danému řetězci, Poznámka: Lokátory použitelné v rámci Selenium WebDriver částečně odpovídají lokátorům použitelným v Selenium IDE. 3.4.4 Selenium Grid Selenium Grid je posledním zástupcem z množiny Selenium nástrojů. Používá se k paralelnímu běhu testů. Umožňuje také současné testování na několika různých platformách. Díky distribuci testů mezi více strojů se zkracuje doba potřebná k jejich vykonání. 3.4.5 Selenium 2 + JUnit K použití Selenium testů v praxi je velmi výhodná integrace s dalšími testovacími frameworky. Na platformě Java je vhodným frameworkem například JUnit. Podoba výsledných testů (viz ukázka kódu 3.3) se od klasických JUnit testů příliš neliší. 14
V testových metodách se využívají standardní assert metody z knihovny JUnit, ale ve zbytku těla testu jsou používány metody a objekty Selenium knihovny doplněné o libovolný Java kód. V testech je rovněž možné využívat funkcionalitu poskytovanou dalšími knihovnami. 1 public c l a s s UkazkovySeleniumTest { 2 /** 3 * Test vyhledani s l o v a " selenium " na Google. 4 */ 5 @Test 6 public void t e s t ( ) { 7 WebDriver d r i v e r = new F i r e f o x D r i v e r ( ) ; 8 d r i v e r. get ( " https : / /www. g oogle. cz / " ) ; 9 10 // zadani vstupu 11 WebElement vyhledavacipole = d r i v e r. findelement (By 12. name( " q " ) ) ; 13 vyhledavacipole. sendkeys ( " selenium " ) ; 14 15 // vyckani na dynamicke p r e k r e s l e n i stranky 16 WebDriverWait cekani = new WebDriverWait ( d r i v e r, 1 0 ) ; 17 cekani. u n t i l ( ExpectedConditions 18. t i t l e C o n t a i n s ( " selenium " ) ) ; 19 20 // z i s k a n i t i t u l k u okna 21 S t r i n g t i t u l e k = d r i v e r. g e t T i t l e ( ) ; 22 23 d r i v e r. q u i t ( ) ; 24 25 // porovnani t i t u l k u s ocekavanym vysledkem 26 a s s e r t E q u a l s ( " selenium Hledat Googlem ", t i t u l e k ) ; 27 } 28 } Ukázka kódu 3.3: Jednoduchý Selenium test Spuštění testů je díky frameworku JUnit velmi jednoduché. Provádí se například přímo v použitém vývojovém prostředí (viz obrázek 3.4) nebo lze testy spouštět nástroji Maven [10] či Ant [11]. 15
Obrázek 3.4: Vývojové prostředí Eclipse spuštění JUnit testů 3.4.6 Selenium 2 + TestNG Integrace s testovacím frameworkem TestNG má stejné přínosy jako integrace s JUnit. Nabízí ale navíc definice závislostí mezi testy. To je výhodné zejména při testování webových aplikací většího rozsahu. Pomocí závislostí lze eliminovat duplicitní kód testů a usnadnit lokalizaci chyb na základě výsledků testů. Typickým příkladem je testování webové aplikace, která má určitou funkcionalitu přístupnou pouze pro registrované uživatele. Před každým testem této skryté funkcionality je tedy nutné vykonat přihlášení uživatele a po skončení testu zase odhlášení. Samotné přihlášení uživatele je navíc kontrolováno samostatným testem. Duplicitní kód provádějící přihlášení lze eliminovat vytvořením opakovaně volané metody. Pokud je ale v aplikaci chyba v přihlášení, dojde k selhání velkého počtu testů a identifikace chyby je komplikovaná. S použitím závislostí je možné jednoduše zajistit, že všechny testy funkcionality dostupné přihlášenému uživateli proběhnou až po testu přihlášení (tzn. v okamžiku, kdy je již uživatel přihlášen). V případě selhání testu přihlášení jsou všechny závislé testy přeskočeny (ve výstupu označeny jako skipped ) a z výstupu spuštění testů je na první pohled identifikovatelná chyba v aplikaci (viz obrázek 3.5). 3.4.7 Selenium a návrhové vzory Přirozenou součástí životního cyklu každé webové aplikace je její postupný vývoj. Dochází k opravám chyb, rozšíření funkcionality a k dalším změnám. Selenium testy jsou však velmi závislé na uživatelském rozhraní aplikace. Každá menší změna tak může významně ovlivnit funkčnost testů. Aby byly vytvořené testy udržovatelné, 16
Obrázek 3.5: Vývojové prostředí Eclipse spuštění TestNG testů je při jejich psaní nezbytné dodržovat některé konvence a případně se inspirovat návrhovými vzory. Zajímavý a často používaný návrhový vzor má název PageObjects. Tento návrhový vzor vychází ze skutečnosti, že mnohem častěji dochází ke změně uživatelského rozhraní aniž by se výrazně změnila aplikací poskytovaná funkcionalita. Slovní formulace scénářů testů se v těchto případech nemění (provádí se stejné akce), ale kód Selenium testů je přesto potřeba upravit (úprava lokalizace elementů stránky). Myšlenka návrhového vzoru proto spočívá v oddělení vzhledu stránky (lokalizace elementů) od její funkcionality. Implementace se provádí vytvořením tříd reprezentujících jednotlivé stránky webové aplikace. Každá z těchto tříd obsahuje metody odpovídající funkcím dané stránky. Lokalizace elementů stránky se tedy vyskytují pouze v těchto metodách a zde také probíhá jejich úprava v případě změny testované aplikace. Kód testů je realizován vytvářením instancí tříd ekvivalentních stránkám aplikace (PageObjects) a voláním jejich metod. Při změně uživatelského rozhraní aplikace zůstává kód testů neměnný. 3.5 JMeter JMeter [12] je dalším nástrojem (vytvořeným v programovacím jazyce Java) zaměřeným na testování webových aplikací. Tentokrát se ale primárně jedná o jejich zátěžové testy. Během několikaletého vývoje (přibližně od roku 2001) získal 17
JMeter řadu dalších funkcí. Jedná se tak o poměrně komplexní nástroj využitelný k mnoha účelům. Kromě testů webových aplikací dokáže ověřovat webové služby, síťovou infrastrukturu, uložiště, emailové servery, databáze a další. Mimo sledování výkonnostních parametrů zvládá i kontrolu správnosti odpovědí. Typickým použitím je u webové aplikace předem vyzkoušet chování při očekávaném zatížení nebo naopak simulovat její extrémní zatížení (tzv. stresové testy). Program sice zastupuje běžné uživatele a s webovým serverem komunikuje jako internetový prohlížeč, odpovědi serveru se ale nesnaží interpretovat. Neprovádí se tedy vykonání JavaScriptu. K vytváření testů je vhodné využít grafické uživatelské rozhraní (viz obrázek 3.6). Zajímavou funkcí je sestavení testů prostřednictvím záznamu. K tomu je nutné program nakonfigurovat jako proxy server a nastavit jej v internetovém prohlížeči. Následně se dotazy na servery prováděné prohlížečem ukládají jako součást testového plánu. Ten lze ale vytvořit i zcela manuálně. Testy se sestavují přidáváním předdefinovaných elementů v levé části okna a jejich případnou konfigurací. Výsledný test je možné ihned spustit a sledovat průběžné výsledky v okně aplikace. Testy se ukládají ve formátu XML. Ke spouštění uložených testů není nezbytné využívat grafické rozhraní aplikace. Podporováno je spouštění prostřednictvím příkazové řádky bez GUI. Obrázek 3.6: JMeter grafické uživatelské rozhraní 18
Pro simulaci větší zátěže může být limitující výkon stroje, na kterém je JMeter spuštěn. Větší zátěž lze zajistit použitím více strojů, které spolu komunikují. 3.5.1 Základní elementy testového plánu V této podkapitole jsou stručně popsány základní elementy testového plánu použité v ukázce na obrázku 3.6. ThreadGroup Tento element je základem každého testového plánu. Ostatní vkládané elementy tvoří jeho potomky. Základní konfigurační parametry jsou: Number of threads počet spouštěných vláken (počet uživatelů), Ramp-up period určuje prodlevu spouštění vláken, Loop count počet opakování každého vlákna. HTTP Request HTTP Request je element spadající do kategorie Samplers. Elementy této kategorie zajišťují odesílání požadavků. V konfigurační části HTTP Request se nastavuje adresa serveru, port, použitá metoda (GET/POST) a další parametry spojené s HTTP dotazem. Graph Result Jedná se o element z kategorie Listeners (posluchači). Posluchači provádějí měření a zobrazují nebo vypisují výsledky testu. Element Graph Result v podobě grafu vykresluje doby odezvy, propustnost,... 19
3.6 Redmine Webová aplikace Redmine [13] slouží ke kompletní správě a řízení softwarových projektů. Ukázka webového rozhraní je na obrázku 3.7. Základní funkcí je vytváření projektů, přiřazování pracovníků k projektům a definice jejich rolí (projektový manažer, vývojář, tester,...). V rámci projektu se provádí vytváření úkolů (tzv. issues), které se postupně zpřesňují a zařazují do plánů. Každý úkol je spjat se sadou metadat (název, popis, časový odhad, stav, priorita, mezní termín dokončení,...). Úkoly mohou představovat novou funkcionalitu, ale slouží i k hlášení chyb nalezených v aplikaci. Správa úkolů přináší cenné informace o pracovním vytížení pracovníků a díky různým statistikám zpětnou vazbu pro plánování. Úkoly je také možné prostřednictvím doplňků spravovat přímo ve vývojovém prostředí programátor tak má neustále k dispozici rozpis přiřazené práce a úkoly může označovat jako rozpracované nebo dokončené bez nutnosti otevírat internetový prohlížeč. Obrázek 3.7: Redmine webové rozhraní Redmine dále poskytuje wiki, což je prostředek k vytváření hypertextových dokumentů. Obsah se tvoří pomocí jednoduchého značkovacího jazyka přímo v okně 20
prohlížeče. Jedná se o rychlý způsob sdílení informací v rámci vývojového týmu nebo i směrem k uživatelům. Ke komunikaci lze také využít diskusní fórum. V neposlední řadě Redmine nabízí sdílení souborů nebo prostředí k procházení obsahu repozitáře. 21
4 Validátor Validátor je aplikace vyvíjená na Katedře informatiky a výpočetní techniky Fakulty aplikovaných věd Západočeské univerzity v Plzni. Slouží jako prostředek pro automatickou validaci studenty odevzdávaných úloh (zejména programů) z různých předmětů. Odevzdávání úloh probíhá přes univerzitní Portál [14] (přesněji přes k tomu určený portlet zobrazovaný na stránce daného předmětu), který úlohu předá Validátoru a následně zobrazí výsledky validace. 4.1 Validační doména Příprava automatické validace spočívá ve vytvoření tzv. validační domény. Ta se skládá z posloupností kroků, jejichž cílem je ověřit funkčnost odevzdaného programu. Ukázka jednoduché validační domény složené z trojice kroků je na obrázku 4.1. Každý krok obsahuje podmínku (za jakých okolností má být vykonán) a prováděnou akci. Obrázek 4.1: Testovací Validátor webové rozhraní 22
Dostupné podmínky jsou tyto: vždy, nikdy, validace ještě neobsahuje chybu, validace již obsahuje chybu, vlastní skript. Volba vlastní skript umožňuje napsat vlastní JavaScriptový kód. V rámci kódu je možné používat JavaScriptové proměnné definované v rámci akce jiných kroků stejné validační domény. Akce mohou být následující: nic žádná akce není provedena, skok na krok dovoluje výběr jiného kroku domény, na který má být proveden přechod, vložit do výstupu validace používá se k textovému výpisu do výstupu validace, konec validace ukončí validaci, vlastní akce výběr z předdefinovaných akcí tvořených moduly Validátoru, vlastní skript použití vlastního kódu v JavaScriptu. Mezi akcemi dostupnými při volbě vlastní akce jsou akce realizující základní operace se soubory nebo archivy (vyhledání, odstranění, rozbalení archivu,...). Dále jsou k dispozici akce pro práci s programy (překlad programu, spuštění programu, spuštění JUnit testů,...). Existuje zde ale i množství dalších pokročilých akcí (např. porovnání dvojice obrázků). Nabídku akcí je možné dále rozšiřovat vytvářením modulů Validátoru. 4.2 Princip validace Při předání souboru k validaci je na serveru vytvořen dočasný pracovní adresář (tzv. workdir) s unikátním názvem, do kterého je uložen odevzdaný soubor. V tomto 23
adresáři probíhají veškeré operace (např. rozbalení archivu, kontrola názvů,...) vyvolané akcemi jednotlivých validačních kroků. Po skončení validace je tento adresář v závislosti na nastavení domény odstraněn. Na serveru Validátoru se také pro každou validační doménu vytvoří adresář, který obsahuje základní konfigurační soubory domény. Do tohoto adresáře je možné předem nahrát další soubory (zpravidla programy nebo knihovny), které lze poté v průběhu validace používat. 24
5 Výběr nástrojů pro realizaci projektů Na základě průzkumu zadaných nástrojů pro podporu testování bylo zapotřebí stanovit, které z nich jsou vhodné pro přípravu studentských projektů. Hlavním kritériem výběru byly možnosti uložení výstupu, který by dokládal použití nástroje předem definovaným způsobem. U nástrojů sloužících přímo k testování byl důležitým parametrem také způsob spuštění vytvořených testů za účelem ověření jejich funkčnosti. Pro přípravu úloh by byly ideální nástroje, jejichž výstup by bylo možné ověřit aplikací Validátor pouze s využitím aktuálně podporovaných validačních akcí (tzn. bez nutnosti vytvářet rozšiřující moduly). Dalším kritériem bylo množství a dostupnost prostředků (zejména hardwarových nebo softwarových), které by bylo nezbytné zajistit, jako podklad pro plnění konkrétní úlohy. Při rozhodování byla v úvahu vzata také míra budoucí využitelnosti znalostí a zkušeností získaných během realizace projektu spočívajícího v praktickém použití daného nástroje. Zhodnocení vlastností jednotlivých zkoumaných nástrojů s ohledem na přípravu projektů je uvedeno v navazujících podkapitolách. 5.1 Selenium Z rodiny nástrojů Selenium má smysl se zabývat pouze nástroji Selenium IDE a Selenium WebDriver. Používání Selenium RC je na ústupu (nahrazuje jej Selenium WebDriver) a Selenium Grid představuje pokročilejší způsob Selenium testování, který není z hlediska výuky podstatný. Doplněk internetového prohlížeče Firefox, Selenium IDE, je pro výukové účely velmi vhodný. Jeho instalace navíc zabere jen několik málo minut. Během chvíle tak lze skrze intuitivní grafické uživatelské rozhraní vytvářet první jednoduché testy a sledovat jejich průběh. Studentský projekt zaměřený na seznámení se s tímto produktem by vyžadoval nalezení vhodné (zdrojový kód stránek umožňující použití pouze základních typů lokátorů, výskyt chyb,...) testované webové aplikace nebo její naprogramování. Validace výstupu úlohy, tedy testů vytvořených podle definovaného zadání, by ale v tomto případě byla komplikovanější. Validátor běží na serveru bez grafického prostředí a navíc nedisponuje funkcemi, které by spuštění Selenium testů ve formátu HTML umožnily. Řešením by mohlo být využití exportu do podoby JUnit testů využívajících Selenium WebDriver. Tato funkce je v Selenium IDE snadno 25
dostupná prostřednictvím menu. Spuštění JUnit testů v prostředí Validátoru je navíc plně podporováno. Problém s absencí grafického prostředí na serveru by bylo možné vyřešit náhradou výchozí použité implementace WebDriveru v exportovaných testech (FirefoxDriver) za HtmlUnitDriver. Kontrolu odevzdaných testů (založenou nejspíše na výskytu konkrétních lokátorů v jejich zdrojovém kódu a na předem známém a očekávaném počtu testů končících chybou) by bylo možné provádět samostatným Java programem. Ten by se spouštěl jako jeden z kroků příslušné validační domény na Validátoru a podle jeho výstupu by bylo rozhodnuto o celkovém výsledku validace. Další projekt, tentokrát využívající Selenium WebDriver, by mohl být přínosný zejména po praktickém seznámení s nástrojem Selenium IDE. Poskytoval by srovnání tvorby testů psaných přímo v programovacím jazyce (pravděpodobně Java) s jejich tvorbou prostřednictvím záznamu a editace kroků v Selenium IDE. Vhodné by bylo použití Selenim WebDriver společně s frameworkem JUnit, což by usnadnilo spuštění testů na Validátoru. Jako podklad pro testování by opět byla nezbytná vhodná webová aplikace. Psaní testů přímo v podobě zdrojového kódu dává jejich tvůrci větší volnost a nelze tak spoléhat na určitou strukturu kódu jako v případě testů exportovaných ze Selenium IDE. To by mohla být z hlediska automatické validace komplikace. Při přípravě úlohy by proto bylo nutné v jejím zadání striktně definovat požadavky na zdrojový kód testů nebo důkladně analyzovat problémové situace (například použití konstant pro uložení hodnot lokátorů) a vhodným způsobem je ošetřit. Způsob validace by mohl být shodný s validací u projektu zaměřeného na použití Selenium IDE (tzn. založený na spuštění samostatného kontrolního programu). 5.2 JMeter Nutnou podmínkou realizace projektu založeného na použití programu JMeter by bylo zajištění serveru, který by byl určen výhradně pro potřeby testování a jehož zvýšené zatěžování by neohrozilo dostupnost žádných důležitých služeb. Použití některého z veřejně dostupných webových serverů je zcela vyloučeno, jelikož provádění zátěžových testů by mohlo být považováno za hackerský útok. Je potřeba zohlednit, že i test generující obvyklý počet požadavků, který je spuštěný několika studenty naráz, může ve výsledku znamenat enormní zatížení cílového serveru. V důsledku kolísajícího zatížení serveru (daného počtem současně testujících studentů) mohou být také při opakovaném spuštění testu jeho výsledky velmi odlišné. 26
XML formát uložených testů JMeteru by mohl být vhodný pro jejich statickou kontrolu. V tomto případě by ale byla problematická formulace zadání projektu. Pokud by měl vytvořený test odpovídat určitému vzoru použitému při validaci, muselo by být zadání velmi podrobné (podobné spíše návodu) a úloha by tak neměla velký smysl. I když JMeter podporuje spuštění bez GUI a vykonání odevzdaných testů na Validátoru by díky tomu bylo reálné, tak dynamický způsob kontroly není v tomto případě vhodný. Kvůli okolnímu provozu se mohou výsledky totožného testu velmi lišit v závislosti na času jeho provedení. Výsledky tedy nelze porovnat s očekávanými hodnotami a jediným výstupem může být informace o tom, zda je test spustitelný. Limitující je v tomto případě i omezená doba, během které musí být validace provedena (zátěžové testy přitom běžně probíhají několik minut). 5.3 Redmine Projekt sloužící k osvojení nástroje Redmine je při dodržení podmínky automatické validace téměř nerealizovatelný. I u velmi jednoduchého zadání např. vložení chyb odhalených v rámci jiného studentského projektu do Redmine, nelze splnění úlohy kontrolovat strojově. Validaci by sice bylo možné založit na ověření počtu vložených chyb konkrétním uživatelem, ale důležitý je v tomto případě i vhodný popis nalezených chyb. Ten samozřejmě není jednoznačný a automatická kontrola je proto nevhodná. Výstupem Redmine navíc není žádný validovatelný soubor. Jediným proveditelným usnadněním kontroly by mohlo být použití vhodného rozšiřujícího modulu např. modulu poskytujícího export issues z Redmine do podoby tabulky ve formátu XLS [15]. Z důvodu nejednoznačného popisu reportovaných chyb by ale i v tomto případě musela být finální kontrola projektu prováděna vyučujícím. 5.4 Shrnutí Na základě výše uvedených poznatků byl jako nejvhodnější produkt pro přípravu projektů vybrán framework Selenium. Snahou bylo vytvoření obou navrhovaných projektů (Selenium IDE i Selenium WebDriver). Zvoleným způsobem zajištění webové aplikace sloužící jako podklad pro testování bylo její naprogramování. 27
6 Webová aplikace pro testování Při výběru prostředků k vytvoření testované webové aplikace jsem se rozhodoval podle osobních preferencí a nakonec zvolil platformu Java EE. Verze použitých technologií (Servlety, JSP) byly ovlivněny cílovým produkčním prostředím s webovým kontejnerem Winstone. Požadavkem vyučujícího předmětu KIV/OKS bylo vytvoření dvojice webových aplikací, z nichž jedna by sloužila k demonstraci některých postupů v rámci přednášek předmětu a druhá by byla podkladem pro plnění samostatných úloh. Cílem bylo, aby obě vytvářené aplikace byly jednoduché (rychlé pochopení, snadné pokrytí testy), ale zároveň umožnily ukázku hlavních přínosů Selenium testování. Aplikace byly původně vyvíjeny odděleně, ale později bylo kvůli nutnosti jejich současného nasazení na webový server nevyhnutelné sloučení do jednoho projektu. Sloučení spočívalo ve změně struktury zdrojových projektů, úpravě některých referencí a vytvoření hlavní stránky [19] (Rozcestník - viz obrázek 6.1) s odkazy na jednotlivé aplikace. Hlavním přínosem této změny je pohodlnější deploy obou aplikací naráz prostřednictvím jediného WAR souboru. Obrázek 6.1: Rozcestník stránka s odkazy na testované aplikace Obě aplikace jsou vytvořeny v souladu s architekturou MVC, která zajišťuje oddělení aplikační logiky od prezenční vrstvy. Veškerá aplikační logika je proto řešena výhradně servlety a JSP soubory tvoří pouze prezenční vrstvu. Aplikace byly nejprve 28
vytvářeny bez úmyslně zanesených chyb a důkladně testovány s použitím Selenium testů (Selenium WebDriver + JUnit). Při testování byl využíván webový kontejner Apache Tomcat v7.0 [16]. Několik úmyslných chyb bylo do aplikací přidáno až po jejich dokončení. Popis aplikací je uveden v následujících podkapitolách. Generovaný HTML kód (HTML 5) i vytvořené kaskádové styly (CSS 3) jsou validní podle odpovídajících specifikací definovaných konsorciem W3C. (Validita je ověřována pomocí oficiálních validátorů [17] a [18] v rámci zhotovených testů.) Ačkoli jsou webové aplikace částečně tvořeny statickým obsahem (stránky Úvod a Nápověda), nebylo kvůli omezením kontejneru Winstone možné (v konfiguračním souboru web.xml) provést mapování příslušných adres přímo na odpovídající JSP soubory. Řešení si vyžádalo vytvoření jednoduchých servletů, na které jsou tyto adresy mapovány, a které provádějí pouze přechod na danou JSP stránku. Kvůli jednoznačné identifikovatelnosti chyb byly k aplikacím zpětně vytvořeny dokumenty specifikace (viz příloha A a příloha B), které jednoznačně definují na ně kladené požadavky. 6.1 Převodník Převodník [20] (viz obrázek 6.2) je aplikace používaná k ukázkám Selenium testování na přednáškách předmětu KIV/OKS. Jak již název napovídá, tak její funkcí jsou převody. Konkrétně se jedná o převody délkových jednotek. Formulář sloužící k převodům je umístěn na stránce Převodník. Obsahuje jediné vstupní pole pro zadání číselné hodnoty. Dále jsou k dispozici dvě výběrová tlačítka (tzv. comboboxy) určující jednotku vstupu a požadovanou jednotku převedeného výstupu. Výsledek převodu je zobrazen v needitovatelném poli s popiskem Výstup po stisku tlačítka Převeď. K vymazání polí formuláře a nastavení výchozích jednotek je určeno tlačítko Vymaž. Převodní jednotky dostupné v aplikaci je možné měnit prostřednictvím textového konfiguračního souboru. V tomto souboru jsou uvedeny zobrazované názvy jednotek a jim odpovídající převodní koeficienty. Při změně jednotek tak není nutné provádět překlad zdrojových kódů aplikace. 29
Obrázek 6.2: Převodník webová aplikace pro nácvik testování 6.1.1 Úmyslné chyby Chyby, které byly do aplikace Převodník zaneseny pro potřeby testování, jsou uvedeny v následujícím výčtu: odkaz na webové stránky Západočeské univerzity v Plzni (na stránce Úvod) směřuje na stránky Katedry informatiky a výpočetní techniky, tlačítko Vymaž (na stránce Převodník) provádí pouze vymazání obsahu pole Vstup (obsah pole Výstup i zvolené jednotky zůstávají původní), chybný výsledek převodu v případě použití jednotky decimetr jako jednotky vstupu nebo výstupu (použije se převodní koeficient pro jednotku palec), při zadání záporné hodnoty do pole Vstup a potvrzení převodu tlačítkem Převeď je místo výpisu chybového hlášení převod vykonán a v poli Výstup je zobrazena záporná hodnota. Poznámka: Specifikace aplikace se nachází v příloze A. 30