V tejto časti sa zameriam na použitie WebTest v teórii a praxi. Spomeniem zopár doporučení autorov WebTest-u a popíšem rôzne spôsoby nasadenia testov v praxi. Keďže každá aplikácia je „živý organizmus“, aj testovacie skripty na testovanie jej funkčnosti musia „žiť“ spolu s ňou.
Canoo WebTest – ako písať udržiavateľné testy [teória]
Pred začiatkom vytvárania testovacej infraštruktúry je dobré pamätať na nasledujúce doporučenia, ktoré vám umožnia ľahšiu údržbu testovacích skriptov v budúcnosti.
1. Špecifikujte, čo očakávate od testu, zadajte ciele testu
- <clickLink label=”Einkaufskorb”/> ?
- <clickLink label=”Ajax”/> ?
- <clickLink xpath=”//*[text() = ‘Top Angebot’]//a”/> ?
- <clickLink xpath=”//*[text() = ‘6.60’]/following-sibling::a]”/> ?
Každý z uvedených krokov WebTestu klikne na link, ale každý z týchto krokov testuje inú funkcionalitu. Linka „Einkaufskorb“ – zobrazí obsah nákupného košíka, „Ajax“ zase zobrazí obrázok tovaru, atď. Je preto potrebné pred začiatkom určiť, čo očakávame od jednotlivých kliknutí testovacieho robota na linky. Od kliknutia na „Nákupný košík“ budeme zrejme očakávať zobrazenie položiek, ktoré doň boli vložené predtým, od kliknutia na „Ajax“ zasa očakávame zobrazenie obrázka tovaru vo novom okne okne browsera.
2. Rozlišujte medzi normálnym a chybovým správaním sa aplikácie
Pri webových aplikáciách je niekedy zložité povedať, čo je normálne a čo chybové správanie. Ak napríklad portál pre výpočet ceny poistného nesprávne vypočíta poistné pre dieťa do 5 rokov – je to chyba, rovnako, ako situácia, keď pod náporom veľa požiadaviek generovaných počas stres-testov „spadne“ celý server. Je však potrebné rozlišovať medzi oboma popísanými prípadmi. V mojej praxi sa osvedčil spôsob, kedy sme do každej, nie chybovej stránky vkladali neviditeľný text, napríklad „page OK“ a po každom submite na server sme kontrolovali v jeho odpovedi existenciu tohto textu [verifyText]. Samozrejme, chybové stránky tento text neobsahovali. Odhalenie chybového správania aplikácie bolo preto jednoduchšie.
3. Pri písaní testovacích skriptov používajte pravidlá softvérového inžinierstva
Pri písanie testovacích skriptov využívajte tzv. štruktúrované testy, v ktorých používajte:
- property súbory
- XML-entity
- Ant-makrá
- Vlastné prispôsobenie testov
- Jazyk Groovy na prispôsobenie a tvorbu vlastných,špecifických testovacích krokov
Na tvorbu aj v budúcnosti udržateľných testov je nevyhnutné rozumné použitie jazyka XPath. Ako príklad dobrého a zlého spôsobu použitia XPath môžu slúžiť nasledujúce príklady:
správne: //*[@id=’total’]
nesprávne: /html/body/div[2]/table[3]/tbody/tr[6]/td[4]
Absolútna XPath [/html/body/div[2]/table[3]/tbody/tr[6]/td[4]] môže totiž pri budúcich zmenách dizajnu stránok spôsobovať úplnú nefunkčnosť testov a bude zákonite viesť k nutnosti úprav testovacích skriptov.
Canoo WebTest – ako písať udržiavateľné testy [prax]
Využívanie property a property-súborov zabezpečí vysokú flexibilitu testov. Uvedený testovací skript používa ANT-premenné na špecifikáciu rôznych url a názvov buttonov pre rôzne jazykové mutácie vyhľadávača Google.
google.xml:
<project name= "example" default= "test" > <target name= "test" > <webtest name= "is 'Webtest' Google's top result" > <steps> <invoke url= "${startUrl}" /> <verifyTitle text= "Google" /> <setInputField name= "q" value= "WebTest" /> <clickButton label= "${luckyButton}" /> <verifyTitle text= "Canoo WebTestHomepage" /> </steps> </webtest> </target> </project>
de.properties:
startUrl=http://www.google.de/de luckyButton=Auf gut Glück!
fr.properties:
startUrl=http://www.google.fr/fr luckyButton=J'ai de la chance
sk.properties:
startUrl= http://www.google.sk/ luckyButton=Skúsim šťastie
štart testu:
<ant antfile="google.xml"> <property file="sk.properties"> </ant>
Využívajte XML-entity, alebo ANT-makrá pre spoločné bloky testov.
MyTest.xml:
<!ENTITY goToLoginPage SYSTEM "../../includes/gotologin.xml"> <project> .... <steps> &goToLoginPage; ... </steps> ... </project>
gotologin.xml:
<group description="go to login"> <invoke url="http://mysite.com"/> <verifyTitle text="My great Web Site"/> <clickLink label="login"/> <verifyText text="Restricted area"/> </group>
Využitie makra, jeho definícia …
... <macrodef name="doLogin"/> <attribute name="login"/> <attribute name="password"/> <sequential> &goToLoginPage; <setInputField forLabel="Login" value="@{login}"/> <setInputField forLabel="Password" value="@{password}"/> <verifyText text="Hello .*\. Welcome to the restricted area" regex="true"/> <sequential> </macrodef> ...
… a použitie
.... <steps> <doLogin login="canoo" password="webtest"/> ... </steps> ...
Ako príklad vlastného prispôsobenia web-testov uvediem možnosť znovupoužiteľnosti testovacieho kódu. Prvý príklad ukazuje síce plne funkčný test navigačných liniek na stránke, je však na príliš nízkej úrovni zovšeobecnenia a jeho znovupoužiteľnosť preto nie je možná.
Navigácia na stránke:
Home > StressTest > SmokeTest
test navigácie: ... <verifyXPath xpath="//*[@id='navPath1']” text="Home"/> <verifyXPath xpath="//*[@id='navPath2']” text="StressTest"/> <verifyXPath xpath="//*[@id='navPath3']” text="SmokeTest"/> ...
Použitie doplneného kódu s makrom umožní jeho všeobecné použitia aj na iných miestach testovacích skriptov:
... <macrodef name="verifyNavPath"/> <attribute name="level1"/> <attribute name="level2"/> <attribute name="level3"/> <sequential> <verifyXPath xpath="//*[@id='navPath1']” text="@{level1}"/> <verifyXPath xpath="//*[@id='navPath2']” text="@{level2}"/> <verifyXPath xpath="//*[@id='navPath3']” text="@{level3}"/> </sequential> </macrodef> ... <verifyNavPath level1="Home" level2="StressTest" level3="SmokeTest"/> ...
Použitie jazyka Groovy na prispôsobenie a tvorbu vlastných testovacích krokov si predvedieme na nasledovných ukážkach. Groovy je skriptovací jazyk, ktorý sa vykonáva ako Java Byte Code. Nakoľko je WebTest obvyklý ANT-task a Groovy implementuje AntBuilder, pomocou tejto technológie je možné vykonávanie Groovy skriptov vrámci WebTestu.
Navigácia na stránke:
Povinné ručení > Povinné ručení 2008
Groovy skript, ktorý definuje nový testovací krok [verifyNavPath]
<groovyScript> <![CDATA[ class VerifyNavigationPath extends com.canoo.webtest.steps.Step { String level1, level2, level3, level4 void doExecute() { def ant = new AntBuilder(project) def levels = [0, level1, level2, level3, level4] for (i in 1..<levels.size()) { if (levels[i]) ant.verifyXPath(xpath: "//a[${i}]/text()", text: levels[i], description: "Verify level ${i}") } } } project.addTaskDefinition('verifyNavPath', VerifyNavigationPath) ]]> </groovyScript>
Použitie Groovy [verifyNavPath] vrámci Webtestu
<target name="test_uses_groovy"> &definition; <testSpec name="test_uses_groovy"> &config; <steps> <doLogin/> <echo message="MTPL"/> <clickLink label="POVINNÉ RUČENÍ"/> <clickLink label="Povinné ručení 2013"/> <verifyNavPath level1="Povinné ručení" level2="Povinné ručení 2008"/> <echo message="Test OK"/> </steps> </testSpec> </target>
Výsledok testu [test_uses_groovy]:
Ďalším dobrým príkladom využitia jazyka Groovy vrámci Webtest-u je jeho využitie na špecifické testy, nedosiahnuteľné štandardnými prostriedkami Canoo WebTest-u. Nasledujúci skript testuje správnosť zotriedenia výsledkov kalkulácie. Predpokladá sa vzostupné zotriedenie. V princípe sa načítajú čísla zo zobrazenej tabuľky, ktoré sa presortujú pomocou Groovy a oba vektory sa následne porovnajú.
<clickButton label="Pokračovat >>"/> <echo message="groovy nested sort test ..."/> <groovy description="test table sorted"> import com.canoo.webtest.engine.StepFailedException as SFE def table = step.context.currentResponse.getHtmlElementById('quotes_diagram') def tds = table.getByXPath('tbody/tr[position()>2]/td[5]') def texts = tds*.asText() def sorted = new ArrayList(texts).sort() if (sorted != texts) throw new SFE("Nespravne sortovanie!", "$sorted", "$texts") </groovy> echo message="Test OK"/>