2011. augusztus 26., péntek

Selenium IDE parancsai

A bevezető után ahogy ígértem, a Selenium IDE parancsok áttekintése következik a referencia alapján.

A Selenium IDE által rögzített teszteset Selenium parancsok sorozatából áll, melyek lehetnek akciók, állapot tárolók vagy ellenőrzési feltételek. Amíg az akciók a Selenium IDE által automatikusan rögzítésre kerülnek, addig az állapot tárolókra és az ellenőrzési feltételekre vonatkozó parancsokat a böngészőben egy kívánt elemen, a jobb egérgombos kattintással megjelenő gyorsmenüben van lehetőségünk hozzáadni.

1. Akciók

Az akciók olyan parancsok, melyek az oldal állapotát valamilyen módon megváltoztatják. Minden akcióknak van egy ”AndWait” végződésű változata is melyeket akkor kell használni, amikor az akció végrehajtása egy új oldal betöltését vagy az aktuális frissítését fogja eredményezni.

Művelet Akció Akció, majd várakozás az oldal betöltésére
Kattintás click clickAndWait
Szöveg begépelése type typeAndWait
Elem kiválasztása (pl.:checkbox) select selectAndWait

2. Állapot tárolók

Állapot tárolók használatával lehetőségünk van az oldalon lévő információkat (pl.: szöveg) elmenteni, melyekre később hivatkozhatunk ugyanezen tesztesetnél. Állapot tárolókhoz a store kezdetű parancsokat (pl.: storeText, storeTitle) használhatjuk.

3. Ellenőrzési feltételek

Az ellenőrzési feltételek feladata hogy ellenőrizzék az oldal állapotát, anélkül hogy azt módosítanák. Az ellenőrzési parancsok három csoportba sorolhatók: assert, verify és waitFor kezdetűek.

Assert és a verify használata

Az assert és verify kezdetű parancsok közt az a különbség, hogy hiba esetén az assert használatakor a teljes teszteset futása leáll, míg a verify kezdetű parancsoknál a teszt futása tovább folytatódik, a hiba pedig naplózásra kerül.
Az ellenőrzési parancsokat érdemes logikailag csoportokba szervezni, ahol is először egy assert kezdetű paranccsal ellenőrizzük, hogy a megfelelő oldalon vagyunk-e (pl.:assertTitle) a többi ellenőrzési feltétel pedig verify kezdetű parancs, melyek az oldalon megjelenő mezők helyességét vizsgálják. Tehát ha rossz oldalon vagyunk, akkor felesleges a többi mezőt is ellenőrizni, ha pedig az oldal jó, akkor egy hibás mező esetén a teszt még tovább folytatódhat a hiba kijelzésével.

Ellenőrzési módszerek

Ellenőrizendő feltétel Minta parancsok
Adott szöveg jelen van valahol az oldalon?verifyTextPresent, assertTextPresent
Adott html elem jelen van valahol az oldalon?verifyElementPresent
Adott szöveg, meghatározott helyen jelen van az oldalon?verifyText, verifyNotText, assertText

A pontosabb ellenőrzés érdekében a verifyText parancsot részesítsük előnyben.

Ajaxos oldalak ellenőrzése

Ajaxos alkalmazások tesztelésénél figyelni kell arra, hogy egy ajaxosan előtűnő elem ellenőrzését megelőzően felvegyünk egy olyan parancsot is, mellyel megvárjuk annak megjelenését. A frissülő elemek a teljes oldal újratöltése nélkül kerülnek megjelenítésre, így az akcióknál ismertetett andWait végződésű parancsok nem használhatók. A waitFor kezdetű parancsokat kell használni melyeket az alábbi táblázat foglalja össze.

Működés Minta parancs
Várakozás egy adott szöveg megjelenésére az oldalonwaitForTextPresent
Várakozás egy adott html elem megjelenésére az oldalonwaitForElementPresent
Várakozás egy adott szöveg, adott helyen történő megjelenésérewaitForText

Tehát egy ajaxosan megjelenő elem ellenőrzéséhez először mindig vegyünk fel egy waitFor kezdetű parancsot, ami után felvehetünk további verify kezdetű parancsokat.

A következő bejegyzésemben a Selenium lokátor stratégiáiról fogok blogolni és segítek eldönteni, hogy a JSF alapú alkalmazásokhoz melyiket is válasszuk!

2011. augusztus 16., kedd

Selenium - Bevezetés a webes felületi teszteléshez

Frissítve: 2011.11.04.  

Gyakori, hogy az elkészült webes felületeket az erre szakosodott tesztelő csapat egy előre meghatározott tesztforgatókönyv alapján manuálisan klikkelgeti végig, ahelyett hogy valamilyen automatizmust használnának!

