Selenium testování GUI
Co je Selenium IDE Automatické testování aplikace jako černé skříňky Minimální konfigurace Firefox plugin Selenium IDE Viz. tutorial video Náš vlastní google search
Pro koho je Selenium IDE? Pro testery Automatizace testování podle testovacích scénářů Testovací scénáře v jednoduché HTML podobě Pro vývojáře Smoke testy buildovacího procesu (např. Ant skriptů) Integrační testování jako součást nočních buildů Testování Ajax částí aplikace a GUI
Nativní formát testu Jednoduché HTML Srozumitelné i pro nevývojáře <tr> <td>type</td> <td>jusername</td> <td>vjohn</td> </tr> <td>jpassword</td> <td>clickAndWait</td> <td>login</td> <td></td>
Testování více prohlížečů Jeden test lze spustit proti Exploreru Firefoxu
Základní commandy save link=Jdi na seznam label=Hasič Často používané příkazy type click save link=Jdi na seznam clickAndWait – klepne a počká, než se nahraje stránka select – výběr hodnoty z rolovací nabídky <select> label=Hasič assertTextPresent – test skončí, pokud selže verifyTextPresent – test pokračuje dál, i když selže Další commandy i s nápovědou najdete v Selenium IDE* okně Formát commandů: JMENO SELECTOR [HODNOTA] Tlačítko k nezaplacení - Find
Možnosti spouštění testů Ručně Okno firefox pluginu – jeden test Pomocí testrunneru – více testů (testsuite) Automaticky Pomocí ANTu Pomocí jUnit Ostatní jazyky Ruby Python PHP …
Best practices Toto je asi nejdůležitější část prezentace! Provádějte reuse částí testů V jUnit Java metoda, např. public void login() V HTML nelze (jak na to viz. další snímek) Raději vytvářejte hodně malých testů, než málo velkých a složitých testů Testy by měli testovat co nejmenší uživatelský scénář Je snazší vypátrat chybu, pokud mi 4 testy z 50ti existujících selžou, než pokud mi selže 1 test ze 2 existujících. Používejte XPath s uživatelským textem jako selectory Špatně: clickAndWait //table[2]/tr[1]/td[4] Dobře: clickAndWait //td[text() = 'Založit Nový SP'] Výsledkem jsou samopopisné, dobře udržovatelné testy
Kvízová otázka Uvažujme, že máme sadu 10ti Seleniových testů v HTML formátu, login sekvence se na začátku každého testu opakuje Jak by šlo docílit re-use login sekvence v těchto testech? <tr> <td>type</td> <td>jusername</td> <td>vjohn</td> </tr> <td>jpassword</td> <td>clickAndWait</td> <td>//input[@value="Prihlasit se"]</td> <td></td> Možné řešení: Použijte JSP kontejner pro testy a jsp:include <jsp:include page="include/login.jsp"/>
Seskupování testů testsuite.html - HTML soubor, který linkuje více testů <html> <head> <title>Testsuite Example</title> </head> <body> <table cellpadding="1" cellspacing="1" border="1"> <tbody> <tr> <td>Etar tests</td> </tr> </tbody> <tr><td><a href="Login.html">Login</a></td></tr> <tr><td><a href="NovySP.html">Nový SP</a></td></tr> </table> </body> </html>
Úskalí 1 – formuláře Formuláře – Recorder nenahrává odeslání formuláře stisknutím klávesy <Enter> Použijte submitForm(formId) command
Úskalí 2 – práce s iframes Práce s iframes - Recorder nenahrává selectFrame command Nutné ručně přidat selectFrame(frameId) Operace v iframe selectFrame(relative=top)
Úskalí 3 – timeout problém ClickAndWait spadne na timeout Může se stát, pokud odezva aplikace je velmi rychlá Stejný problém i s ostatním XxxAndWait commandy Použijte waitForElementPresent Namísto Použijte <tr> <td>clickAndWait</td> <td>save</td> <td></td> </tr> <td>type</td> <td>name</td> <td>Pavel</td> <td>click</td> <td>waitForElementPresent</td>
Kvízová otázka XPath V aplikaci máme zobrazenou tuto tabulku Potřebujeme klepnout na odkaz Smazat u uživatele Jan Hasič. Při nahrávání v Selenium IDE recorder nahrál tento command: click //tr[3]/td[2]/a Jak nahradit XPath na odkaz Smazat, aby fungoval nezávisle na pořadí řádku s Janem Hasičem v tabulce (a byl srozumitelnější, co se děje)? Click //tr[td[text()='Jan Hasič']]/td[2]/a Jméno Akce Tom Řidič Smazat Jan Hasič
Úskalí 4 – mizení testrunneru Aplikace může následujícím Javascriptem zrušit Selenium testrunner window parent.window.location = 'http://www.seznam.cz'; Řešení – použijte multiWindow = true
Další úskalí Při použití https a neplatném certifikátu se test zastaví na varovném hlášení prohlížeče Buď registrovat certifikát u CA nebo pro testy spustit aplikaci na http Pokud aplikace javascriptem otevře popup okno s názvem _new, recorder nenahraje odpovídající selectWindow _new command Buď v aplikaci používejte vlastní jména (např. mywindow) nebo doplňte do testů po nahrání selectWindow _new command Pokud ve firefox použijete zapamatovanou dříve napsanou hodnotu formuláře (form input field history), recorder to nezaznamená Při nahrávání testu vždy hodnotu ručně pište (nepoužívejte form history)
Jak vnořovat testsuite? Z jedné testsuite nelze zavolat jinou testsuite Řešení - TestSuiteGenerator Z adresářové struktury testů automaticky vytvoří testsuite.html Parametrem volání je root složka s testy
Ukázka z praxe Testy pro přerušení servisního požadavku (projekt etar) Bez účasti dodavatele S účastí dodavatele
Odkazy Selenium homepage Selenium-RC and Continuous Integration Selenium IDE Selenium Remote Control (used by jUnit sel. tests) Selenium-RC and Continuous Integration Ajax testing with Selenium using waitForCondition
Otázky nakonec Nebojte se a ptejte se