Testováním webových aplikací se zabývám už poměrně dlouho a přijde mi, že integrační testy v podobě Selenia jsou mnohem důležitější, než jednotkové testy JavaScriptu nebo backendu. V různých knihách a článcích se píše o tom, že pokud není praxe, ať se testuje dle toho, co danému programátorovi přijde vhodné. Tím se získá praxe a najde se ten cit pro rozhodování, jaké testy napsat přednostně a čím se nemá smysl zabývat.
Také jsem tak začínal a cit si vybudoval. I když, stále se mám co učit. Dnes už ale vím, že to není zrovna nejlepší poučka. Minimálně co se týče webových aplikací. Tam už vím, že nejlepší je sáhnout prvně po Seleniu. Důved je velmi prostý – jednotkové testy, jak JavaScriptu, tak backendu (ať už je to jakýkoliv jazyk), otestují jen nějakou tu jednotku. Řekne to programátorovi „hele, tenhle kus kódu je správný. Jestli ale náhodou šablona očekává něco jiného a nezobrazí tlačítko, na kterém to je závislé… to už nevím. Ověř si sám.“ nebo tak nějak.
Tohle však testy bohužel neřeknou. Odpoví jen stručné „OK“. Jakmile tuto odpověď uvidí programátor, jde radostně nasadit na betu, oznámí uživatelům, že mohou testovat, a ejhle. Ona tam je chyba v šabloně (nebo v čemkoliv jiném, co už jednotkové testy nepodchytí) a programátor musí po víkendu zjišťovat, cože to v pátek dělal a cože to musí opravit.
Neříkám však, že ostatní testy nejsou dobré. Taky mi odhalili spoustu chyb, Selenium však jednoznačně vede.
To je tedy tip číslo jedna – u webovek se zaměřit více na Selenium.
V naší aplikaci v práci mi hodně vadilo, že tam máme spoustu chyb v JavaScriptu. Webmasteři se u nás ještě do nedávna střídali jeden za druhým, každý si to dělal po svém a nikoho nezajímalo, co tam je a co tam bude. Dnešní situace je už dobrá a neustále se zlepšuje, bylo mi to ale málo a napadlo mne do našich Selenium testů přidat kontrolu JavaScriptových chyb. Do stránky jsem přidal kus JS:
<script type="text/javascript">
window.jsErrors = [];
window. function(errorMessage) {
window.jsErrors[window.jsErrors.length] = errorMessage;
}
</script>
a v Selenium (po každém testu, v tearDown
) přečetl obsah proměnné
jsErrors
. Spustil to a… nalézalo to jednu chybu za druhou. Tady className
neexistuje, tajhle null
nemá atribut getElementsByTagName
apod. Vlastně
ještě dnes to nalézá takové chyby díky tipu číslo tři, o tom ale až za chvíli.
Úprava mě stála asi hodinku se vším všudy a dostal jsem mocnou zbraň proti bugům v JavaScriptu. Stačí aby se na něco opomnělo a testy zařvou. Druhý tip je myslím jasný – přidat do Selenia podporu na hledání JavaScriptových chyb.
Je tedy pravda, že takhle selžou testy, které ve skutečnosti prošly. „Jen“ nastala nějaká drobnost v JavaScriptu. Já na to odpovím: nezájem. Je tam chyba? Je. Opravit.
Říkal jsem, že nám tu testy stále oznamují různé chyby v JavaScriptu díky třetímu tipu. Tento tip zní: fuzzy testování.
Zmíněná aplikace je velmi obrovská a testy se začaly psát teprve někdy před rokem a půl. Stále máme spoustu nepokrytého místa, které se zpětně těžce vyplňuje (nelze se vybodnout na všechny známé bugy a feature requesty, na měsíc se zavřít ve sklepě a dopsat všechny testy). To mě pochopitelně trápilo a vyřešil jsem tento problém alespoň fuzzy testováním. Během chvilky jsem napsal primitivní algoritmus na náhodné proklíkání webové aplikace.
Neočekával jsem, že to něco pořádně najde, ale světe div se… ono to našlo hned chybu na dvacátý náhodný klik. Klik, který by neudělal žádný programátor (protože ví, kam klikat nemá), ale ani tester či uživatel. Tedy, věřím, že to někdo už udělal, jen se nenamáhal s reportem. Fuzzy testování jsem zatím nechal v primitivní podobě jak jsem to poprvé napsal a stále to nachází různé fatální chyby, které měly skončit jen chybovou hláškou. Někdo by mohl konstatovat, že to je drobnost, nic kritického. Uživatel má však opačný názor.
Minimálně v našem případě to hodně pomáhá s najitím chyb v JavaScriptu různě v aplikaci, kam se Selenium testy sami od sebe jen tak nepodívají.
Zbývá poslední tip. Selenium je takové neohrabané. Hodně mi vadil styl použití. Sice používám webdriver (Selenium 2), což je lepší, než předchozí verze, ale stále to není ono. Takže jsem napsal wrapper, který práci se Seleniem ulehčí. Kód jsem vystavil volně na GitHubu a ještě mám nějaké plány na zlepšení než to převedu do stable verze. Každopádně už nyní to používají dvě aplikace. Více zde: https://github.com/horejsek/python-webdriverwrapper. (Jedná se o Python.)
Pokud bych dnes začínal nový projekt, s těmito testy bych začal.