A projekt kezdeti fázisában - ahol még a felület gyakran változik - a manuális felületi tesztelés lehet a célravezetőbb, a későbbiekben azonban mindenféleképpen érdemes elgondolkozni valamilyen automatizált megoldás bevezetésén. Véleményem szerint a Seleniumos tesztek készítése akkor éri meg a leginkább, amikor a felület már nem nagyon módosul, de a mögöttes logika, szolgáltatások vagy a háttér rendszerek fejlesztése még folyamatban van. Seleniumos felületi tesztek készítésével a tesztek bármikor visszajátszhatók akár Hudsonnal integrálva is, így szükség szerint folyamatosan értesülhetünk a tesztjeink lefutási eredményeiről!

A webes felületek automatizált tesztelése azonban nem tekinthető triviálisnak, gondoljunk csak a böngészőkből adódó eltérésekre, vagy az ajaxos alkalmazások újszerű kihívásaira. A következő néhány bejegyzésemben ezt a témakört fogom a Selenium keretrendszer bemutatásával körbejárni és megmutatom, hogyan is kellene újrafelhasználható és eltérő adatokkal is működő webes felületi teszteket létrehozni!


Selenium bevezető

A Selenium, Black Box jellegű integrációs felületi tesztek készítésére ad lehetőséget, ami annyit jelent, hogy az alkalmazás egészét teszteljük anélkül hogy ismernénk annak belső működését. A tesztesetek felvétele a Selenium IDE Firefox plugin segítségével történik, amely automatikusan rögzíti a böngészőben végrehajtott műveleteket. A Selenium parancsokat tartalmazó szkript többek között java forrásként is exportálható, amit némi refaktorálás és adatforrás bekötés után, eltérő környezetekben is használható tesztekké alakíthatunk!


Selenium fogalmak ismertetése

A Selenium elnevezéseit nem mindenhol használják jól, így kezdjük az alapfogalmak áttekintésével:
  • Selenium: A projekt neve.
  • Selenium 1: A Selenium projekt első verziója.
  • Selenium 2: A Selenium projekt második verziója.
  • Selenium Remote Control (RC): A Selenium 1 által használt API.
  • Selenium WebDriver: A Selenium 2 által használt alapértelmezett API.

A következő néhány Selenium-os bejegyzésemben a Selenium projekt 2-es verzióját fogom ismertetni a Selenium Remote Control API használatával, mégpedig azért mert a cikk írásakor a Selenium IDE még nem volt képes a WebDriver API parancsainak problémamentes exportálására. Szerencsére a fejlesztés jó ütemben halad, így már erre sem kell sokáig várni...


Selenium architektúrák rövid áttekintése

A Selenium RC parancsok visszajátszásához szükséges egy Selenium RC Server indítása, amely proxy-ként továbbítja a végrehajtandó műveleteket a böngészőnek. Selenium WebDriver API használatánál erre már nincs szükség, mivel a parancsok - egy gépes környezetben - közvetlenül a böngészőhöz továbbítódnak.



Selenium 2 újdonságai

A Selenium 2 legfőbb újdonságait a WebDriver projekttel történő egyesülés hozta.

  • Letisztultabb API, amit a WebDriver project biztosít. A Selenium RC parancsok Selenium 2-es környezetben való futtatásához a WebDriverBackedSelenium osztályt használhatjuk fel.
  • Beépített IPhone és az Android emulátor, melyek használatával mobil eszközök böngészőjében is futtathatók a tesztek.
  • Pop-up dialógusok bevonása a tesztesetekbe: basic authentication, fájl feltöltés pop-up dialógus.
  • Cross Domain Testing: Tipikusan a Facebook Connect-et használó alkalmazások tesztelése.
  • Amíg a Selenium 1 JavaScript-et használ a böngészőben történő tevékenységek végrehajtásához, addig a Selenium 2 - a WebDriver API felhasználásával – operációs rendszer szintű eseményekkel dolgozik a visszajátszás során, így standalone környezetben nem szükséges a Selenium Proxy Server indítása.

A Selenium lehetőséget ad arra, hogy eltérő böngészők különböző verzióival is letesztelhessük az alkalmazást. Böngésző nélküli tesztelésre is van mód a HtmlUnitDriver használatával, amely gyors teszt futtatásra ad lehetőséget, azonban a JavaScript motorja nem bizonyult megfelelőnek az összetettebb JavaScript könyvtárak használatakor (pl.: Prototype). A probléma valószínűleg a későbbi verziókban javításra kerül. A Selenium által támogatott platformok részletes listája megtalálható itt.


