+ All Categories
Home > Documents > BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical...

BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical...

Date post: 06-Jul-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
61
Západočeská univerzita v Plzni Fakulta aplikovaných věd Katedra informatiky a výpočetní techniky Bakalářská práce Využití softwarových nástrojů pro přípravu testů grafického uživatelského rozhraní Plzeň 2016 Jaroslav Klaus
Transcript
Page 1: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 2: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 3: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 4: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 5: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 6: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 7: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 8: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 9: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 10: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 11: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 12: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 13: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 14: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 15: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 16: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 17: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 18: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

(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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 19: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

(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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 20: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 21: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 22: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 23: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 24: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 25: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 26: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 27: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 28: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 29: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 30: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 31: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 32: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 33: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 34: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 35: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 36: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 37: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 38: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 39: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 40: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 41: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 42: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 43: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 44: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 45: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 46: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 47: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 48: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 49: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 50: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 51: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 52: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 53: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 54: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 55: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 56: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 57: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 58: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 59: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 60: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD
Page 61: BakalářskápráceAbstract This paper deals with the use of software tools for testing graphical user interface. The main objective was to compare several tools and to choose one

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

  • Uacutevod
  • Testovaacuteniacute softwaru
    • Požadavky
    • Specifikace požadavků na software
    • Kvalita softwaru
      • FURPS
        • Chyba defekt selhaacuteniacute
        • Testovaacuteniacute softwaru
        • Uacuterovně testovaacuteniacute
        • Testovaacuteniacute uživatelskeacuteho rozhraniacute
        • Automatizace testovaacuteniacute
          • Monkey testovaacuteniacute
              • Přehled naacutestrojů
              • Zvoleneacute naacutestroje
                • Jubula
                • SikuliX
                • Robot Framework
                  • Srovnaacuteniacute naacutestrojů
                  • SikuliX
                    • Instalace
                    • Tvorba testů
                    • SikuliX-IDE
                      • Prvniacute skript
                        • Java API
                          • Prvniacute test
                          • Sofistikovanějšiacute testy
                              • Sada ukaacutezkovyacutech testů a jejich sceacutenaacuteřů
                                • Rozděleniacute testů
                                • Statickeacute prvky
                                • Převody
                                • Vymazaacuteniacute
                                • Zjištěneacute chyby
                                  • Chybneacute převody z (na) decimetry
                                  • Chybneacute zaokrouhleniacute
                                  • Převod zaacuteporneacute hodnoty
                                  • Tlačiacutetko Vymaž
                                      • Probleacutemy praacutece se SikuliX
                                        • Rozlišeniacute obrazovky
                                        • Rozměry screenshotů
                                        • Ukazatel myši
                                        • Nespolehliveacute OCR
                                        • Nefunkčnost některyacutech metod třiacuted
                                          • Pozice a velikost okna
                                          • Stav aplikace
                                          • Spuštěniacute aplikace
                                          • Rychlost vykonaacutevanyacutech testů
                                              • Monkey testy
                                                • Hloupaacute opice
                                                • Zpola inteligentniacute opice
                                                • Inteligentniacute opice
                                                • Monkey test pomociacute SikuliX
                                                  • Automatizace naacutestrojem
                                                  • Zaacutevěr
                                                  • Seznam zkratek
                                                  • Literatura
                                                  • Přiacutelohy
                                                    • Přiacuteloha A ndash Sofistikovanějšiacute testy
                                                    • Přiacuteloha B ndash Obsah přiloženeacuteho CD

Recommended