Co se do Squishe nevešlo

posted 11.02.2014

Na pravidelné automatické testy v LMC používáme Squish od Froglogicu. Za poslední roky vytvořili kolegové ze všech týmů solidní infrastrukturu, která vychytává většinu neduhů načítání a zobrazování našich systémů. Vychytat univerzálně asynchronní donačítání obsahu, framy (holt backendy) a další libůstky chvíli trvalo. Postupně pracujeme na stabilizaci a zrychlení jednotlivých běhů. Dost dlouho jsem měl cukání napsat prototyp implementace toho stejného v Seleniu. Po zjištění, na kolik věcí se už myslelo a kolik jich je ošetřeno jsem přesunul energii do jiných projektů. Pokud ale máte Selenium, buďte rádi za následující.

Dokumentace & Stack Overflow

Squish je papírově mocný - zvládne testovat GUI napsané v Javě, WPFku, weby i mobilní aplikace. Má na to jednotné rozhraní, takže umíte-li v jednom, víte jak psát testy pro všechny. Teoreticky to zní krásně, bohužel ale čim více technologií podporují, tím obecnější jsou dokumentace API a tím chudší je nabídka příkladů pro jednotlivé funkce. waitForObject je stěžejní volání pro nalezení prvků na stránce a v dokumentaci jsou k němu dva utopené odstavce. Čitelnost (sice neoficiální) dokumentace pro to samé v Seleniu pro Python je o řád výše.

Chybami se člověk učí a asi nejen já dost často chybami ostatních programátorů. Rozšířenost Webdriveru je znát a na Stack Overflow je skóre 39 000 ku 1 000.

Hledání prvků

Na to, že hledání prvků v DOMu je jedno z nejčastějších volání v testech, Selenium myslelo. Na poddotazy z již nalezeného prvku a možnost použít jak xpath a CSS selektory tak IDčka a názvy elementů jsem si zvykl hodně rychle.
row = driver.find_element_by_css_selector('#list tr[rel="' + id + '"]')
title = row.find_element_by_tag_name("h3").text
link = row.find_element_by_tag_name("a").get_attribute("href")
Oproti tomu Squish má pseudotyp, kterému říká objectOrName. Není to aní CSS, není to ani xpath. Matchuje se jednoduše řada dvojic atributů a hodnot.
{tagName='INPUT' id='r1' name='rg' form='myform' type='radio' value='Radio 1'}
Už před lety přidali podporu xpathu, ten se ale volá úplně jinak než klasické čekání na objekt. Tam kde by se jednotnost rozhrání hodila Squishi chybí, naopak jednotné API pro jednotlivé drivery skoro nikdo nevyužije (jen Froglogic má méně prací s dokumentací).

Paralelizace

Automatické testy jsou pomalé a vždycky budou limitované rychlostí aplikace. Rychlost jednotlivých požadavků se stáhnout dolu nepodaří, paralelní volání ji ale nezpomalí. Pro Webdriver existuje hub, který funguje jako load balancer a zvládné online připojovat a odebírát stroje, na kterých testy běží. Pro Squish nic takového není. Lze jen manuálně vybrat při spouštění testu, na který host a port se test pošle. Tam sedí jedna instance squisherveru, která si s víc než jedním paralelním testem nepočítá. Navíc dva squish servery si neporádí v rámci jednoho přihlášeného uživatele na Windows, tak je hned potřeba počítat se serverovou licencí.

Squish IDE

Na Eclipse jsme si nikdy nezvykl, i šestkové Netbeansy jsem měl radši a dokud nepřišla IDEA a její odvary, radši jsem psal PHP a Python v Sublime Textu. Squish IDE je nástavba pro Eclipse a je jediný editor, ve kterým je možné Squish testy krokovat a debuggovat. První problém je vůběc IDE nakonfigurovat tak, aby testy spouštěl, natož s nějakou specialitkou jako je běh na vzdáleném serveru.

V Seleniu je sice potřeba vytvořit infrastrukturu, která se stará o sesbírání testcasů a jejich reporting (dá se na to využít libovolný unit testovací framework), jakmile je to ale hotové, fungují všechny vývojové a debuggovací nástroje, které pro jazyk, ve kterém píšete, existují.