A Selenium-os teszteléshez szükséges eszközök

  • Szükséges böngésző a Selenium IDE kiegészítő használatához.
  • Firefox 3.6 vagy Firefox 4 is telepíthető, azonban későbbi Firefox verziókhoz a cikk írásakor még nem volt stabil verziója az összes felhasznált kiegészítőnek.
  • Firefox plugin, ami lehetővé teszi a böngészőben végrehajtott műveletek (kattintás, gépelés) felvételét, visszajátszását és exportálását. Érdemes a legfrissebb verziót telepíteni!
  • Selenium IDE kiegészítő, amely a rögzített Selenium tesztekhez ad javítási lehetőségeket ill. tippeket.
  • Selenium IDE kiegészítő, amely lehetővé teszi a rögzítet Selenium szkriptek WebDriver alapú exportálását.
  • Selenium IDE kiegészítő, amely a kiválasztott Selenium parancshoz tartozó html elemre, eltérő színezéssel rámutat a böngészőben.
  • Selenium 2 kliens oldali java könyvtár. A dokumentum írásakor a Selenium 2 rc3 (selenium-java-2.0rc3.zip) verziója már probléma nélkül használható volt.


Selenium IDE

A Selenium IDE kiegészítőt, telepítés után a Firefox/Tools/Selenium IDE menü kiválasztásával jeleníthetjük meg. A tesztek rögzítésének indítása ill. leállítása a jobb-fenti piros gombra kattintással történik. Indítás után a böngészőben végrehajtott műveletek (pl.: klikkelés, gépelés) azonnal megjelennek jobb oldali panel table tab-ja alatt. A rögzítés után a teszteset visszajátszható a ’play current test case’ gombra kattintva, melynek a naplója a Log tab-on tekinthető meg. A visszajátszás után a sikeresen végrehajtott parancsok zöld színnel, a végre nem hajtott parancsok pedig piros színnel jelennek meg. A Reference tab-ra klikkelve a táblázatban kiválasztott parancs használatáról és argumentumairól olvashatunk információkat, az Expert tabon pedig tippek és javítási ötletek jelennek meg, amelyeket azonnal elvégezhetünk az inspect, majd fix gombra kattintással.


Ha a toolbar-on bekapcsoljuk a ’HighLight Elements’ opciót, akkor a teszteset visszajátszása során az aktuálisan végrehajtott parancshoz tartozó html elem sárga háttérrel kivillan az oldalon. Hasonlóan, ha a táblázatban kiválasztunk egy sort és ráklikkelünk a target mező melletti Find gombra, akkor a böngészőben a lokátorhoz tartozó mező háttérszíne megváltozik. Ha fordított működésre lenne szükségünk, akkor használjuk az XPathFinder Firefox plugin-t, amivel a böngészőben megjelenő html elemekhez kaphatjuk meg a hozzájuk tartozó XPath kifejezést. Az elkészített tesztesetet a File/Export Test Case As… menüpont alatt többféle formátumban is exportálhatjuk.


Zárszó

A mostani bejegyzésemet leginkább egy bevezető jellegű kedvcsinálónak szántam, remélem elérte a célját! A folytatásban a Selenium parancsok használatáról fogok írni, de addig is egy kis olvasnivaló:


2011. augusztus 6., szombat

FitNesse tesztek indítási lehetőségei

Egy korábbi bejegyzésemben a FitNesse használatát mutattam be egy példán keresztül, a mostani cikkben pedig az elkészített teszt futtatási lehetőségeit fogom ismertetni.

A tesztek indítási módjaiban közös, hogy meg kell adni a típust (suite vagy teszt) valamint az útvonallal specifikált nevet, majd opcionálisan a végrehajtás eredményének kimeneti formátumát és a Fitnesse web-szerver által használt portot.

FitNesse tesztek wiki oldalról történő indítása

A tesztek indításának talán legegyszerűbb módja a wiki oldalról történő futtatás. A FitNesse web-szervert, a FitNesse gyökér könyvtárából indítsuk el a java -jar fitnesse.jar –p 6666 paranccsal, majd keressük ki a futtatni kívánt tesztet vagy suite-ot és kattintsunk a baloldali menüben a suite ill. test gombra. 

Indítás után, a típusnak megfelelően megjelenik egy ?test ill. ?suite paraméter az url-ben, melyek begépelésével a futtatás direkt módon is végrehajtható. Ha a tesztek eredményeit nem a wiki oldalon keresztül, hanem egy meghatározott formátumban szeretnénk elérni, használjuk a format url paramétert a text, xml vagy html értékekkel. pl.: ExampleTestSuite?suite&format=xml

