Zaacutepadočeskaacute univerzita v PlzniFakulta aplikovanyacutech věd
Katedra informatiky a vyacutepočetniacute techniky
Bakalaacuteřskaacute praacutece
Využitiacute softwarovyacutech naacutestrojůpro přiacutepravu testů grafickeacuteho
uživatelskeacuteho rozhraniacute
Plzeň 2016 Jaroslav Klaus
Miacutesto teacuteto strany budezadaacuteniacute praacutece
Prohlaacutešeniacute
Prohlašuji že jsem bakalaacuteřskou praacuteci vypracoval samostatně a vyacutehradněs použitiacutem citovanyacutech pramenů
V Plzni dne 15 května 2016
Jaroslav Klaus
AbstractThis paper deals with the use of software tools for testing graphical userinterface The main objective was to compare several tools and to chooseone of them The fact that creating tests by them fits into the subjectKIVOKS taught at the University of West Bohemia was one of the crucialdemands A tool called SikuliX was chosen with regard to that continuityand a set of test cases was created over a given practice application
AbstraktTato praacutece se zabyacutevaacute využitiacutem naacutestrojů k testovaacuteniacute grafickeacuteho uživatelskeacutehorozhraniacute aplikaciacute Hlavniacutem ciacutelem bylo porovnat několik naacutestrojů k tomuurčenyacutech a vybrat jeden z nich Jedniacutem z kriteacuteriiacute vyacuteběru bylo aby tvorbatestů pomociacute něj svou filosofiiacute zapadala do předmětu KIVOKS vyučovaneacutehona Zaacutepadočeskeacute Univerzitě v Plzni S ohledem na tuto naacutevaznost byl vybraacutennaacutestroj SikuliX V tomto naacutestroji byly prozkoumaacuteny zaacutekladniacute režimy jehopraacutece a naacutesledně byla vytvořena sada testovaciacutech přiacutepadů nad danou cvičnouaplikaciacute
Obsah
1 Uacutevod 7
2 Testovaacuteniacute softwaru 821 Požadavky 822 Specifikace požadavků na software 823 Kvalita softwaru 9
231 FURPS 924 Chyba defekt selhaacuteniacute 925 Testovaacuteniacute softwaru 1026 Uacuterovně testovaacuteniacute 1127 Testovaacuteniacute uživatelskeacuteho rozhraniacute 1128 Automatizace testovaacuteniacute 13
281 Monkey testovaacuteniacute 13
3 Přehled naacutestrojů 14
4 Zvoleneacute naacutestroje 1541 Jubula 1542 SikuliX 1543 Robot Framework 16
5 Srovnaacuteniacute naacutestrojů 17
6 SikuliX 2061 Instalace 2062 Tvorba testů 2163 SikuliX-IDE 22
631 Prvniacute skript 2364 Java API 29
641 Prvniacute test 29642 Sofistikovanějšiacute testy 30
7 Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů 3271 Rozděleniacute testů 3372 Statickeacute prvky 3473 Převody 3574 Vymazaacuteniacute 36
5
75 Zjištěneacute chyby 38751 Chybneacute převody z (na) decimetry 38752 Chybneacute zaokrouhleniacute 38753 Převod zaacuteporneacute hodnoty 38754 Tlačiacutetko Vymaž 39
8 Probleacutemy praacutece se SikuliX 4081 Rozlišeniacute obrazovky 4082 Rozměry screenshotů 4183 Ukazatel myši 4184 Nespolehliveacute OCR 4285 Nefunkčnost některyacutech metod třiacuted 42
851 Pozice a velikost okna 42852 Stav aplikace 43853 Spuštěniacute aplikace 43854 Rychlost vykonaacutevanyacutech testů 43
9 Monkey testy 4591 Hloupaacute opice 4592 Zpola inteligentniacute opice 4593 Inteligentniacute opice 4694 Monkey test pomociacute SikuliX 46
10 Automatizace naacutestrojem 48
11 Zaacutevěr 50
Seznam zkratek 51
Literatura 52
Přiacutelohy 54Přiacuteloha A ndash Sofistikovanějšiacute testy 55Přiacuteloha B ndash Obsah přiloženeacuteho CD 61
6
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Miacutesto teacuteto strany budezadaacuteniacute praacutece
Prohlaacutešeniacute
Prohlašuji že jsem bakalaacuteřskou praacuteci vypracoval samostatně a vyacutehradněs použitiacutem citovanyacutech pramenů
V Plzni dne 15 května 2016
Jaroslav Klaus
AbstractThis paper deals with the use of software tools for testing graphical userinterface The main objective was to compare several tools and to chooseone of them The fact that creating tests by them fits into the subjectKIVOKS taught at the University of West Bohemia was one of the crucialdemands A tool called SikuliX was chosen with regard to that continuityand a set of test cases was created over a given practice application
AbstraktTato praacutece se zabyacutevaacute využitiacutem naacutestrojů k testovaacuteniacute grafickeacuteho uživatelskeacutehorozhraniacute aplikaciacute Hlavniacutem ciacutelem bylo porovnat několik naacutestrojů k tomuurčenyacutech a vybrat jeden z nich Jedniacutem z kriteacuteriiacute vyacuteběru bylo aby tvorbatestů pomociacute něj svou filosofiiacute zapadala do předmětu KIVOKS vyučovaneacutehona Zaacutepadočeskeacute Univerzitě v Plzni S ohledem na tuto naacutevaznost byl vybraacutennaacutestroj SikuliX V tomto naacutestroji byly prozkoumaacuteny zaacutekladniacute režimy jehopraacutece a naacutesledně byla vytvořena sada testovaciacutech přiacutepadů nad danou cvičnouaplikaciacute
Obsah
1 Uacutevod 7
2 Testovaacuteniacute softwaru 821 Požadavky 822 Specifikace požadavků na software 823 Kvalita softwaru 9
231 FURPS 924 Chyba defekt selhaacuteniacute 925 Testovaacuteniacute softwaru 1026 Uacuterovně testovaacuteniacute 1127 Testovaacuteniacute uživatelskeacuteho rozhraniacute 1128 Automatizace testovaacuteniacute 13
281 Monkey testovaacuteniacute 13
3 Přehled naacutestrojů 14
4 Zvoleneacute naacutestroje 1541 Jubula 1542 SikuliX 1543 Robot Framework 16
5 Srovnaacuteniacute naacutestrojů 17
6 SikuliX 2061 Instalace 2062 Tvorba testů 2163 SikuliX-IDE 22
631 Prvniacute skript 2364 Java API 29
641 Prvniacute test 29642 Sofistikovanějšiacute testy 30
7 Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů 3271 Rozděleniacute testů 3372 Statickeacute prvky 3473 Převody 3574 Vymazaacuteniacute 36
5
75 Zjištěneacute chyby 38751 Chybneacute převody z (na) decimetry 38752 Chybneacute zaokrouhleniacute 38753 Převod zaacuteporneacute hodnoty 38754 Tlačiacutetko Vymaž 39
8 Probleacutemy praacutece se SikuliX 4081 Rozlišeniacute obrazovky 4082 Rozměry screenshotů 4183 Ukazatel myši 4184 Nespolehliveacute OCR 4285 Nefunkčnost některyacutech metod třiacuted 42
851 Pozice a velikost okna 42852 Stav aplikace 43853 Spuštěniacute aplikace 43854 Rychlost vykonaacutevanyacutech testů 43
9 Monkey testy 4591 Hloupaacute opice 4592 Zpola inteligentniacute opice 4593 Inteligentniacute opice 4694 Monkey test pomociacute SikuliX 46
10 Automatizace naacutestrojem 48
11 Zaacutevěr 50
Seznam zkratek 51
Literatura 52
Přiacutelohy 54Přiacuteloha A ndash Sofistikovanějšiacute testy 55Přiacuteloha B ndash Obsah přiloženeacuteho CD 61
6
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Prohlaacutešeniacute
Prohlašuji že jsem bakalaacuteřskou praacuteci vypracoval samostatně a vyacutehradněs použitiacutem citovanyacutech pramenů
V Plzni dne 15 května 2016
Jaroslav Klaus
AbstractThis paper deals with the use of software tools for testing graphical userinterface The main objective was to compare several tools and to chooseone of them The fact that creating tests by them fits into the subjectKIVOKS taught at the University of West Bohemia was one of the crucialdemands A tool called SikuliX was chosen with regard to that continuityand a set of test cases was created over a given practice application
AbstraktTato praacutece se zabyacutevaacute využitiacutem naacutestrojů k testovaacuteniacute grafickeacuteho uživatelskeacutehorozhraniacute aplikaciacute Hlavniacutem ciacutelem bylo porovnat několik naacutestrojů k tomuurčenyacutech a vybrat jeden z nich Jedniacutem z kriteacuteriiacute vyacuteběru bylo aby tvorbatestů pomociacute něj svou filosofiiacute zapadala do předmětu KIVOKS vyučovaneacutehona Zaacutepadočeskeacute Univerzitě v Plzni S ohledem na tuto naacutevaznost byl vybraacutennaacutestroj SikuliX V tomto naacutestroji byly prozkoumaacuteny zaacutekladniacute režimy jehopraacutece a naacutesledně byla vytvořena sada testovaciacutech přiacutepadů nad danou cvičnouaplikaciacute
Obsah
1 Uacutevod 7
2 Testovaacuteniacute softwaru 821 Požadavky 822 Specifikace požadavků na software 823 Kvalita softwaru 9
231 FURPS 924 Chyba defekt selhaacuteniacute 925 Testovaacuteniacute softwaru 1026 Uacuterovně testovaacuteniacute 1127 Testovaacuteniacute uživatelskeacuteho rozhraniacute 1128 Automatizace testovaacuteniacute 13
281 Monkey testovaacuteniacute 13
3 Přehled naacutestrojů 14
4 Zvoleneacute naacutestroje 1541 Jubula 1542 SikuliX 1543 Robot Framework 16
5 Srovnaacuteniacute naacutestrojů 17
6 SikuliX 2061 Instalace 2062 Tvorba testů 2163 SikuliX-IDE 22
631 Prvniacute skript 2364 Java API 29
641 Prvniacute test 29642 Sofistikovanějšiacute testy 30
7 Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů 3271 Rozděleniacute testů 3372 Statickeacute prvky 3473 Převody 3574 Vymazaacuteniacute 36
5
75 Zjištěneacute chyby 38751 Chybneacute převody z (na) decimetry 38752 Chybneacute zaokrouhleniacute 38753 Převod zaacuteporneacute hodnoty 38754 Tlačiacutetko Vymaž 39
8 Probleacutemy praacutece se SikuliX 4081 Rozlišeniacute obrazovky 4082 Rozměry screenshotů 4183 Ukazatel myši 4184 Nespolehliveacute OCR 4285 Nefunkčnost některyacutech metod třiacuted 42
851 Pozice a velikost okna 42852 Stav aplikace 43853 Spuštěniacute aplikace 43854 Rychlost vykonaacutevanyacutech testů 43
9 Monkey testy 4591 Hloupaacute opice 4592 Zpola inteligentniacute opice 4593 Inteligentniacute opice 4694 Monkey test pomociacute SikuliX 46
10 Automatizace naacutestrojem 48
11 Zaacutevěr 50
Seznam zkratek 51
Literatura 52
Přiacutelohy 54Přiacuteloha A ndash Sofistikovanějšiacute testy 55Přiacuteloha B ndash Obsah přiloženeacuteho CD 61
6
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
AbstractThis paper deals with the use of software tools for testing graphical userinterface The main objective was to compare several tools and to chooseone of them The fact that creating tests by them fits into the subjectKIVOKS taught at the University of West Bohemia was one of the crucialdemands A tool called SikuliX was chosen with regard to that continuityand a set of test cases was created over a given practice application
AbstraktTato praacutece se zabyacutevaacute využitiacutem naacutestrojů k testovaacuteniacute grafickeacuteho uživatelskeacutehorozhraniacute aplikaciacute Hlavniacutem ciacutelem bylo porovnat několik naacutestrojů k tomuurčenyacutech a vybrat jeden z nich Jedniacutem z kriteacuteriiacute vyacuteběru bylo aby tvorbatestů pomociacute něj svou filosofiiacute zapadala do předmětu KIVOKS vyučovaneacutehona Zaacutepadočeskeacute Univerzitě v Plzni S ohledem na tuto naacutevaznost byl vybraacutennaacutestroj SikuliX V tomto naacutestroji byly prozkoumaacuteny zaacutekladniacute režimy jehopraacutece a naacutesledně byla vytvořena sada testovaciacutech přiacutepadů nad danou cvičnouaplikaciacute
Obsah
1 Uacutevod 7
2 Testovaacuteniacute softwaru 821 Požadavky 822 Specifikace požadavků na software 823 Kvalita softwaru 9
231 FURPS 924 Chyba defekt selhaacuteniacute 925 Testovaacuteniacute softwaru 1026 Uacuterovně testovaacuteniacute 1127 Testovaacuteniacute uživatelskeacuteho rozhraniacute 1128 Automatizace testovaacuteniacute 13
281 Monkey testovaacuteniacute 13
3 Přehled naacutestrojů 14
4 Zvoleneacute naacutestroje 1541 Jubula 1542 SikuliX 1543 Robot Framework 16
5 Srovnaacuteniacute naacutestrojů 17
6 SikuliX 2061 Instalace 2062 Tvorba testů 2163 SikuliX-IDE 22
631 Prvniacute skript 2364 Java API 29
641 Prvniacute test 29642 Sofistikovanějšiacute testy 30
7 Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů 3271 Rozděleniacute testů 3372 Statickeacute prvky 3473 Převody 3574 Vymazaacuteniacute 36
5
75 Zjištěneacute chyby 38751 Chybneacute převody z (na) decimetry 38752 Chybneacute zaokrouhleniacute 38753 Převod zaacuteporneacute hodnoty 38754 Tlačiacutetko Vymaž 39
8 Probleacutemy praacutece se SikuliX 4081 Rozlišeniacute obrazovky 4082 Rozměry screenshotů 4183 Ukazatel myši 4184 Nespolehliveacute OCR 4285 Nefunkčnost některyacutech metod třiacuted 42
851 Pozice a velikost okna 42852 Stav aplikace 43853 Spuštěniacute aplikace 43854 Rychlost vykonaacutevanyacutech testů 43
9 Monkey testy 4591 Hloupaacute opice 4592 Zpola inteligentniacute opice 4593 Inteligentniacute opice 4694 Monkey test pomociacute SikuliX 46
10 Automatizace naacutestrojem 48
11 Zaacutevěr 50
Seznam zkratek 51
Literatura 52
Přiacutelohy 54Přiacuteloha A ndash Sofistikovanějšiacute testy 55Přiacuteloha B ndash Obsah přiloženeacuteho CD 61
6
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Obsah
1 Uacutevod 7
2 Testovaacuteniacute softwaru 821 Požadavky 822 Specifikace požadavků na software 823 Kvalita softwaru 9
231 FURPS 924 Chyba defekt selhaacuteniacute 925 Testovaacuteniacute softwaru 1026 Uacuterovně testovaacuteniacute 1127 Testovaacuteniacute uživatelskeacuteho rozhraniacute 1128 Automatizace testovaacuteniacute 13
281 Monkey testovaacuteniacute 13
3 Přehled naacutestrojů 14
4 Zvoleneacute naacutestroje 1541 Jubula 1542 SikuliX 1543 Robot Framework 16
5 Srovnaacuteniacute naacutestrojů 17
6 SikuliX 2061 Instalace 2062 Tvorba testů 2163 SikuliX-IDE 22
631 Prvniacute skript 2364 Java API 29
641 Prvniacute test 29642 Sofistikovanějšiacute testy 30
7 Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů 3271 Rozděleniacute testů 3372 Statickeacute prvky 3473 Převody 3574 Vymazaacuteniacute 36
5
75 Zjištěneacute chyby 38751 Chybneacute převody z (na) decimetry 38752 Chybneacute zaokrouhleniacute 38753 Převod zaacuteporneacute hodnoty 38754 Tlačiacutetko Vymaž 39
8 Probleacutemy praacutece se SikuliX 4081 Rozlišeniacute obrazovky 4082 Rozměry screenshotů 4183 Ukazatel myši 4184 Nespolehliveacute OCR 4285 Nefunkčnost některyacutech metod třiacuted 42
851 Pozice a velikost okna 42852 Stav aplikace 43853 Spuštěniacute aplikace 43854 Rychlost vykonaacutevanyacutech testů 43
9 Monkey testy 4591 Hloupaacute opice 4592 Zpola inteligentniacute opice 4593 Inteligentniacute opice 4694 Monkey test pomociacute SikuliX 46
10 Automatizace naacutestrojem 48
11 Zaacutevěr 50
Seznam zkratek 51
Literatura 52
Přiacutelohy 54Přiacuteloha A ndash Sofistikovanějšiacute testy 55Přiacuteloha B ndash Obsah přiloženeacuteho CD 61
6
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
75 Zjištěneacute chyby 38751 Chybneacute převody z (na) decimetry 38752 Chybneacute zaokrouhleniacute 38753 Převod zaacuteporneacute hodnoty 38754 Tlačiacutetko Vymaž 39
8 Probleacutemy praacutece se SikuliX 4081 Rozlišeniacute obrazovky 4082 Rozměry screenshotů 4183 Ukazatel myši 4184 Nespolehliveacute OCR 4285 Nefunkčnost některyacutech metod třiacuted 42
851 Pozice a velikost okna 42852 Stav aplikace 43853 Spuštěniacute aplikace 43854 Rychlost vykonaacutevanyacutech testů 43
9 Monkey testy 4591 Hloupaacute opice 4592 Zpola inteligentniacute opice 4593 Inteligentniacute opice 4694 Monkey test pomociacute SikuliX 46
10 Automatizace naacutestrojem 48
11 Zaacutevěr 50
Seznam zkratek 51
Literatura 52
Přiacutelohy 54Přiacuteloha A ndash Sofistikovanějšiacute testy 55Přiacuteloha B ndash Obsah přiloženeacuteho CD 61
6
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
1 Uacutevod
Na katedře Informatiky a vyacutepočetniacute techniky Fakulty aplikovanyacutech věd Zaacute-padočeskeacute univerzity je vyučovaacuten předmět KIVOKS ndash Ověřovaacuteniacute kvalitysoftware Zabyacutevaacute se testovaacuteniacutem software od statickeacuteho testovaacuteniacute logovaacuteniacutejednotkovyacutech testů strukturaacutelniacuteho a funkčniacuteho testovaacuteniacute až po testovaacuteniacutewebovyacutech aplikaciacute Snahou je vždy využiacutet možnosti automatizace testů Stu-denti se majiacute seznaacutemit se zaacuteklady zajišťovaacuteniacute kvality a testovaacuteniacutem softwarujak teoreticky tak prakticky Jednou čaacutestiacute ktereacute neniacute dosud věnovaacutena po-zornost je testovaacuteniacute grafickeacuteho uživatelskeacuteho rozhraniacute aplikaciacute Pro zaplněniacuteteacuteto mezery je potřeba nejdřiacuteve naleacutezt vhodnyacute naacutestroj a ověřit jeho možnosti
Pro testovaacuteniacute GUI existuje množstviacute naacutestrojů jak proprietaacuterniacutech taki volně dostupnyacutech Mezi nimi je potřeba proveacutest kvalifikovanyacute vyacuteběr nej-leacutepe metodou multikriteriaacutelniacuteho hodnoceniacute Zvolenyacute naacutestroj je poteacute zapotřebiacuteprozkoumat na uacuterovni zaacutekladniacutech postupů praacutece tak aby bylo možneacute pře-konat počaacutetečniacute barieacuteru začaacutetku praacutece s tiacutemto naacutestrojem Jako dalšiacute krok jenutneacute prozkoumat API a připravit ukaacutezky různyacutech typů automatizovanyacutechtestů zapsanyacutech v programovaciacutem jazyce Java Všechny tyto akce by mělydemonstrovat zaacutekladniacute možnosti zvoleneacuteho naacutestroje
Jedniacutem z vrcholů praacutece by pak měla byacutet ucelenaacute sada testů kteraacute budesvou funkčnostiacute plně korespondovat s již existujiacuteciacutemi testy weboveacuteho rozhraniacutepřipraveneacuteho pomociacute jineacuteho typu naacutestroje (Selenium) Ciacutelem je ukaacutezat žemožnosti zvoleneacuteho naacutestroje jsou minimaacutelně stejneacute prakticky však širšiacute nežmožnosti naacutestroje pro testovaacuteniacute pouze webovyacutech aplikaciacute
Obecně platiacute že naacutestroje pro testovaacuteniacute GUI umožňujiacute i přiacutepravu tzvmonkey testů Pro to v praacuteci bude věnovaacutena pozornost i těmto typům testůa ukaacutezkaacutem jejich možnostiacute
Jako posledniacute nikoli však nevyacuteznamnaacute možnost použitiacute je u těchto naacute-strojů i automatizace rutinniacutech činnostiacute To znamenaacute že naacutestroj neniacute použitpro testovaacuteniacute ale pro vytvaacuteřeniacute jakyacutechsi bdquoskriptůldquo ktereacute mohou vyacuterazněusnadnit a zpřesnit rutinniacute činnosti provaacuteděneacute např administraacutetory systeacutemů
7
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
2 Testovaacuteniacute softwaru
Na začaacutetek je potřeba vysvětlit některeacute pojmy z oblasti testovaacuteniacute Budemevychaacutezet hlavně z [Roudenskyacute ndash Havliacutečkovaacute 2013] [Patton 2002] a [Herout2016]
21 PožadavkyPožadavky zachycujiacute přaacuteniacute zaacutekazniacuteka na funkcionalitu softwaru Děliacute se nadvě skupiny
bull Funkčniacute ndash popisujiacute funkčnost služby vykonaacutevaneacute systeacutemem tedy comaacute vykonaacutevat Patřiacute sem např
ndash Uživatel bude moci vytvořit zaacuteznam pro noveacuteho zaacutekazniacuteka
ndash Systeacutem automaticky odhlaacutesiacute uživatele po 3 minutaacutech nečinnosti
bull Mimofunkčniacute ndash popisujiacute určiteacute vlastnosti systeacutemu či omezujiacuteciacute pod-miacutenky V podstatě řiacutekajiacute jakyacute by systeacutem měl byacutet Sem patřiacute např
ndash Modul bdquoSpraacuteva klientůldquo bude dostupnyacute pouze uživatelům s roliacutespraacutevce
ndash Systeacutem bude použitelnyacute při zaacutetěži 1000 uživatelů
Je vhodneacute aby se testeři zabyacutevali i mimofunkčniacutemi požadavky neboťmohou již v raneacute faacutezi vyacutevoje zachytit ty chybně formulovaneacute (nekonzistentniacuteneproveditelneacute nekompletniacute netestovatelneacute nejednoznačneacute viacutece požadavkůzapsanyacutech jako jeden apod)
22 Specifikace požadavků na softwareFunkčniacute i mimofunkčniacute požadavky zaacutekazniacuteka jejich analyacuteza a dokumentacea všeobecnyacute popis systeacutemu se zapisuje do dokumentu nazvaneacuteho specifikacepožadavků na software Na zaacutekladě tohoto dokumentu probiacutehajiacute dalšiacute faacutezevyacutevoje proto je jeho spraacutevnost velmi podstatnaacute
K tomuto dokumentu se poteacute vztahuje i testovaacuteniacute konkreacutetně funkčniacutetestovaacuteniacute ktereacute kontroluje zda software vyhovuje a splňuje požadavky zaacute-kazniacuteka
8
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
23 Kvalita softwaruKvalita softwaru je velmi obtiacutežně definovatelnyacute pojem Pro jejiacute definici vznikloněkolik norem Mnoheacute z nich jsou dnes zastaraleacute či nekonzistentniacute proto jsounahrazovaacuteny jednotnyacutem systeacutemem norem ISOIEC 25000-25099 v raacutemci pro-jektu SQuaRE (Software Quality Requirements and Evaluation)
Např norma ISOIEC 25010 řiacutekaacute že kvalita softwaru je miacutera do jakeacutesoftwarovyacute produkt splňuje stanoveneacute a implicitniacute potřeby je-li použiacutevaacuten zastanovenyacutech podmiacutenek
231 FURPSDnes nejčastějšiacutem modelem kvality softwaru je tzv FURPS kteryacute vytvo-řila společnost Hewlett-Packard Ten kvalitu popisuje pomociacute těchto pěticharakteristik
bull Functionality (Funkčnost) ndash soubor požadovaneacute funkcionality schop-nostiacute a bezpečnostniacutech aspektů systeacutemu
bull Usability (Použitelnost) ndash snadnost použitiacute konzistence estetika do-kumentace apod
bull Reliability (Spolehlivost) ndash četnost a zaacutevažnost selhaacuteniacute doba bezpo-ruchoveacuteho běhu spraacutevnost vyacutestupů zotaveniacute atd
bull Performance (Vyacutekonnost) ndash odezva systeacutemu vyacutekon za různyacutech pod-miacutenek požadavky na systeacutemoveacute prostřediacute
bull Supportability (rozšiřitelnostpodporovatelnost) ndash škaacutelovatelnostudržovatelnost testovatelnost snadnost konfigurace
Většinou se setkaacuteme s modelem FURPS+ kteryacute naviacutec přidaacutevaacute kategoriejako omezeniacute naacutevrhu požadavky na implementaci požadavky na rozhraniacutea požadavky na fyzickeacute vlastnosti
24 Chyba defekt selhaacuteniacuteBěhem vyacutevoje softwaru se do dokumentů či zdrojovyacutech koacutedů dostaacutevajiacute de-fekty způsobujiacuteciacute chyby a selhaacuteniacute Tyto pojmy je velmi důležiteacute rozlišovatV naacutesledujiacuteciacutech odstavciacutech bude jejich vyacuteznam vysvětlen
Selhaacuteniacute nastaacutevaacute v přiacutepadě že jeden nebo viacutece vyacutestupniacutech stavů aplikacese odlišuje od stavu spraacutevneacuteho (nesplňuje specifikaci přiacutepadně specifikacenebyla kompletniacute nebo jednoznačnaacute)
9
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Praacutevě toto odchyacuteleniacute od očekaacutevaneacuteho stavu se nazyacutevaacute chybou Původchyby se nazyacutevaacute defekt a označuje se tak vada v koacutedu či datech Nejčastějijej způsobiacute programaacutetor chybou v koacutedu špatnyacutem naacutevrhem nedostatečně činespraacutevně pochopenou specifikaciacute nebo zaacuteměrnou sabotaacutežiacute
Jednotliveacute pojmy na sebe tedy navazujiacute naacutesledovně (viz obraacutezek 21)defekt (aktivace) rarr chyba (šiacuteřeniacute) rarr selhaacuteniacute (přiacutečina)
Obraacutezek 21 Šiacuteřeniacute chyby mezi systeacutemy Selhaacuteniacute systeacutemu A je pro přiacutejemcejeho služby (systeacutem B) externiacutem defektem kteryacute může veacutest k chybě a tapoteacute opět k selhaacuteniacute Zdroj [Roudenskyacute ndash Havliacutečkovaacute 2013]
25 Testovaacuteniacute softwaruDefinice pojmu testovaacuteniacute softwaru se viacutece či meacuteně lišiacute teacuteměř v každeacute pub-likaci V knize [Roudenskyacute ndash Havliacutečkovaacute 2013] je testovaacuteniacute definovaacuteno jakoproces řiacutezeneacuteho spouštěniacute softwaroveacuteho produktu s ciacutelem zjistit zda splňujespecifikovaneacute či implicitniacute potřeby uživatelů Je zde důležiteacute slovo spouštěniacutektereacute z testovaacuteniacute vyřazuje metody statickeacute analyacutezy Obecněji se však i tytometody do testovaniacute řadiacute a jejich použitiacute byacutevaacute ve vyacutevoji softwaru vhodneacute
Zaacuteměrem testovaacuteniacute již neniacute pouze naleacutezat defekty jak tomu bylo dřiacuteveNyniacute je jiacutem ziacuteskat takeacute informaci o kvalitě softwaru a o tom jak dobře splňujepožadavky zaacutekazniacuteka
[Patton 2002] uvaacutediacute řadu axiomů (obecně přijiacutemanyacutech pravd ktereacute senemusejiacute dokazovat) o testovaacuteniacute Čtyři nejdůležitějšiacute z nich jsoubull Žaacutednyacute program neniacute možneacute otestovat kompletně ndash počet vstupů
vyacutestupů a cest ktereacute vedou skrze software je přiacuteliš velkyacute
10
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
bull Testovaacuteniacute softwaru je postaveneacute na riziku ndash nemožnost otestovaacuteniacutevšech přiacutepadů vede k tomu že je možneacute nezachytit defekt ve sceacutenaacuteřikteryacute se netestoval Je proto důležiteacute spraacutevně odhadnout možnaacute rizikaa testovaacuteniacutem je minimalizovat
bull Testovaacuteniacute nikdy nemůže prokaacutezat že chyby neexistujiacute ndash testo-vaacuteniacutem pouze můžeme dokaacutezat že chyby existujiacute ale jelikož neniacute možneacutesoftware kompletně otestovat existenci chyb vyloučit nelze
bull Čiacutem viacutece chyb najdeme tiacutem viacutece jich v softwaru je ndash kvůli tomuže programaacutetoři miacutevajiacute špatneacute dny nebo dělajiacute často stejneacute chyby sechyby vyskytujiacute ve skupinaacutech To znamenaacute že objeveniacute jedneacute chybyzvyšuje pravděpodobnost dalšiacutech podobnyacutech chyb
26 Uacuterovně testovaacuteniacuteBěhem vyacutevoje softwaru se testovaacuteniacute nechaacute rozdělit do různyacutech skupin napřpodle toho kdy se testovaacuteniacute provaacutediacute jakyacutem způsobem se provaacutediacute jak sek testovaneacute aplikaci přistupuje či jakaacute čaacutest aplikace se podrobuje testůmRozlišujiacute se např tyto čtyři faacuteze
bull Testovaacuteniacute jednotek (Unit Testing) ndash testovaacuteniacute provaacutediacute obvykle saacutemprogramaacutetor kteryacute se snažiacute prokaacutezat spraacutevnost fungovaacuteniacute jednotlivyacutechjednotek (nejmenšiacutech testovatelnyacutech součaacutestiacute aplikace)
bull Integračniacute testovaacuteniacute (Integration Testing) ndash testuje se zapojeniacute vyacutešeuvedenyacutech jednotek do aplikace Spraacutevnaacute funkčnost jednotek nezaru-čuje spraacutevnou funkčnost vyacutesledneacute aplikace
bull Systeacutemoveacute testovaacuteniacute (System Testing) ndash testuje se zda aplikacesplňuje požadavky zaacutekazniacuteka Patřiacute sem nejen funkčniacute testovaacuteniacute alei mimofunkčniacute
bull Akceptačniacute testovaacuteniacute (User Acceptance Testing UAT) ndash zde provaacutediacutetestovaacuteniacute saacutem zaacutekazniacutek a neomezuje se pouze na testovaacuteniacute jako takoveacuteale na splněniacute předem dohodnutyacutech kriteacuterii (dokumentace manuaacutelyapod)
27 Testovaacuteniacute uživatelskeacuteho rozhraniacutePodle [Patton 2002] maacute každaacute aplikace uživatelskeacute rozhraniacute (UI ndash User In-terface) V dnešniacute době je děliacuteme do dvou zaacutekladniacutech skupin grafickeacute (GUI ndash
11
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Graphical User Interface) a z přiacutekazoveacute řaacutedky (CLI ndash Command Line Inter-face) V obou přiacutepadech UI sloužiacute pro interakci a komunikaci s uživatelemJe to prostředek pro zadaacutevaacuteniacute vstupniacutech dat a ziacuteskaacutevaacuteniacute vyacutestupů
Použitelnost UI znamenaacute nakolik funkčniacute a efektivniacute je praacutece uživateles programem K tomu se vztahuje pojem ergonomika ndash zabyacutevaacute se naacutevrhema konstrukciacute předmětů s ohledem na to aby se s nimi pracovalo bezprobleacute-mově Vzhledem k použitelnosti se tedy bude testovat zda je aplikace těžkosrozumitelnaacute obtiacutežně se s niacute pracuje je pomalaacute nebo ji zaacutekazniacutek nebudepovažovat za vyhovujiacuteciacute
Dobreacute uživatelskeacute rozhraniacute by mělo miacutet naacutesledujiacuteciacute vlastnostibull Dodržuje standardy nebo zaacutesady ndash pokud aplikace poběžiacute na spe-
cifickeacute platformě je možneacute že pro tuto platformu existujiacute předepsaneacutestandardy a normy na vzhled a chovaacuteniacute aplikaciacute (tzv look and feel)ktereacute je vhodneacute dodržovat
bull Je intuitivniacute ndash miacutery intuitivnosti softwaru jsou např Je UI zřetelneacutevhodně rozloženeacute Nepřekaacutežiacute vaacutem v tom co s niacutem hodlaacutete dělat Na-chaacuteziacute se funkce a odpovědi tam kde je očekaacutevaacutete Je jasneacute co budedalšiacute akce v pořadiacute Neniacute přiacuteliš komplikovaneacute (neobsahuje moc funkciacute)
bull Je konzistentniacute ndash uživateleacute si zvyknou na určityacute způsob ovlaacutedaacuteniacutea očekaacutevajiacute že provedou stejnou akci velmi podobně i v jineacutem pro-gramu Proto je důležiteacute věnovat pozornost nejen konzistenci v raacutemcinašiacute aplikace ale i vůči ostatniacutem Pozor bychom si měli daacutevat na klaacute-vesoveacute zkratky vyacuteběry z nabiacutedek umiacutestěniacute tlačiacutetek vyacutestupy aplikaceapod
bull Je flexibilniacute ndash uživateleacute majiacute raacutedi možnost volby I v jednoduchyacutechprogramech typu kalkulačka byacutevaacute na vyacuteběr alespoň ze dvou rozloženiacutendash standardniacuteho a vědeckeacuteho To ovšem znesnadňuje testovaacuteniacute proto byvoleb nemělo byacutet přiacuteliš mnoho
bull Je pohodlneacute ndash software by neměl uživateli praacuteci s niacutem nijak znepřiacute-jemňovat Je vhodneacute zaměřit se na naacuteležitost (měl by působit dojmemkteryacute odpoviacutedaacute jeho zaacuteměru) ošetřeniacute chyb (upozorněniacute před kritickouoperaciacute naacutevrat o krok zpět aj) rychlost zpracovaacuteniacute (chyboveacute hlaacuteškyzobrazovat dostatečně dlouho uveacutest odhadovanyacute čas do dokončeniacute)
bull Je spraacutevneacute ndash ověřuje se to zda UI dělaacute to co maacute Pozornost by seměla věnovat marketingovyacutem rozdiacutelům (v aplikaci nejsou oproti mar-ketingovyacutem dokumentům funkce naviacutec nebo chybějiacuteciacute funkce) jazyku
12
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
a pravopisu nespraacutevnyacutem meacutediiacutem (různorodeacute ikony zvuky a jineacute čaacutestiUI)
bull Je užitečneacute ndash přispiacutevajiacute daneacute funkce zvyacutešeniacute užitneacute hodnoty aplikacePomůže uživateli v jeho praacuteci s aplikaciacute Nepodstatneacute funkce zname-najiacute zbytečneacute testovaacuteniacute naviacutec a pro zaacutekazniacuteka nemusiacute byacutet vhodneacute
28 Automatizace testovaacuteniacuteDůvodem automatizace testovaacuteniacute je zvyacutešeniacute jeho efektivity Manuaacutelniacute naacute-vrh provedeniacute a analyacuteza testů jsou časově naacuteročneacute a často velice monotoacutenniacutepraacutece Testeři mohou jednak ušetřit čas a jednak se sniacutežiacute pravděpodobnostchybneacuteho vykonaacuteniacute testu z důvodu ztraacutety koncentrace testera v důsledkujednotvaacuterneacute činnosti Dalšiacutem přiacutenosem je průběžně se staacutele zvětšujiacuteciacute sadaregresniacutech testů Ty sloužiacute k otestovaacuteniacute zda nově přidanaacute funkcionalita čiuacuteprava aplikace nezpůsobuje chyby v již funkčniacutech čaacutestech
Funkcionaacutelniacute testovaacuteniacute UI je jednou z čaacutestiacute testovaacuteniacute UI kteraacute se ne-chaacute automatizovat Existuje celaacute řada naacutestrojů ktereacute umožňujiacute simulovaacuteniacuteklikaacuteniacute a psaniacute na klaacutevesnici Dalšiacute čaacutestiacute vhodnou pro automatizaci je kont-rola zda GUI obsahuje všechny prvky a jestli je chovaacuteniacute prvků konzistentniacutea stejneacute jako požadovaneacute V obou těchto discipliacutenaacutech je pro testovaciacute naacutestrojdůležiteacute aby zvlaacutedal klikat a psaacutet do aplikace ale zaacuteroveň vyhodnocoval jejiacutestav (vstup je možneacute zadaacutevat až tehdy když je na to aplikace připravenaacuteapod)
281 Monkey testovaacuteniacuteSpecifickou oblastiacute testovaacuteniacute GUI a automatickeacuteho testovaacuteniacute je tzv monkeytestovaacuteniacute (testovaacuteniacute za pomoci bdquocvičeneacute opiceldquo) To vychaacuteziacute z bdquoNekonečneacutehoopičiacuteho teoreacutemuldquo [Patton 2002] [Isaac 1995] kteryacute řiacutekaacute bdquoPokud bychomměli po nekonečnou dobu k dispozici nekonečně mnoho opic ktereacute by ne-ustaacutele naacutehodně psaly na nekonečně mnoho klaacutevesnic statisticky vzato bymohly nakonec napsat všechny Shakespearovy hryldquo
Nejde o automatizaci za uacutečelem usnadněniacute praacutece a zvyacutešeniacute efektivity aleza uacutečelem napodobit možneacute chovaacuteniacute potenciaacutelniacuteho uživatele Přes všechnonaše snaženiacute a testovaacuteniacute určitě v aplikaci zůstaly chyby ktereacute by možnaacuteodhalil přiacutepadnyacute uživatel podobnyacutem nezasvěcenyacutem klikaacuteniacutem a psaniacutem Tomuje však možneacute alespoň čaacutestečně předejiacutet pomociacute monkey testovaacuteniacute
13
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
3 Přehled naacutestrojů
Existuje celaacute řada naacutestrojů pro testovaacuteniacute GUI V teacuteto kapitole naacutesledujejejich přehled a vyacutečet některyacutech jejich vlastnostiacute V tabulce 31 je uvedennaacutezev naacutestroje jeho licence resp cena jazyk ve ktereacutem se testy piacutešiacute plat-forma na ktereacute naacutestroj funguje a kteraacute GUI je naacutestroj schopen testovatZ bezplatnyacutech multiplatformniacutech naacutestrojů byly vybraacuteny tři a ty podrobnějiprozkoumaacuteny a porovnaacuteny viz naacutesledujiacuteciacute kapitola
Tabulka 31 Přehled naacutestrojů
Naacutezev LicenceCena Skriptovaciacute jazyk PlatformaJazykoveacuteomezeniacute
AutoIt AutoIT [2015] Freeware BASIC-like Windows -AutoHotKey [Mallet 2015] GNU GPLv2 AutoHotKey Windows -AutoKey [Daniels 2011] GNU GPLv3 Python Linux -SikuliX [Sikuli 2015]
[Hocke 2015] MIT License Python RubyWindows
Linux Mac -
Jubula [Jubula 2015] EPL 10Drag amp Drop
JavaWindows
Linux MacJava HTML
NET iOS
RobotFramework
[Framework 2015]Apache
License 20 Natural-likeWindows
Linux Mac
Podle pluginů(Java web
Android iOS )
Squish [Squish 2015]cca
2400eosobaPython JavaScript
Ruby Perl TclWindows
Linux Mac -
eggPlant [eggPlant 2015]nedostupnaacute
vaacutezanaacute na stroj
SmartTalkDrag amp Drop
pomociacute rozhraniacuteeggDrive např
Java C RubyWindows
Linux Mac -
UFT [UFT 2015] nedostupnaacuteVBScript
Drag amp DropWindows
Linux Mac -Rational
FunctionalTester [RFT 2015] 3300 $osoba Nahraacutevaacuteniacute akciacute
WindowsLinux -
Ranorex [Ranorex 2015] 690eC VisualBasic
nahraacutevaacuteniacute akciacute Windows -
SilkTest [SilkTest 2015] nedostupnaacuteC VisualBasic
Java Windows -
TestComplete[TestComplete 2015] 889 estroj
Python VBScriptJScript CScript
DelphiScriptC++Script
nahraacutevaacuteniacute akciacute Windows -
14
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
4 Zvoleneacute naacutestroje
Vzhledem k požadavkům na naacutestroje ktereacute vyplyacutevajiacute z vazby na předmětKIVOKS jako je bezplatnost schopnost fungovaacuteniacute nezaacutevisle na OS nebopodpora testovaacuteniacute programů vytvořenyacutech technologiiacute Java a webovyacutech apli-kaciacute jsem z vyacuteše zmiacuteněnyacutech vybral naacutestroje Jubula SikuliX a Robot Fra-mework Každyacute z naacutestrojů bude stručně charakterizovaacuten a bude naacutesledovatpodrobnějšiacute srovnaacuteniacute
41 JubulaJubula je naacutestroj kteryacute vznikl a je vyviacutejen v raacutemci IDE Eclipse Do projektupřispiacutevaacute takeacute firma BREDEX GmbH kteraacute vytvaacuteřiacute i tzv standalone verzicož je program kteryacute je možneacute použiacutevat samostatně bez IDE Eclipse Naviacutecobsahuje naviacutec některeacute nespecifikovaneacute funkce a nemusiacute byacutet licencovaacutena podEPL 10 jako je tomu u verze pro IDE Eclipse
Pro tvorbu testovaciacutech skriptů byla použiacutevaacutena metoda Drag amp Droppopř se akce určovaly klikaacuteniacutem na různeacute nabiacutedky V jedneacute z posledniacutech verziacutebylo vydaacuteno Java API a skripty je tak možneacute psaacutet pomociacute jazyka Java Mezipodporovanaacute testovanaacute rozhraniacute patřiacute Java Swing SWT JavaFX HTMLa iOS Vyacutehodou teacuteto aplikace je takeacute možnost jejiacute integrace do ostatniacutechprogramů pro organizaci testovaacuteniacute
42 SikuliXSikuli (nověji SikuliX) je naacutestroj kteryacute vznikl jako projekt skupiny UserInterface Design Group na MIT což odpoviacutedaacute i jeho licenci ndash MIT LicenseNyniacute jeho vyacutevoj převzal Raimund Hock (aka RaiMan) společně s open-sourcekomunitou
Při tvorbě skriptů je možneacute využiacutet pro SikuliX vlastniacute jazyk podobnyacute při-rozeneacute angličtině nebo některyacute ze zavedenyacutech jako je Python Ruby JavaJython JRuby Scala Groovy Clojure a dalšiacute Naacutestroj neniacute omezenyacute naurčitaacute testovanaacute rozhraniacute protože k identifikaci GUI použiacutevaacute rozpoznaacutevaacuteniacuteobrazu podle vzoru1 dokaacuteže simulovat ovlaacutedaacuteniacute myši a klaacutevesnice nebo roz-poznaacutevat text v obraacutezciacutech2 Vyacutehodou teacuteto aplikace je proto jejiacute nezaacutevislost
1Pomociacute OpenCV httpopencvorg2Pomociacute Tesseract OCR httpsgithubcomtesseract-ocr
15
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
vůči testovaneacutemu rozhraniacute Cenou za to je pravděpodobneacute sniacuteženiacute jejiacute rych-losti Použitiacute SikuliX se neomezuje pouze na testovaacuteniacute ale je možneacute pomociacuteněj i automatizovat činnosti
43 Robot FrameworkRobot Framework je naacutestroj založenyacute na pluginech a je open-source Vyacutevojpodporuje společnost Nokia Networks
Zaacuteklad naacutestroje tzv core framework je vytvořenyacute v jazyce PythonKnihovny je možneacute psaacutet v jazyce Python nebo Java a samotneacute skripty pakv jazyce podobneacutem přirozeneacute angličtině Diacuteky dodržovaacuteniacute jisteacuteho formaacuteto-vaacuteniacute je pro člověka velmi přehlednyacute Mezi podporovanaacute testovanaacute rozhraniacutepatřiacute např Android iOS Java Swing weboveacute aplikace databaacuteze a aplikacevytvořeneacute pro OS Windows Vyacutehodou teacuteto aplikace je možnost si chybějiacuteciacutemodul pro testovaacuteniacute určiteacuteho rozhraniacute vytvořit a použiacutevat
16
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
5 Srovnaacuteniacute naacutestrojů
Pro srovnaacuteniacute naacutestrojů byl vytvořen naacutevrh multikriteriaacutelniacuteho hodnoceniacute kteryacutese snažiacute naacutestroje hodnotit z různyacutech uacutehlů a vytvořit tak komplexniacute klasifi-kaci Každeacute z hodnocenyacutech čaacutestiacute je možneacute přiřadit vlastniacute vaacutehu Ta určujedůležitost hodnotiacuteciacuteho kriteacuteria pro každeacuteho jedince a tiacutem napomaacutehaacute vyacuteběruvhodneacuteho naacutestroje V obraacutezku 51a je naacutevrh ukaacutezaacuten a je vidět vyacutesledek promnou zvoleneacute vaacutehy viz obraacutezek 51b Jako nejvhodnějšiacute se jeviacute použitiacute naacute-stroje SikuliX Daacutele se budu věnovat jednotlivyacutem hodnotiacuteciacutem kriteacuteriiacutem
Možnost vytvaacuteřeniacute testů je jedno z nejdůležitějšiacutech kriteacuteriiacute vzhledemk vazbě na předmět KIVOKS Hlavniacutem požadavkem bylo aby bylo možneacutetesty tvořit v jazyce Java Daacutele jsem vybral několik skriptovaciacutech jazykůa metod
Podpora testovanyacutech rozhraniacute byla dalšiacutem z rozhodujiacuteciacutech kriteacuteriiacute Hlav-niacutemi platformami měly byacutet aplikace vytvořeneacute pomociacute jazyka Java a weboveacuteaplikace Opět jsem přidal některeacute dalšiacute běžneacute platformy Naacutestroj by měl byacutetteacutež multiplatformniacute proto je jedniacutem z kriteacuteriiacute podpora operačniacutech systeacutemů
Reportovaacuteniacute vyacutesledků testů složitost jejich tvorby a jejich přehlednostmůže napomoci vyacutevojaacuteři diagnostikovat přiacutepadnou chybu Takeacute je přiacutenosneacuteznaacutet stav obrazovky a to zajistiacute screenshot Diacuteky tomu se staacutevaacute vyacutevoj jed-noduššiacute a proto jsem toto kriteacuterium takeacute zařadil do hodnoceniacute
Daacutele jsem přidal kriteacuterium univerzaacutelnosti naacutestroje s poněkud individu-aacutelniacutem ohodnoceniacutem To je zde myšleno tak co obecně naacutestroj dokaacuteže aleco neniacute podstatneacute z pohledu předmětu KIVOKS Napřiacuteklad Jubula je čistětestovaciacute naacutestroj ale SikuliX se daacute použiacutet naviacutec pro automatizaci pracovniacutechpostupů
Posledniacutem kriteacuteriem je vhodnost naacutestroje pro uacutečely předmětu KIVOKSJednaacute se hlavně o to jak zapadaacute do konceptu vyacuteuky jak je praacutece s niacutem složitaacutea jakeacute maacute naacuteroky na studentovy znalosti
Vysvětlivky termiacutenů z daacutele použityacutech tabulekbull Natural-like ndash viacutecemeacuteně okleštěnyacute přirozenyacute jazyk založenyacute na ang-
ličtině
bull Složitost tvorby ndash miacuteniacute se tiacutem složitost přiacutepravy reportu a v tabulcevyššiacute počet bodů znamenaacute jednoduššiacute tvorbu pro tvůrce skriptů
Z uvedeneacuteho multikriteriaacutelniacuteho hodnoceniacute je zřejmeacute že vybraneacute naacutestrojejsou v podstatě vyrovnaneacute To ostatně potvrzuje i jejich poměrneacute zastoupeniacute
17
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
(a) Multikriteriaacutelniacute hodnoceniacute
mezi uživateli SikuliX byl zvolen teacutež po diskuziacutech s vedouciacutem praacutece a to projeho vlastnost naprosteacute nezaacutevislosti na testovaneacutem rozhraniacute Tato vlastnostse vyacuteznamně hodiacute v předmětu KIVOKS protože je možneacute daacutet naacutestroj dokontrastu s naacutestrojem Selenium Jinyacutemi slovy řečeno SikuliX je principiaacutelněodlišnyacute naacutestroj což neniacute možneacute řiacuteci o např Jubule
18
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
(b) Vyacutesledek multikriteriaacutelniacuteho hodnoceniacute
19
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
6 SikuliX
61 InstalacePo staženiacute baliacutečku započne instalace jeho spuštěniacutem1 Je ukaacutezaacutena instalacev Linuxu avšak instalace ve Windows je obdobnaacute V průběhu maacuteme navyacuteběr různeacute možnosti jak chceme naacutestroj použiacutevat viz obraacutezek 61 Napřzda chceme použiacutevat SikuliX-IDE a Python nebo Ruby jestli budeme po-užiacutevat jineacute IDE a Javu a zda chceme použiacutevat OCR2 funkce Zaškrtnemevšechna poliacutečka kromě Ruby (JRuby) a klikneme na Setup Now Jsme do-taacutezaacuteni zda chceme baliacutečky staacutehnout nebo ukončit instalaci Zvoliacuteme YesDalšiacute dotaz je na verzi Jythonu kterou chceme použiacutet s upozorněniacutem žemůže nastat probleacutem se znaky v koacutedovaacuteniacute UTF-8 Opět zvoliacuteme Yes Začnevytvaacuteřeniacute souborů a měla by se otevřiacutet dvě okna jako na obraacutezu 62 obě po-tvrdiacuteme tlačiacutetkem OK Pokud vše proběhne v pořaacutedku vzniknou v adresaacuteřisoubory podobneacute těmto3 runsikulix SetupStuff SikuliX-110-SetupLogtxtsikulixapijar sikulixjar
Obraacutezek 61 Instalace SikuliX
1Je potřeba instalace JRE nebo JDK 6 a vyššiacute v linuxoveacute distribuci baliacuteky libopencv-core24 libopencv-imgproc24 libopencv-highgui24 libtesseract3 a wmctrl [Hocke 2015]
2Optical Character Recognition ndash optickeacute rozpoznaacuteniacute znaků3Může se lišit na různyacutech OS
20
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Obraacutezek 62 Test instalace
62 Tvorba testůBudeme pracovat s webovou aplikaciacute Převodniacutek dostupneacute z url httpokskivzcuczPrevodnikPrevodnik V teacute se vyskytujiacute zaacuteměrneacute chybya bude sloužit jako cvičnaacute aplikace pro tuto praacuteci
Pro tvorbu testů pomociacute SikuliX jsou nejdůležitějšiacute sniacutemky (screenshoty)řiacutediacuteciacutech prvků ktereacute bude SikuliX hledat a přiacutepadně použiacutevat k některyacutemakciacutem Je tedy vhodneacute si nejprve aplikaci spustit vybrat přiacuteslušneacute prvkya vytvořit jejich sniacutemky Při jejich tvorbě se doporučuje preciznost a přes-nost neboť v jistyacutech situaciacutech mohou nastat probleacutemy ktereacute budou zmiacuteněnypozději
Pokud je sniacutemků viacutece je vhodneacute je třiacutedit do adresaacuteřů To neniacute nutneacute alezlepšuje to čitelnost koacutedu a usnadňuje praacuteci s naacutestrojem Adresaacuteře mohounapř sdružovat sniacutemky prvků ktereacute jsou si nějakyacutem způsobem podobneacute(tlačiacutetka textovaacute pole vyacuteběroveacute seznamy chyboveacute hlaacutešky apod) Stejnětak je vhodneacute sniacutemky pojmenovaacutevat na zaacutekladě toho co obsahujiacute (vstupniacutetextoveacute pole label Vstup apod)
Dle [Hocke 2013] SikuliX interně použiacutevaacute třiacutedu ImageIO z Javy Pod-porovaneacute formaacutety jsou tedy bmp wbmp jpg jpeg png a gif Vzhledemk vlastnostem se doporučuje použiacutevat formaacutet png
Pokud je vytvaacuteřenyacute test jednoduchyacute a neniacute potřeba většiacuteho množstviacutetestů je jednoduššiacute vytvořit jej pomociacute SikuliX-IDE Pokud však chcemeaplikaci testovat podrobněji a psaacutet velkeacute množstviacute testovaciacutech přiacutepadů jevhodnějšiacute použiacutet některyacute z podporovanyacutech programovaciacutech jazyků a využiacutettak jeho možnosti jako nadstavbu nad SikuliX
21
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
63 SikuliX-IDEDle [Hocke 2015] je možneacute SikuliX-IDE spustit různyacutemi způsoby
1 Spuštěniacutem souboru SikuliXapp (Mac) nebo SikuliXexe (Windows)
2 dvojklikem na soubor runsikulix (Linux) nebo runsikulixcmd (Win-dows)
3 z přiacutekazoveacute řaacutedky přiacutekazemjava -jar cestaksikulixjar [volitelne parametry]
Po spuštěniacute vypadaacute IDE jako na obraacutezku 63 Jako parametry se v metodaacutechve kteryacutech je to možneacute ukazujiacute obraacutezky vzorů podle kteryacutech se na obrazovcenaacutestroj orientuje přiacutepadně cesta k nim
Obraacutezek 63 SikuliX-IDE
22
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
631 Prvniacute skriptSkript se připravuje v SikuliX-IDE ktereacute je vidět na obraacutezku 63 Koacutedkteryacute je vidět v 61 nemusiacute byacutet v IDE identickyacute ale cesta k obraacutezku můžebyacutet nahrazena jeho naacutehledem pokud je tato možnost zvolena v nastaveniacutenaacutestroje K tvorbě jsou v IDE užitečneacute pomůcky ktereacute se nachaacutezejiacute v leveacutema v horniacutem panelu
Pro spuštěniacute aplikace (např weboveacuteho prohliacutežeče) se do přiacuteslušneacute metodyzadaacute cesta k jeho spustitelneacutemu souboru Pokud se použiacutevaacute OS Linux stačiacutezadat terminaacutelovyacute přiacutekaz pro spuštěniacute (např google-chrome firefoxapod)
Skript pracuje tak že se otevře prohliacutežeč kteryacute přejde na adresu httpokskivzcuczPrevodnik Klikne na odkaz Převodniacutek do vstupniacutehopole vložiacute 1 a stiskne Převeď Z pole s vyacutesledkem přečte text a porovnaacute jejs předpoklaacutedanou hodnotou 254 Pokud si odpoviacutedajiacute objeviacute se dialogoveacuteokno s potvrzeniacutem jestliže ne zobraziacute se chybovaacute hlaacuteška Obdobně je tomuv naacutesledujiacuteciacute čaacutesti kde se pouze kontroluje existence obraacutezku
Pro vytvořeniacute skriptu postupujeme naacutesledovně1 Spustiacuteme SikuliX-IDE jednou z vyacuteše uvedenyacutech metod
2 Napiacutešeme koacuted pro otevřeniacute a vybraacuteniacute okna prohliacutežeče do popřediacuteprohlizec = App(google-chrome)prohlizecopen()prohlizecfocus()
3 Spustiacuteme prohliacutežeč
4 V SikulixIDE v leveacutem menu klikneme na a provedemescreenshot statickeacute čaacutesti aplikace Skript tedy bude vypadat přibližnětakto
23
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
5 V leveacutem menu otevřeme podmenu Keyboard Actions a vybereme Nyniacute provedeme screenshot poliacutečka pro URL ad-
resu a jako druhyacute parametr funkce zadaacuteme URL adresu aplikace Pře-vodniacutek (httpokskivzcuczPrevodnik) Přidanaacute čaacutest tedyvypadaacute přibližně takto
6 Na dalšiacute řaacutedku zadaacuteme přiacutekaz pro stisknutiacute klaacutevesy Entertype(KeyENTER)
7 V prohliacutežeči otevřeme webovou straacutenku s aplikaciacute Převodniacutek V SikuliX-IDE klikneme v leveacutem menu na a provedeme screenshotzaacuteložky kteraacute odkazuje na Převodniacutek
24
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
8 Klikneme na zaacuteložku aplikace Převodniacutek V SikuliX-IDE opět vybe-reme a udělaacuteme sniacutemek tlačiacutetka Převeď
9 Daacutele vybereme a vytvořiacuteme sniacutemek vstupniacuteho poleSniacutemek musiacute obsahovat popisek Vstup aby byl jednoznačně identifi-kovatelnyacute Takeacute musiacute obsahovat čaacutest vstupniacuteho pole dost velkou na toaby ve středu sniacutemku bylo toto pole nikoli jeho okoliacute Vloženiacute hodnotyse provaacutediacute do středu sniacutemku což se ovšem daacute upravit jak si ukaacutežemev dalšiacutem kroku Jako druhyacute parametr zadaacuteme hodnotu 1
10 Vybereme možnost a vytvořiacuteme screenshot obou vyacutebě-rovyacutech seznamů Nyniacute klikneme na obraacutezek seznamů v SikuliX-IDEa otevře se okno
Klikneme na Target Offset ktereacute vypadaacute naacutesledovně
25
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Zde buď zadaacuteme přiacuteslušneacute hodnoty do vstupniacutech poliacuteček nebo jenvybereme v obraacutezku požadovaneacute miacutesto To naacutem zajistiacute že SikuliXneklikne do středu obraacutezku ale na zvoleneacute miacutesto v něm Potvrdiacutemetlačiacutetkem OK a pokračujeme v tvorbě skriptu
11 Nyniacute nastaacutevaacute probleacutem Potřebujeme vytvořit screenshot jedneacute položkyve vyacuteběroveacutem seznamu ale SikuliX-IDE naacutem k tomu nedaacutevaacute možnostŘešeniacutem je např v prohliacutežeči vyacuteběrovyacute seznam rozbalit proveacutest scre-enshot celeacute obrazovky pomociacute tlačiacutetka PrintScreen a v nějakeacutem grafic-keacutem editoru vyřiacuteznout pouze tu čaacutest kterou chceme ( )Tu poteacute uložiacuteme do složky s vytvaacuteřenyacutem skriptem a pouze doplniacutemenaacutesledujiacuteciacute koacuted click(nazev-snimkupng)
12 Na novou řaacutedku napiacutešeme koacuted click() a do zaacutevorek zkopiacuterujeme vyacutešepoužityacute obraacutezek tlačiacutetka Převeď
13 Na dalšiacute řaacutedce si vytvořiacuteme proměnnou vystup a přiřadiacuteme do niacute textz vyacutestupniacuteho textoveacuteho pole To se provede naacutesledujiacuteciacutem způsobemvystup = find(label-vystuppng)right(100)text()Funkce right() řiacutekaacute že pracujeme s oblastiacute širokou 100 pixelů napravood nalezeneacuteho obraacutezku (popisku Vyacutestup) Funkce text() provede OCRa vraacutetiacute zjištěnyacute text
26
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
14 V dalšiacute čaacutesti provedeme kontrolu zjištěneacuteho textu Ten maacute obsahovatvyacuteslednou hodnotu ndash 254 Vložiacuteme do programu naacutesledujiacuteciacute uacutesek koacuteduif vystup == 254
popup(Ok textově)else
popError(Chyba)
15 Dalšiacute naacutesleduje bdquooptickaacuteldquo kontrola podle screenshotu Potřebujeme sipřipravit do vyacutestupniacuteho textoveacuteho pole spraacutevnyacute vyacutesledek (hodnotu254) To lze např udělat tak že provedeme převod hodnoty 254 mezistejnyacutemi jednotkami Jakmile se naacutem toto podařiacute udělaacuteme sniacutemek vyacute-sledku a uložiacuteme jej ke skriptu Zkopiacuterujeme koacuted z bodu 16 a upraviacutemeif-větev tak že smažeme porovnaacuteniacute proměnneacute s hodnotou a napiacutešemejako podmiacutenku naacutesledujiacuteciacute exists(nazev-snimkupng)
27
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
16 Jako posledniacute bod je zavřeniacute prohliacutežeče To se provede přiacutekazemprohlizecclose()
Tiacutemto postupem by měl vzniknout skript teacuteměř totožnyacute s tiacutem kteryacute jeuveden v koacutedu 61 Nebude obsahovat komentaacuteře a mohou se lišit naacutezvysniacutemků
Koacuted 61 Prvniacute skript prohlizec je promennaprohlizec = App(google - chrome )prohlizec open () otevre aplikaci definovanou
vyseprohlizec focus () vybere do popredi jeji oknoceka dokud na obrazovce nenajde obrazekwait(obr1png)najde na obrazovce obrazek a vlozi do neho textpaste(obr2png http okskivzcucz Prevodnik )type(KeyENTER) simuluje stisk klavesy ENTERnajde na obrazovce obrazek a klikne na nejclick(obr3png)wait(obr4png)paste(obr5png 1) klikne o 27px vyse a 18px vlevo od nalezeneho obrazkuclick( Pattern (obr6png) targetOffset ( -27 -18))click(obr7png)click(obr4png) precte text z casti ktera je vpravo od nalezeneho obrazku 100 px siroka do promenne vystupvystup = find(obr8png) right (100) text ()if vystup == 254
pokud rozpoznany text souhlasi se zadanym otevre se vyskakovaci okno
popup(Ok textove )else
popError (Chyba) jinak se zobrazi chyboveokno
if exists (obr9png)pokud na obrazovce existuje obrazek otevrese vyskakovaci okno
popup(Ok obrazove )else
28
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
popError (Chyba)prohlizec close () ukonci aplikaci
64 Java APIDaacutele bylo zkoumaacuteno Java API ktereacute SikuliX poskytuje Pro jeho použitiacuteje potřeba miacutet při překladu a spuštěniacute nastavenyacute v classpath sikulixapijarToho dociacuteliacuteme např tak že použijeme v přiacutekazoveacute řaacutedce dvou přiacutekazůjavac -cp sikulixapijar Test01javajava -cp sikulixapijar Test01Syntaxe kterou SikuliX v Java API využiacutevaacute je velmi podobnaacute teacute v SikuliX-IDE
641 Prvniacute testPrvniacute test s použitiacutem Java API viz koacuted 62 je teacuteměř identickyacute s tiacutem kteryacutebyl vytvořen pomociacute SikuliX-IDE
Koacuted 62 Prvniacute test Java APIimport org sikuli basics Settings import org sikuli script import javaxswing
public class Test01
static Screen sstatic App prohlizec
public static void main( String [] args) Settings OcrTextSearch = trueSettings OcrTextRead = true
s= new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()
try swait(obr1png)spaste(obr2png)stype(KeyENTER )
29
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
sclick(obr3png)swait(obr4png)spaste(obr5png 1)sclick(new Pattern (obr6png) targetOffset (
-27 -18))sclick(obr7png)sclick(obr4png)String t = sfind(obr8png) right(
100) text ()if ( Double parseDouble (t) == 254)
JOptionPane showMessageDialog (null Ok + textove )
else JOptionPane showMessageDialog (null Chyba)
if (s exists (obr9png) = null)
JOptionPane showMessageDialog (null Ok + obrazove )
else JOptionPane showMessageDialog (null Chyba)
prohlizec close ()
catch ( Exception e) e printStackTrace ()
642 Sofistikovanějšiacute testyS využitiacutem knihoven JUnit a Log4j (ani jedna z těchto knihoven neniacute pro běhSikuliX bezprostředně nutnaacute) byly vytvořeny čtyři testy viz koacuted 111 Prvniacutetest skončiacute negativně druhyacute pozitivně třetiacute pozitivně a čtvrtyacute negativně
Knihovna JUnit byla použita z toho důvodu že naacutem pomůže jednak s or-ganizaciacute testů a jejich spouštěniacutem a jednak s jejich vyhodnocovaacuteniacutem Daacuteleobsahuje metody pro vyhodnocovaacuteniacute a porovnaacutevaacuteniacute hodnot tzv asserty
Log4J je knihovna kteraacute sloužiacute k logovaacuteniacute informaciacute do souborů Umož-ňuje vlastniacute konfiguraci vyacutestupniacutech souborů a spoustu dalšiacutech funkciacute Použitabyla z toho důvodu že během testovaacuteniacute je vhodneacute zaznamenaacutevat provaacuteděneacutečinnosti z důvodu jednoduššiacuteho zjištěniacute přiacutepadneacuteho selhaacuteniacute testu SikuliXposkytuje informace o tom kam klikal či psal Ty vypisuje na standardniacute
30
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
vyacutestup avšak poskytuje metodu ktereacute se předaacute instance Logger kteryacute poteacuteSikuliX použije pro logovaacuteniacute Naacutesleduje ukaacutezka zapisovanyacutech informaciacute for-maacutetovanyacutech vlastniacute konfiguraciacute logeru viz 11218042016 125845 [INFO - TS03VymazaniJavaFX invoke0 ()] -[info] runcmd lsb_release -i -r -s18042016 125846 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] Appfocus [1 PreVODNIK ]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(925 298) S (0)[0 0 1920 x1080]18042016 125850 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 298) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 422) S (0)[0 0 1920 x1080]18042016 125851 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1128 333) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(1127 457) S (0)[0 0 1920 x1080]18042016 125852 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 400) S (0)[0 0 1920 x1080]18042016 125853 [INFO - TS03VymazaniJavaFX invoke0 ()] -
[log] CLICK on L(960 587) S (0)[0 0 1920 x1080]18042016 125858 [ERROR - TS03VymazaniJavaFX
TC03_01_02PrevodChyba ()] - Vstupni vyberovy seznam nemadefaultni hodnotu
18042016 125859 [INFO - TS03VymazaniJavaFX invoke0 ()] -[log] CLICK on L(661 198) S (0)[0 0 1920 x1080]
31
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
7 Sada ukaacutezkovyacutech testůa jejich sceacutenaacuteřů
Jak již bylo zmiacuteněno dřiacuteve existuje webovaacute aplikace Převodniacutek dostupnaacutez url httpokskivzcuczPrevodnikPrevodnik se zaacuteměrnyacutemi chy-bami Pro potřeby praacutece a pro naacutezornou ukaacutezku odlišnosti přiacutestupu k testo-vaacuteniacute weboveacute a desktopoveacute aplikace byla vytvořena teacuteměř identickaacute aplikacePřevodniacutek pomociacute technologie JavaFX jejiacutež koacuted se nachaacuteziacute na přiloženeacutemCD Naacutesledujiacuteciacute sada testů a jejich sceacutenaacuteřů se vztahuje k těmto aplikaciacutemjejichž vzhled je ukaacutezaacuten na obraacutezciacutech 71 a 72
Obraacutezek 71 Webovaacute aplikace Převodniacutek
Ze sceacutenaacuteřů i z přiloženeacuteho zdrojoveacuteho koacutedu je patrneacute že přiacutestup k tes-tovaacuteniacute obou aplikaciacute je totožnyacute Testy vypadajiacute stejně jak pro desktopovouaplikaci tak pro webovou Jedineacute rozdiacutely nastaacutevajiacute ve způsobu spouštěniacuteaplikaciacute zachaacutezeniacute s nimi a v cestě k použityacutem řiacutediacuteciacutem screenshotům Přiacute-činou je to že se jednaacute o teacuteměř identicky vypadajiacuteciacute a chovajiacuteciacute se aplikaceDaacutele budou uvedeny vždy jen stručneacute ukaacutezky testů s vyznačenyacutemi přiacutepad-nyacutemi odlišnostmi
32
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Obraacutezek 72 Aplikace Převodniacutek vytvořenaacute pomociacute JavaFX
71 Rozděleniacute testůSceacutenaacuteře byly rozděleny do třiacute čaacutestiacute a každaacute čaacutest poteacute může obsahovat dalšiacuteskupiny ktereacute sjednocujiacute tematicky si bliacutezkeacute testy Struktura sceacutenaacuteřů tedyvypadaacute přibližně takto
1 Statickeacute prvky
11 Přiacutetomnost prvků
12 Editovatelnost poliacute
13 Uacuteplnost vyacuteběrovyacutech seznamů
2 Převody
21 Happy Day Scenario
22 Stejneacute jednotky
23 Varianty Vstup OK
24 Vše na metr
25 Vše z metru
26 Varianty Vstup CHYBA
27 Všechny vstupy na všechny vyacutestupy
28 Hraničniacute hodnoty
3 Vymazaacuteniacute
33
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Test Suite sloužiacute pro seskupeniacute podobně zaměřenyacutech testovaciacutech přiacute-padů Jejich použitiacute v teacuteto praacuteci je shodneacute s vyacutečtem vyacuteše Napřiacuteklad naacutezevčaacutesti ve ktereacute testujeme uacuteplnost vyacuteběrovyacutech seznamů aplikace maacute před-ponu TS (Test Suite) za niacutež naacutesleduje pořadoveacute čiacuteslo a popis daneacute čaacutesti(13 Uacuteplnost vyacuteběrovyacutech seznamů) Naacutezev Test Suite tedy vypadaacute taktoTS01_03UplnostVyberovychSeznamu Je možneacute spouštět celeacute Test Suitev přiacutepadě použitiacute IDE či některyacutech dalšiacutech naacutestrojů i jednotliveacute testovaciacutepřiacutepady
Testovaciacute přiacutepady majiacute předponu TC (Test Case) za niacutež nasleduje čiacuteslotestovaciacuteho přiacutepadu a jeho naacutezev Pokud tedy např testujeme uacuteplnost vyacute-stupniacuteho vyacuteběroveacuteho seznamu naacutezev bude TC01_03_02VystupniVyberovy-Seznam Čiacuteslo testovaciacuteho přiacutepadu se tvořiacute dle jeho přiacuteslušnosti do čaacutesti vevyacutečtu vyacuteše (Test Suite) Patřiacute do Uacuteplnost vyacuteběrovyacutech seznamů a tomu od-poviacutedaacute prvniacute čaacutest čiacutesla 01_03 Označeniacute 02 je pořadoveacute čiacuteslo testu v raacutemcidaneacute kategorie
72 Statickeacute prvkySceacutenaacuteře v teacuteto čaacutesti pouze zkontrolujiacute zda testovanaacute aplikace obsahuje vše-chny prvky jako např tlačiacutetka či vstupniacute pole Daacutele se zkoumaacute zda jevstupniacute pole editovatelneacute a vyacutestupniacute pole nikoli Poteacute se zjistiacute zda jsou vevyacuteběrovyacutech seznamech obsaženy všechny položky
Naacutesledujiacuteciacute uacutesek koacutedu 71 demonstruje jakyacutem způsobem se testujiacute sta-tickeacute prvky aplikace
Koacuted 71 Test přiacutetomnosti statickeacuteho prvkuTestpublic void TC01_01_02VstupniTextovePole ()
if (run) try
assertTrue ( Vstupni textove pole neexistuje sfind(pngs + labely vstupLabel png)right () grow (0 20) exists (pngs + textovaPole vstupniTextovePole png) =null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
34
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
logger error(Setup failed )fail(Setup failed )
73 PřevodyV teacuteto čaacutesti jsou zpracovaneacute funkčniacute testy konkreacutetniacutech převodů Nejprvese provedou testy Happy Day Scenario ndash sceacutenaacuteř kdy vše dopadne podleočekaacutevaacuteniacute Poteacute se zkontrolujiacute převody mezi stejnyacutemi jednotkami převodys možnyacutemi korektniacutemi i nekorektniacutemi vstupy převody mezi všemi jednot-kami a nakonec převody s hraničniacutemi hodnotami
Čaacutest koacutedu v 72 ukazuje jak se mohou tvořit testy převodů
Koacuted 72 Test převoduTestpublic void TC02_04_01PrevodCmNaM ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(1)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20) find(pngs + vyberoveSeznamy vstupniVyberovy + Seznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupModryCm png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Ocekavano 001 zjisteno neco +
35
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
jineho sfind(pngs + labely vystup +Labelpng) right (200) grow (0 10) exists (pngs + vystupy vystup0_01 png) = null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
74 VymazaacuteniacuteV teacuteto čaacutesti se testuje funkčnosti tlačiacutetka Vymaž Otestuje se přiacutepad kdy senevyskytla chybovaacute hlaacuteška i ten kdy se vyskytla
Koacuted 73 je jednou z možnostiacute jak testovat spraacutevnou funkčnost tlačiacutetkaVymazat
Koacuted 73 Test funkčnosti tlačiacutetka VymazatTestpublic void TC03_01_02PrevodChyba ()
if (run) try
sfind(pngs + labely vstupLabel png) right ()grow (0 20) click(pngs + textovaPole + vstupniTextovePole png)
spaste(abc)Match hledani = sfind(pngs + labely +
vstupLabel png) right () grow (0 20)find(pngs + vyberoveSeznamy vstupni + VyberovySeznam png)
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vstupM png)hledani = sfind(pngs + labely vystupLabel +
png) right () grow (0 20) find(pngs + vyberoveSeznamy vystupniVyberovySeznam +png)
36
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
hledani click ()hledani below () click(pngs + vyberove +
Seznamy vystupM png)sclick(pngs + tlacitka tlacitkoPreved png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Nenalezeno upozorneni o chybe s
exists (pngs + chyby chybaNeplatneCislo ) =null )
sclick(pngs + tlacitka tlacitkoVymaz png)swait(pngs + tlacitka tlacitkoPreved png
5)assertTrue ( Vstupni pole neni prazdne s
find(pngs + labely vstupLabel png) right ()grow (0 20) exists (pngs + textovaPole + vstupniTextovePole png) = null )
assertTrue ( Vystupni pole neni prazdne sfind(pngs + labely vystupLabel png)right () grow (0 20) exists (pngs + textovaPole vystupniTextovePole png) =null )
assertTrue ( Vstupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vstupLabel png) right () grow (0 20)exists (pngs + vyberoveSeznamy vstupni + VyberovySeznam png) = null )
assertTrue ( Vystupni vyberovy seznam nema + defaultni hodnotu sfind(pngs + labely vystupLabel png) right () grow (020) exists (pngs + vyberoveSeznamy + vystupniVyberovySeznam png) = null )
assertTrue ( Nalezeno upozorneni o chybe sexists (pngs + chyby chybaNeplatneCislo ) ==null )
catch ( FindFailed | AssertionError e) s capture () save( errors screenshotName ())logger error(e getMessage ())fail(e getMessage ())
else
logger error(Setup failed )fail(Setup failed )
37
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
75 Zjištěneacute chybyBěhem testovaacuteniacute aplikace bylo zjištěno několik chyb Jak již bylo řečenodřiacuteve tyto chyby jsou v aplikaci zaneseny zaacuteměrně
751 Chybneacute převody z (na) decimetryPokud provaacutediacuteme převod z (přiacutepadně na) decimetry dostaneme nespraacutevnyacutevyacutesledek viz 73 Chovaacuteniacute odpoviacutedaacute převodu z (na) palce
Obraacutezek 73 Chybnyacute převod z decimetru na centimetr
752 Chybneacute zaokrouhleniacuteDaacutele u jednotek decimetry i palce v situaci kdy jsou použity jak na vstuputak na vyacutestupu je hodnota 3 převedena přibližně na 29999996 viz 74
Obraacutezek 74 Chybneacute zaokrouhleniacute při převodu mezi decimetry
753 Převod zaacuteporneacute hodnotyPři zadaacuteniacute zaacuteporneacute hodnoty pro převod se zobraziacute chybovaacute hlaacuteška o zaacutepor-neacutem čiacutesle avšak převod se i tak provede viz 75
38
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Obraacutezek 75 Převod zaacuteporneacute hodnoty
754 Tlačiacutetko VymažTlačiacutetko Vymaž nenastaviacute všem komponentaacutem vyacutechoziacute hodnoty Pouze vy-maže obsah vstupniacuteho pole Vyacutestupniacute pole a vyacuteběroveacute seznamy nadaacutele ob-sahujiacute hodnoty z posledniacuteho převodu viz 76
Obraacutezek 76 Použitiacute tlačiacutetka Vymaž
39
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
8 Probleacutemy praacutece se SikuliX
Během tvorby testů je možneacute narazit na různeacute probleacutemy Ty ktereacute bylyzjištěny během vytvaacuteřeniacute teacuteto praacutece jsou zde uvedeny popsaacuteny a je k nimnastiacuteněno možneacute řešeniacute
81 Rozlišeniacute obrazovkyJelikož se SikuliX v aplikaci orientuje podle screenshotů je v danou chviacutelizaacutevisleacute na rozlišeniacute ve ktereacutem byl sniacutemek pořiacutezen To je z důvodu že ještěneniacute implementovaacutena funkce kteraacute by měla tento probleacutem odstranit Pokudse změniacute rozlišeniacute nebude danyacute prvek nalezen ačkoli bude možneacute pouhyacutemokem zjistit že ve skutečnosti přiacutetomen je Stejnyacute probleacutem nastaacutevaacute i pokudse změniacute např piacutesmo nebo velikost weboveacute straacutenky s aplikaciacute a podobnyacutemizměnami vzhledu
Jedniacutem z možnyacutech řešeniacute je že si udělaacutete screenshoty pro různaacute rozli-šeniacute piacutesma nebo velikosti straacutenek přiacutepadně budete testovat pouze s jedniacutemdanyacutem rozlišeniacutem piacutesmem nebo velikostiacute straacutenky
Nejvhodnějšiacute je nastavit v prohliacutežeči 100 velikost straacutenky Toho se v Go-ogle Chrome nechaacute dociacutelit např tak že klikneme na ikonku Menu a položkuLupa (přiacutep Zoom) nastaviacuteme na 100 jak je ukaacutezaacuteno na obraacutezku 81
Obraacutezek 81 Nastaveniacute 100 velikosti straacutenky
40
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
82 Rozměry screenshotůPokud se v testu hledaacute prvek v zaacutevislosti na pozici jineacuteho je možneacute že ne-bude nalezen Důvodem mohou byacutet rozdiacutelneacute rozměry screenshotů v kombi-naci s použityacutemi metodami hledaacuteniacute ndash prvniacute prvek nalezneme ale screenshotdruheacuteho je většiacute než prohledaacutevanaacute oblast vymezenaacute rozměry prvniacuteho tu-diacutež nemůže byacutet nalezen Obraacutezek 82 demonstruje probleacutem Pokud budemehledat červeně vyznačenyacute obraacutezek kteryacute je vyššiacute než sniacutemek ve ktereacutem hle-daacuteme nebude nalezen
Na sniacutemku je situace kdy se někde v zaacuteložce Reklama naleacutezaacute ikona KIVPrvniacute sniacutemek obrazovky ukazuje vyacuteřez zaacuteložky Reklama Tento sniacutemek je vy-sokyacute x y pixelů Druhyacute červeně oraacutemovanyacute sniacutemek již ukazuje hledaneacute logoKIV (ve stejneacutem měřiacutetku) ale vyacuteška tohoto sniacutemku je (chybně zbytečně)o 10 pixelů na každou stranu většiacute než prvniacute sniacutemek
Obraacutezek 82 Nespraacutevneacute rozměry screenshotů
83 Ukazatel myšiPři pořizovaacuteniacute screenshotů je vhodneacute vyvarovat se umiacutestěniacute ukazatele myšive sniacutemaneacute oblasti Ten se totiž v průběhu testu v teacuteto oblasti vyskytovatnemusiacute a hledanyacute prvek by tak nemusel byacutet rozpoznaacuten
Stejně tak je důležiteacute uvědomit si že na některyacutech platformaacutech se simu-lovaacuteniacutem pohybu myši a klikaacuteniacutem měniacute pozice ukazatele To může vyuacutestitv probleacutem pokud je ukazatel umiacutestěn přes hledanyacute prvek kteryacute tiacutem paacutedempravděpodobně nebude rozpoznaacuten Oba probleacutemy shrnuje obraacutezek 83
41
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Obraacutezek 83 Screenshot s ukazatelem myši
84 Nespolehliveacute OCRSikuliX poskytuje možnost rozpoznaacuteniacute textu v obraacutezciacutech Tato funkcionalitaje však v experimentaacutelniacute faacutezi a na jejiacutem vyacutevoji se staacutele pracuje Je tedynespolehlivaacute a pro naše uacutečely nevhodnaacute Text v obraacutezku buď vůbec nebylnalezen (pokud se jednalo např o jedinou čiacuteslici) nebo byl špatně rozpoznaacuten(zaacuteměna O a 0 ziacuteskaacutena pouze čaacutest textu apod)
Možnyacutem řešeniacutem je tedy nasimulovat korektniacute vyacutestup proveacutest screenshota ten použiacutet pro obrazoveacute rozpoznaacuteniacute spraacutevneacuteho vyacutesledku
85 Nefunkčnost některyacutech metod třiacutedJava API SikuliX poskytuje třiacutedy a metody pro praacuteci s aplikacemi a jejichokny Tyto metody a třiacutedy majiacute však občas jineacute než očekaacutevaneacute chovaacuteniacuteVzhledem k teacuteměř nuloveacute dokumentaci je toto celkem velkyacute probleacutem
851 Pozice a velikost oknaKonkreacutetniacutem přiacutekladem je např to pokud bychom chtěli testovaacuteniacute omezitpouze na okno aplikace SikuliX je schopno okno s aplikaciacute najiacutet podle (čaacutesti)jejiacuteho titulku a přeneacutest jej do popřediacute Už ale neniacute schopno ziacuteskat rozměrya pozici tohoto okna ačkoli metody pro tyto funkce existujiacute
Postup kteryacutem se daacute tato funkcionalita nahradit je naacutesledujiacuteciacute Aplikacinajdeme podle jejiacuteho titulku a nechaacuteme ji přeneacutest do popřediacute Poteacute je SikuliXschopneacute ziacuteskat pozici a rozměry okna ktereacute je v popřediacute (maacute tzv focus) jakje ukaacutezaacuteno v naacutesledujiacuteciacutem koacutedu
Region window = AppfocusedWindow()Location minCoord = windowgetTopLeft()Location maxCoord = windowgetBottomRight()
42
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
852 Stav aplikaceDaacutele nedokaacutezalo indikovat že aplikace skončila svůj běh Pokud jsme tedypoužili cyklus bdquotestuj dokud aplikace běžiacuteldquo testovaacuteniacute pokračovalo i v přiacute-padě že byla aplikace již ukončena
Naacutehradniacutem řešeniacutem tedy bylo vytvořit screenshot některeacute čaacutesti aplikacekteraacute se neměniacute a je vždy v aplikaci přiacutetomna Cyklus poteacute vypadaacute taktobdquotestuj dokud najdeš tuto čaacutest aplikaceldquo To však neniacute řešeniacute absolutniacuteprotože nebude funkčniacute v přiacutepadech kdy se objeviacute např dialogoveacute oknoktereacute tuto čaacutesti zakryje nebo pokud takovaacute čaacutest vůbec neexistuje
853 Spuštěniacute aplikaceMetody pro spuštěniacute aplikace Appopen(aplikace) new App(aplikace)open() a Apprun(přiacutekaz) ktereacute SikuliX poskytuje fun-govaly bez probleacutemů v OS Linux avšak v OS Windows nastal probleacutemSikuliX nebylo schopneacute otevřiacutet aplikaci pomociacute ani jednoho z přiacutekazů
Appopen(java -jar cestakaplikacijar)new App(java -jar cestakaplikacijar)open()Apprun(java -jar cestakaplikacijar)
Tyacutekaacute se to pouze spouštěniacute aplikace pomociacute daneacuteho přiacutekazu Pokud by bylazadaacutena cesta ke spustitelneacutemu souboru (např cestakespustitelnemusouboruexe) vše proběhlo bez probleacutemů i za použitiacute těchto metod
Probleacutem jsem nebyl schopen za pomoci SikuliX vyřešit Použil jsem protometodu poskytovanou programovaciacutem jazykem Java konkreacutetně
RuntimegetRuntime()exec(java -jar cestakaplikacijar)App application = new App(Titulek aplikace)applicationfocus()
854 Rychlost vykonaacutevanyacutech testůBylo provedeno srovnaacuteniacute časoveacute naacuteročnosti testů vytvořenyacutech pomociacute Siku-liX a Selenia pro zjištěniacute přiacutetomnosti statickyacutech prvků v aplikaci Vyacutesledkyjsou uvedeny v tabulce 81 ze ktereacute je patrneacute že Selenium je rychlejšiacute Důvo-dem je nejspiacuteše fakt že SikuliX obrazově vyhledaacutevalo prvky kdežto Seleniumpouze přistupovalo k HTML koacutedu aplikace
43
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Tabulka 81 Srovnaacuteniacute časoveacute naacuteročnosti testů v ms
SikuliXSelenium ndash
headless browserSelenium ndashFirefox
Label Vstup 125 122 114Vstupniacute textoveacute pole 415 0 105Vstupniacute vyacuteběrovyacute seznam 165 0 117Label Vyacutestup 128 66 113Vyacutestupniacute textoveacute pole 152 0 117Vyacutestupniacute vyacuteběrovyacute seznam 449 0 101Tlačiacutetko Převeď 144 1 145Tlačiacutetko Vymaž 332 0 130
44
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
9 Monkey testy
Princip monkey testovaacuteniacute byl již zmiacuteněn v kapitole 281 Zde bude pro-blematika popsaacutena podrobněji a bude ukaacutezaacuten jeden konkreacutetniacute monkey testvytvořenyacute pomociacute SikuliX
Dle [Patton 2002] existujiacute tři druhy monkey testů (bdquocvičenyacutech opicldquo)lišiacuteciacutech se svou inteligenciacute ndash co umiacute jakeacute majiacute povědomiacute o aplikace apodJejich vlastnosti a rozdiacutely jsou popsaacuteny v naacutesledujiacuteciacutech čaacutestech
91 Hloupaacute opiceNejjednoduššiacutem přiacutepadem cvičeneacute opice je hloupaacute opice Ta neviacute vůbec nico testovaneacute aplikace jen naacutehodně klikaacute a piacuteše na klaacutevesnici Software kteryacutena počiacutetači běžiacute neniacute schopnyacute rozlišit cvičenou opici od skutečneacuteho člověkasnad jen že opice by měla akce vykonaacutevat rychleji
Na prvniacute pohled se zdaacute že takovyacuteto přiacutestup nemůže najiacutet žaacutedneacute chybyOpak je ale pravdou neboť jak se ukazuje pokud maacuteme dostatek času a po-kusů opice až překvapivě často vytvořiacute jakousi posloupnost akciacute kteraacute po-vede k havaacuterii aplikace Na tuto posloupnost nejspiacuteše programaacutetoři ani testeřivůbec nepomysleli proto nebyla tato chyba nalezena dřiacuteve
Dalšiacute možnou chybou kterou může i hloupaacute opice zjistit jsou uacutenikypaměti Pokud totiž nechaacuteme opici pracovat přes noc poběžiacute software několikhodin (přiacutepadně můžeme nechat běžet i několik dniacute) a přiacutepadneacute probleacutemy setak mohou projevit
92 Zpola inteligentniacute opicePokud hloupou opici doplniacuteme o několik funkciacute naviacutec zvyacutešiacuteme jejiacute inteli-genčniacute kvocient na zpola inteligentniacute opici Jednou z těchto funkciacute je za-znamenaacutevaacuteniacute provaacuteděnyacutech činnostiacute do souboru ndash logu Diacuteky tomu jsme poteacuteschopni přesněji identifikovat co se dělo těsně před selhaacuteniacutem aplikace
Dalšiacute takovou funkciacute je aby opice pracovala pouze s testovanou aplikaciacutePokud klikaacute a piacuteše kamkoli na obrazovce jednou by zvolila i možnost vy-pnutiacute počiacutetače čiacutemž bychom ztratili drahyacute čas na testovaacuteniacute V jineacutem přiacutepaděby zvolila možnost ukončit aplikaci ale jelikož by si toho nebyla vědomapokračovala by v klikaacuteniacute a psaniacute na vše možneacute co se vyskytuje na obrazovceZjištěniacute zda je ještě aplikace spuštěnaacute se řadiacute k těmto funkciacutem takeacute
45
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Vhodnaacute je i ta možnost kteraacute dovoliacute opici aplikaci po selhaacuteniacute znovuspustit a pokračovat tak v testovaacuteniacute
93 Inteligentniacute opiceDalšiacutem evolučniacutem krokem je inteligentniacute opice Ta do klaacutevesnice bdquonebušiacuteldquozcela naacutehodně ale uvědomuje si naacutesledujiacuteciacute věci
bull kde se nachaacuteziacute
bull co na tomto miacutestě může dělat
bull kam může přejiacutet
bull kde již byla
bull jestli je to co vidiacute opravdu spraacutevneacute
Opice si je tedy vědoma všech (minimaacutelně některyacutech) stavů aplikace a pře-chodů mezi nimi Diacuteky tomu dokaacuteže s programem pracovat přibližně stejnějako přiacutepadnyacute uživatel jen mnohem rychleji
Inteligentniacute opice se však nemusiacute omezovat jen na hledaacuteniacute chyb ale mo-hou takeacute kontrolovat vyacutesledky činnostiacute aplikace spraacutevnost vyacutestupů apodPokud je naviacutec schopna vykonaacutevat konkreacutetniacute testovaciacute přiacutepady může naleacute-zat poměrně velkeacute množstviacute chyb
94 Monkey test pomociacute SikuliXPro uacutečely teacuteto praacutece byl vytvořen jeden monkey test provaacuteděnyacute nad aplikaciacuteKalkulačka Cvičenaacute opice kteraacute jej provaacutediacute je zpola inteligentniacute ndash omezujese na praacuteci s oknem aplikace zapisuje akce do logu a je si vědoma toho zdaje ještě aplikace spuštěnaacute
Z důvodů uvedenyacutech v kapitole 85 hlavně zhoršenou schopnostiacute zjišťovatpozici a velikost okna aplikace a jejiacute stav se SikuliX jeviacute jako nevhodnyacute protvorbu tohoto typu testů
Konkreacutetniacute přiacuteklad v koacutedu 91 běžiacute tak dlouho dokud existuje statickaacutečaacutest aplikace Ve smyčce poteacute ziacuteskaacute pozici a velikost jejiacuteho okna Vygenerujenaacutehodnaacute čiacutesla pro souřadnice vykonaacutevaneacute akce a dalšiacute čiacuteslo pro určeniacute kon-kreacutetniacute akce (kliknutiacute dvojkliknutiacute kliknutiacute pravyacutem tlačiacutetkem vloženiacute textupřiacutepadně stisknutiacute klaacuteves)
46
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Koacuted 91 Monkey test vytvořenyacute pomociacute SikuliXTestpublic void MonkeyTest01 () throws FindFailed
Random gen = new Random ()while (s exists (title) = null)
window = App focusedWindow ()Location minCoord = window getTopLeft ()Location maxCoord = window getBottomRight ()int random = gen nextInt (5)int x = gen nextInt ( maxCoord getX ()) y = gen
nextInt ( maxCoord getY ())while (x lt minCoord getX ()) x = gen nextInt (
maxCoord getX ())while (y lt minCoord getY ()) y = gen nextInt (
maxCoord getY ())switch ( random )
case 0 Clickwindow click(new Location (x y))break
case 1 Double -clickwindow doubleClick (new Location (x y))break
case 2 Right clickwindow rightClick (new Location (x y))break
case 3 Pasteif (gen nextInt (2) == 1) window click(new
Location (x y))String s = randomString (gen )window paste(new Location (x y) s)logger info(PASTE + s + on [ + x +
+ y + ])break
case 4 Typeif (gen nextInt (2) == 1) window click(new
Location (x y))window type(new Location (x y)
randomString (gen ))break
47
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
10 Automatizace naacutestrojem
Podle [Hocke 2015] je SikuliX primaacuterně naacutestroj pro automatizaci činnostiacute Jevhodnyacute pro kohokoli kdo provaacutediacute opakovaně některeacute monotoacutenniacute činnosti jakodenniacute praacutece s aplikacemi nebo webovyacutemi straacutenkami hraniacute her administraceIT systeacutemů a siacutetiacute apod
Zde ukaacutežeme možnost automatizace takoveacuteho procesu na konkreacutetniacutempřiacutekladu viz koacuted 101 Jednaacute se o zapnutiacute a přiacutepadneacute přihlaacutešeniacute (pokudjsme se během sezeniacute již nepřihlašovali) do aplikace TestLink instalovaneacutepodle postupu v podkladech k přednaacuteškaacutem KIVOKS viz [Herout 2016]
Postup je ve sveacute podstatě identickyacute jako při vytvaacuteřeniacute testovaciacutech přiacute-padů Jedinyacutem rozdiacutelem je že nebude nutneacute použiacutevat knihovnu JUnit ne-boť neprovaacutediacuteme testovaacuteniacute ale skript vytvořiacuteme jako samostatnyacute programv Javě Každyacute si ve skriptu musiacute upravit cestu k Bitnami TestLink StackManager Tool login a heslo
Koacuted 101 Automatizace spuštěniacute a přihlaacutešeniacute do aplikace TestLinkpublic static void main( String [] args)
Logger logger = LogManager getLogger ()
Settings MoveMouseDelay = 0Debug setLogger ( logger )Debug setLoggerAll (info)
Screen s = new Screen ()try
Runtime getRuntime () exec(cestak TestLink manager tool)
App application = new App( TestLink )application focus ()swait(png goToApp png 5)sclick(png goToApp png)if (s exists (png startServers png) = null) s
click(png startServers png)application = new App( Chrome )application focus ()swait(png access png 50)sclick(png access png)if (s exists (pngloginpng) = null)
sfind(pngloginpng) below (20) click ()
48
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
spaste(login)sclick(pngloginpng)sfind(pngpasspng) below (20) click ()spaste( password )stype(KeyENTER )
catch ( IOException | FindFailed e)
s capture () save( errors screenshotName ())logger error(e getMessage ())
49
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
11 Zaacutevěr
V praacuteci jsou popsaacuteny některeacute metody testovaacuteniacute grafickeacuteho uživatelskeacuteho roz-hraniacute a takeacute zaacutekladniacute důvody použiacutevaacuteniacute těchto metod V prvniacute čaacutesti praacuteceje proveden kvalifikovanyacute průzkum existujiacuteciacutech a dostupnyacutech naacutestrojů ktereacuteje možneacute k testovaacuteniacute GUI využiacutet
Byly vybraacuteny tři naacutestroje jejichž stručnaacute charakteristika je uvedena v te-oretickeacute čaacutesti praacutece Daacutele bylo navrženo multikriteriaacutelniacute hodnoceniacute a prove-deno podrobneacute porovnaacuteniacute zvolenyacutech naacutestrojů Multikriteriaacutelniacute hodnoceniacute maacutesedm kriteacuteriiacute Jejich vaacutehy si může zaacutejemce určit saacutem viz tabulkovyacute soubor naCD Podle vah diskutovanyacutech s vedouciacutem praacutece byl vybraacuten naacutestroj SikuliXkteryacute byl daacutele detailně zkoumaacuten
Možnosti naacutestroje SikuliX byly okamžitě ověřovaacuteny v připravovanyacutechpraktickyacutech testech Aby bylo možneacute demonstrovat že SikuliX maacute širšiacute mož-nosti pro testovaacuteniacute než naacutestroj pro testovaacuteniacute webovyacutech aplikaci Seleniumbylo nutneacute nejdřiacuteve připravit identickou desktopovou aplikaci k již existu-jiacuteciacute weboveacute aplikaci Podle již existujiacuteciacuteho vzoru byly připraveny v SikuliXdvě kompletniacute sady testů jak pro desktopovou tak pro webovou aplikaciTento přiacutestup dovoluje porovnat oba dva způsoby testovaacuteniacute a poukaacutezat napřiacutepadneacute drobneacute rozdiacutely mezi nimi
Při testovaacuteniacute byly využity možnosti frameworku JUnit a rovněž předpři-praveneacute možnosti SikuliX pro logovaacuteniacute ktereacute nebyacutevaacute v testovaacuteniacute tak běžneacuteZde se ale ukazuje že je vyacutehodneacute
Pozornost byla v praacuteci věnovaacutena i monkey testům a automatizaci čin-nostiacute přičemž bylo zjištěno že obě dvě aktivity se nijak vyacuterazně neodlišujiacuteod psaniacute běžnyacutech testů
V praacuteci je teacutež stručně porovnaacutena časovaacute naacuteročnost naacutestrojů ale je třebařiacuteci že toto neniacute podstatneacute kriteacuterium vyacuteběru naacutestroje
V teacuteto praacuteci bylo vytvořeno dvakraacutet 103 testů (každyacute pro webovou a Ja-vaFX aplikaci dohromady tedy 206 testů) Počet sniacutemků potřebnyacutech provytvořeniacute testů byl čtyřikraacutet 74 (každyacute pro webovou a JavaFX aplikaci jakna Linux tak na Windows celkem tedy 296 sniacutemků) Daacutele byl vytvořenjeden monkey test a jeden skript pro ukaacutezku automatizace činnosti Dohro-mady bylo vytvořeno viacutece než 330 souborů a napsaacuteno viacutece než 7350 řaacutedekzdrojoveacuteho koacutedu
Vyacutesledky praacutece budou přiacutemo použity pro přiacutepravu jedneacute z přednaacutešekpředmětu Ověřovaacuteniacute kvality softwaru vyučovaneacuteho na KIV
50
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Seznam zkratek
bull API ndash Application Programming Interface rozhraniacute pro programovaacuteniacute
bull CLI ndash Command Line Interface rozhraniacute přiacutekazoveacute řaacutedky
bull FURPS ndash jeden z nejčastějšiacutech modelů kvality software
bull GUI ndash Graphical User Interface grafickeacute uživatelskeacute rozhraniacute
bull IDE ndash Integrated Development Environment integrovaneacute vyacutevojoveacuteprostřediacute
bull JDK ndash Java Development Kit vyacutevojoveacute naacutestroje pro programovaciacutejazyk Java
bull JRE ndash Java Runtime Environment prostřediacute pro běh aplikaciacute napsa-nyacutech v programovaciacutem jazyce Java
bull KIV ndash Katedra informatiky a vyacutepočetniacute techniky
bull OCR ndash Optical Character Recognition optickeacute rozpoznaacuteniacute znaků
bull OKS ndash Ověřovaacuteniacute kvality software
bull OS ndash Operating System operačniacute systeacutem
bull SQuaRE ndash Software Quality Requirements and Evaluation
bull TC ndash Test Case testovaciacute přiacutepad
bull TS ndash Test Suite organizačniacute jednotka seskupujiacuteciacute testovaciacute přiacutepady
bull UAT ndash User Acceptance Testing akceptačniacute testovaacuteniacute
bull UI ndash User Interface uživatelskeacute rozhraniacute
51
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Literatura
AutoIT AutoIt [online] AutoIt Consulting Ltd 2015 [cit 4102015]Dostupneacute z httpswwwautoitscriptcomsiteautoit
Daniels K W AutoHotKey [online] 2011 [cit 4102015] Dostupneacute zhttpscodegooglecompautokey
eggPlant eggPlant Functional [online] TestPlant 2015 [cit 4102015]Dostupneacute z httpwwwtestplantcomeggplanttesting-toolseggplant-developer
Framework R Robot Framework Generic test automation framework foracceptance testing and ATDD [online] Robot Framework and NokiaNetworks 2015 [cit 4102015] Dostupneacute z httprobotframeworkorg
Herout P Přednaacutešky z OKS [online] 2016 [cit 1342016] Dostupneacute zhttpwwwkivzcucz~heroutvyukaoksprednaskyoks-1a4pdf
Hocke R SikuliX [online] 2015 [cit 4102015] Dostupneacute zhttpwwwsikulixcom
Hocke R Does sikuli work with most of the popular picture formats [online]Parn Yin 2013 [cit 1142016] Dostupneacute zhttpsanswerslaunchpadnetsikuli+question241219
Isaac R The Pleasures of Probability Springer-Verlag New York Inc 1995ISBN 978-1-4612-6912-0
Jubula Jubula Automated Functional Testing [online] Eclipse Foundation andBredex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwweclipseorgjubula
Mallet C AutoHotKey [online] 2015 [cit 4102015] Dostupneacute zhttpswwwautohotkeycom
Patton R Testovaacuteniacute softwaru Computer Press 2002 ISBN 80-7226-636-5
Ranorex Ranorex [online] Ranorex GmbH 2015 [cit 4102015] Dostupneacute zhttpwwwranorexcom
RFT Rational Functional Tester [online] IBM 2015 [cit 4102015]Dostupneacute z httpwww-03ibmcomsoftwareproductscsfunctional
52
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Roudenskyacute P ndash Havliacutečkovaacute A Řiacutezeniacute kvality softwaru Průvodcetestovaacuteniacutem Computer Press 2013 ISBN 978-80-251-3816-8
Sikuli Sikuli [online] User Interface Design Group at MIT 2015[cit 4102015] Dostupneacute z httpwwwsikuliorg
SilkTest SilkTest [online] Micro Focus 2015 [cit 4102015] Dostupneacute zhttpwwwborlandcomen-GBProductsSoftware-TestingAutomated-TestingSilk-Test
Squish Squish GUI Tester [online] froglogic GmbH 2015 [cit 4102015]Dostupneacute z httprobotframeworkorg
TestComplete TestComplete [online] SmartBear Software 2015[cit 4102015] Dostupneacute zhttpsmartbearcomproducttestcompleteoverview
UFT Unified Functional Testing [online] Hewlett Packard EnterpriseDevelopment LP 2015 [cit 4102015] Dostupneacute z httpwww8hpcomczcssoftware-solutionsunified-functional-automated-testing
53
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Přiacutelohy
54
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Přiacuteloha ASofistikovanějšiacute testy
Koacuted 111 Dalšiacute testy Java APIimport org apache logging log4j LogManager import org apache logging log4j Logger import orgjunit AfterClass import orgjunit Before import orgjunit BeforeClass import orgjunitTestimport orgjunitrules ErrorCollector import org sikuli basics Debugimport org sikuli basics Settings import org sikuli script import javaxswing import javatime LocalDateTime import static orgjunit Assert
public class Test01
static Logger logger static ErrorCollector collector static Screen sstatic App prohlizec static boolean run
static System setProperty (log4j configurationFile
log - konfigurace xml)
private String nazevScreenshotu () LocalDateTime l = LocalDateTime now ()
return l getYear () + + l getMonthValue () + + l getDayOfMonth () + + l getHour () + + (l getMinute () lt 10 0 + lgetMinute () l getMinute ()) + + lgetSecond () +
55
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
BeforeClasspublic static void setUpBeforeClass ()
logger = LogManager getLogger ()
Settings OcrTextSearch = trueSettings OcrTextRead = trueDebug setLogger ( logger )Debug setLoggerAll (info)
collector = new ErrorCollector ()s = new Screen ()prohlizec = new App(google - chrome )prohlizec open ()prohlizec focus ()run = true
AfterClasspublic static void tearDownAfterClass ()
JOptionPane showMessageDialog (null Script + dokoncen )
prohlizec close ()
Beforepublic void setUp ()
try swait(png addressBar png 10)sclick(new Pattern (png addressBar png)
targetOffset (100 0))spaste(http okskivzcucz Prevodnik )stype(KeyENTER )swait(png zalozkaPrevodnik png 5)
catch ( Exception e) run = falses capture () save( errors nazevScreenshotu ())logger error(e getMessage ())
56
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Testpublic void testPorovnejText ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)Match m = sfind(png jednotky png)m setTargetOffset (-27 -18)mclick ()s findText ((metr)) click ()sclick(new Pattern (png jednotky png)
targetOffset (-27 18))sfind(pngdmpng) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (10 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testPorovnejObraz ()
if (run) try
sclick(png zalozkaPrevodnik png)swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)sclick(new Pattern (png jednotky png)
targetOffset (-27 -18))sclick(pnginchpng)
57
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
sclick(png tlacitkoPreved png)assertTrue (s exists (png vysledek png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testZkontrolujOdkazObrazekKiv ()
if (run) try
sclick(png logoKiv png)assertTrue (s exists (png zahlaviKiv png) =
null ) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Testpublic void testChyba ()
if (run) try
swait(png tlacitkoPreved png 5)spaste(pngvstuppng 1)
58
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
sclick(new Pattern (png jednotky png)targetOffset (-27 -18))
s findText ((metr)) click ()sclick(png tlacitkoPreved png)String t = sfind(png vystup png) right(
100) text ()assertEquals (100 Double parseDouble (t)
001) catch ( FindFailed | AssertionError e)
s capture () save( errors nazevScreenshotu ())
logger error(e getMessage ())fail(e getMessage ())
else
run = truelogger error(setUp neuspesny )fail(setUp neuspesny )
Koacuted 112 Konfigurace logerultxml version =10 encoding =UTF -8 gtltConfiguration status = WARNgt
ltProperties gtltProperty name = zprava gtdddMMYYYY HHmmss
[ level - logger 1 method ()] - msgnltProperty gt
ltProperty name = souborLog gterrorslogtxtltProperty gt
ltProperties gtltAppenders gt
ltConsole name = obrazovka target = SYSTEM_OUT gtltPatternLayout pattern =$zprava gt
ltConsole gtltFile name = toSouborLog fileName =
$ souborLog append = true immediateFlush =truegtltPatternLayout pattern =$zprava gt
ltFile gt
59
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
ltAppenders gtltLoggers gt
ltRoot level = INFOgtltAppenderRef ref = toSouborLog gt
ltRoot gtltLoggers gt
lt Configuration gt
60
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61
Přiacuteloha BObsah přiloženeacuteho CD
bull 01SrovnaniSkriptovacichNastrojuods ndash vyacutečet naacutestrojů a jejichzaacutekladniacutech vlastnostiacute
bull 02DetailniSrovnaniodt ndash detailniacute srovnaacuteniacute třiacute vybranyacutech naacutestrojů
bull 03DruhyMonkeyTestuodt ndash popis druhů monkey testů
bull 04MultikriteriaacutelniacuteHodnoceniNastrojuods ndash tabulkovyacute soubor ob-sahujiacuteciacute multikriteriaacutelniacute hodnoceniacute třiacute vybranyacutech naacutestrojů ve ktereacutemje možneacute upravit si libovolně vaacutehy kriteacuteriiacute
bull Automatization ndash projekt pro ukaacutezku automatizace činnosti pomociacutenaacutestroje SikuliX
ndash lib ndash knihovny použiteacute v projektundash png ndash obraacutezky podle kteryacutech se SikuliX na obrazovce orientujendash src ndash zdrojoveacute soubory
bull BP ndash text bakalaacuteřskeacute praacutece ve formaacutetu PDF a zdrojoveacute soubory proprogram LATEX
bull GettingToKnowSikuliX ndash projekt se sofistikovanějšiacutemi testy v ja-zyce Java struktura podobnaacute jako u projektu Automatization
bull MonkeyTesting ndash projekt pro ukaacutezku tvorby monkey testů pomociacutenaacutestroje SikuliX struktura podobnaacute jako u projektu Automatization
bull Prevodnik ndash projekt Převodniacutek vytvořenyacute pomociacute jazyka Java FX
bull sikulixsetup-110jar ndash spustitelnyacute soubor pro staženiacute a instalacipotřebnyacutech čaacutestiacute naacutestroje SikuliX
bull Test01sikuli ndash skript vytvořenyacute pomociacute SikuliX-IDE
bull Testing ndash sada testovaciacutech přiacutepadů pro otestovaacuteniacute weboveacute a deskto-poveacute aplikace Převodniacutek struktura podobnaacute jako u projektu Automa-tization
bull TestScenariosxml ndash testovaciacute sceacutenaacuteře exportovaneacute z naacutestroje Test-Link
61