A böngésző címsorában található context-root utáni URL-t, mint útvonallal specifikált nevet használhatjuk fel a suite-hoz tartozó összes teszt (ExampleTestSuite) vagy egy kiválasztott teszt (ExampleTestSuite.ExampleTest) futtatásához a további eseteknél.

FitNesse tesztek indítása parancssorból

A konzolról történő indításhoz a FitNesse gyökérkönyvtárából adjuk ki a java -jar fitnesse.jar -p 6666 -c "ExampleTestSuite?suite&format=xml" -d "/usr/local/Fitnesse" parancsot. A -c opcióval definiálhatjuk a futtatni kívánt tesztet és a kimeneti formátumot, a -d kapcsolóval pedig a munka könyvtárat állíthatjuk be.

FitNesse tesztek indítása Java kódból

A Fitnesse tesztek java kódból történő indításához, az Eclipse/Run Configurations menü alatt a java kódhoz tartozó konfiguráció Arguments tabján, a Working directory résznél adjuk meg a FitNesse munka könyvtár helyét.


A fejlesztőeszköz beállítása után, a tesztek Java kódból történő indításához az alábbi kódrészlet használható fel.
import fitnesse.Arguments;
import fitnesseMain.FitNesseMain
    
    ...
    
    public void testerMethod() throws Exception {
        Arguments arguments = new Arguments();
        arguments.setInstallOnly(false);
        arguments.setOmitUpdates(true);
        arguments.setPort("6666");
        arguments.setCommand("ExampleTestSuite.ExampleTest?test");
        arguments.setRootPath("/usr/local/Fitnesse");
        FitNesseMain.dontExitAfterSingleCommand = true;
        FitNesseMain.launchFitNesse(arguments);
    }
FitNesse tesztek indítása Ant használatával

Az Ant-tal történő futtatást akkor érdemes választani, amikor a FitNesse tesztek indítását a build folyamat részeként, automatizáltan akarjuk végrehajtani. Az alábbi kódrészleten egy ant build fájl tartalma látható, ahol is a start target végzi el a kiválasztott tesztek indítását.
<project basedir="/usr/local/Fitnesse" default="start" name="Test">  
 <path id="classpath">
  <fileset dir="/usr/local/Fitnesse" includes="**/*.jar">
  </fileset>
 </path>   

 <target name="start">        
  <java failonerror="true" fork="true" jar="/usr/local/Fitnesse/fitnesse.jar">       
   <arg value="-p"></arg>      
   <arg value="6666"></arg>
   <arg value="-c"></arg>                
   <arg value="ExampleTestSuite?suite&format=xml"></arg>     
  </java>
 </target> 
</project>
FitNesse tesztek indítása a Hudson CI szerver segítségével

A Hudson ill. Jenkins Continuous Integration szerverek szintén lehetőséget nyújtanak a FitNesse tesztek futtatásához. A folyamatos integráció lényege, hogy a fejlesztők folyamatosan integrálják a munkájukat egy központi szerveren, ahol is a build folyamat után ellenőrzéseknek vetik alá a szoftvert mint terméket. Ilyen ellenőrzések lehetnek a statikus kód ellenőrzések, teszt lefedettség vizsgálatok vagy a FitNesse tesztek futtatása. Az ellenőrzések eredményét a Hudson képes megjeleníteni, így folyamatosan követhetjük a projekt állapotát és szükség szerint időben beavatkozhatunk!

Itt jegyezném meg, hogy a Hudson/Jenkins az egyik kedvenc eszközöm, ezért hamarosan a folyamatos integráció témakörben is fogok blogolni... :)

A rövid áttekintés után térjünk vissza FitNesse tesztek indításához. A Hudson plugin manager oldalon telepítsük fel a FitNesse plugint, majd hozzunk létre egy új jobot a projektnek. A build résznél válasszuk ki az ”Execute Fitnesse tests” opciót, majd a ”Start new Fitnesse instance as part of build”-et bejelölve töltsük ki a mezőket az alábbi ábra szerint:

 
Ahhoz, hogy a FitNesse tesztek lefutási eredményét riportként is megtekinthessük, állítsuk be a FitNesse result fájlt, a ”Post build action” résznél is. Figyeljünk arra, hogy az eredmény fájl útvonalát a Hudson workspace-en belül adjuk meg!


Mentsük el a beállításokat és futtassuk a létrehozott job-ot, majd tekintsük meg a helyes beállításokról tanúskodó konzol naplót.


A FitNesse teszteket sokféleképpen, de mégis hasonló séma alapján indíthatjuk, így megvan arra a lehetőségünk, hogy mindig a felmerült igényekhez legjobban illeszkedő módszert válasszuk!

A következő cikkemben még mindig a tesztelési témakörnél maradok, de már egy másik remek teszteszköz ismertetésére fogok rátérni!