Nightwatch.js - Selenium JavaScript-tel
Egy új projekt, amelynek segítségével JavaScript utasításokkal vezérelhetjük a Seleniumot
■ H | K | Sze | Cs | P | Szo | V |
---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 1 | 2 |
Többet tud a WebDriverJs-nél?
Egyszerűség
http://theintern.io/
https://github.com/angular/protractor
http://webdriver.io/
http://casperjs.org/
Szerintem mivel mindegyik a Selenium-ot hajtja meg, így komoly különbségek a működésben biztosan nem lesznek. Ami engem megfogott a Nightwatch.js-ben, hogy náluk az egyszerű szintaxis különösen fontos volt. Nem kell olyanokat leírni, hogy:
driver.findElement(webdriver.By.name('btnG')).click();
Elegendő csak annyi, hogyclient.click('button[name=btnG]');
Néhány évvel ezelőtt még fel sem merült benne, hogy Selenium tesztet ne programozók készítsék. Ma már egy HTML-t, CSS-t ismerő embernek gond nélkül oda merném adni a Nightwatch.js-t, minimális tanítás után könnyedén tudná gyártani a teszteket. Ezt érzem én előnynek. Tudásban biztos nincs előnye.
Én a protractort nézegettem
Sokan úgy vannak vele még mindig, hogy nem érdemes UI-t tesztelni, én is emiatt nem foglalkoztam vele. Valahol olvastam még jópár éve, aztán úgy vagyok vele, hogyha munkát lehet megspórolni, akkor az ember általában bólogatni szokott. Nekem a unit test és az integration test fogalmak, amik tiszták. Ha jól tudom az e2e tesztelés arról szól, hogy végigkövetjük az az utat, amit a felhasználó bejárna, az alkalmazásunk használatakor. Pl megvárja, amíg a böngésző betölti a klienst, kitölti az űrlapot, rákattint a gombra, várja a választ, stb... Valahol el tudom fogadni, hogy ilyesmikre szükség van, sőt talán még alapozni is lehet erre a kliens fejlesztésénél, de nem igazán tudom feloldani a konfliktust a ne teszteljük az UI-t, mert nem éri meg az erőfeszítést szabállyal... A másik, ami totál homály, hogy van rengeteg ilyen tesztelési mód, pl functionality test, acceptance test, meg ki tudja még mik. Elég nehéz követni, ha az ember éppen valami mással foglalkozik. Az én olvasatomban ezek mind integrációs teszt kategóriákban tartoznak, de lehet, hogy rosszul látom.
Ami megint egy érdekes kérdés ezzel kapcsolatban, és amibe nemrég belefutottam, hogy hogyan teszteljünk REST API-t? Elég érdekes dolgok jöttek ki ezzel kapcsolatban is, általában az emberek úgy gondolkodnak a REST API-ról, hogy beteszik a tesztekbe az url-eket statikusan, esetleg templatek formájában, és tesztelik, hogy ezeket curl-el hívva azt a választ kapják e, amit vártak. Valahogy nem állt össze a fejekben, hogy a REST köszönőviszonyban sincs pl a SOAP-pal, amit simán lehetne ilyen módon tesztelni. A REST-nél a jó karbantarthatóság miatt eléggé rákoncentrál arra, hogy a kliens ne tartalmazzon alkalmazás logikát, ne ő maga állítsa elő a controllereket a semmiből, hanem a web service által adott absztrakt controllereket használja erre (lásd HATEOAS principle). Ehhez képest az átlag fejlesztő úgy áll a REST API teszteléshez, hogy ezt az egészet figyelmen kívül hagyja. Nyilván ilyenkor ugyanúgy törékenyek lesznek a tesztek, mint a kliensek egy hagyományos AJAX-os webalkalmazásnál. Nekem az a véleményem, hogy a REST API tesztelésénél hasonlóan kellene eljárnunk, mintha automatizált klienst írnánk. Ugyanúgy linkeket kell követnünk. Ilyen szempontból pl egy seleniumhoz hasonló nem HTML, hanem REST-nél használt hypermedia formátumokra specifikus böngésző, illetve teszt platform baromi jó lenne. A REST-el jelenleg az a legnagyobb probléma, hogy szinte egyáltalán nincsenek eszközeink rá. Jó, a másik legnagyobb probléma, hogy a fejlesztők 99%-a egyáltalán nem is érti, hogy miről van szó, kb ugyanúgy gondolnak rá, mint a SOAP-ra, csak más felülettel kivitelezve. Na de ez már egy másik történet...
Na a hosszas mesélés közepette lemaradt a lényeg. Csak azt akartam megkérdezni, hogy szerinted mikor érdemes ilyen jellegű teszteket használni, illetve, hogy megspórolható e az ilyen jellegű tesztelés? Egyáltalán mit tesztelünk egy selenium teszttel?
Főleg intranetes oldalak...
Régebben úgy gondoltam volna, hogy csak az igazán nagy projektek esetén érdemes ezeket az end-to-end teszteket használni, ám most abba bízok, hogyha a teszt írás ideje jelentősen csökken, akkor a kisebb projektek esetén is megtérülhet a használatuk.
Remélem, hogy ugyanúgy lesz majd, ahogy az egységtesztek esetén, az elején még több időt vettek el, ám ma már rutinból írom őket. Az ideálisnak azt tartanám, hogy amikor megyünk az ügyfélhez, akkor előtte legyen már több e2e teszt, amit a prezentáció előtti pillanatokban is tudunk futtatni, hogy nehogy az utolsó pillanatban valamit rosszul töltsük ki, más verzió kerüljön ki stb.
Mi nem tudnánk meglenni
A test suite 1 órán keresztül fut, és közel sem tesztel mindent. El tudod képzelni, hogy egy ekkora kódbázist különböző verziókon keresztül fejleszteni, featureoket egy évvel ezelőtti verziókba merge-elni vagy egy nagy refaktorálást elvégezni milyen kimerítő folyamat és nehéz mindenre odafigyelni. Ilyenkor nagyon jól jön/jött az e2e testing, bár igazak az aggodalmak azzal kapcsolatban, hogy megéri-e vagy sem. Nekünk megéri, több szempontból is (pl. az alkalmazást unit tesztelhetetlen legacy kódszörnyetegek rohasztják belülről).
REST és SOAP témakörben is nagyon esetfüggő, hogy mi jó megoldás. Mi mindkettőt támogatjuk, jmeter-el egész jó teszteket lehet írni bár nem a szívem csücske.
A szuperagilis trendi startup-nak nyilván más a jó mint annak aki nagyvállalati környezetbe fejleszt évek óta elhagyott, outsource-olt, elmozdíthatatlan kliensekkel körbevéve.
A témához csak annyit, hogy szerintem nem éri meg javascript-el b****kodni. Eclipse, JUnit egy klikk és már nézed is mi baj rendesen debuggolva egy normális IDE-ben, semmi szükség kifforatlan javascript devstack bohóckodásra... bár osztályokat kell írni és az ma már nem trendi (legalábbis itt a weblaboron mwahahaha)
Js-ben is lehet szép, jól
Én speciel e2e tesztelést inkább az általad említett kódszörnyek refaktorálására használnám első lépésként. off: Már ha elvállalnék ilyen munkákat - már jó ideje nem teszem, és azóta mestere lettem az ilyen jellegű munkákkal zaklató cégek lerázásának. ;-) Mert ugye teszt nélkül nem lehet refaktorálni, és ahol meg nincsenek osztályok, ott e2e teszten kívül nem igazán lehet mást írni...
Más a cél
Egy Java-s projektnél természetesen felesleges lenne JavaScript-et belekeverni a képbe, ám egy nem Java-s projektnél egyáltalán nem biztos, hogy megéri a Java-t belekeverni, főleg, ha van JavaScript-hez értő a csapatban.
Szerintem igenis érdemes minél több segédeszközt megismerni, majd azt használni, amelyik a legjobban beleillik a környezetbe.
Most az volt a cél, hogy a
Ilyen esetekre a cucumber+capybara mondjuk selenium driverrel(bar annal van gyorsabb) megoldas lehet. A teszternek csak a cucumber szintakszist kell megtanulnia, ami eleg egyszeru. Ezutan o meg tudja irni a "feature"-oket a fejleszto meg majd moge rakja a tobbit.
Máshol is hallottam már, hogy
Ha tenyleg van olyan szemely
önálló teszt írás
Ezzel szemben a Nightwatch.js -sel pont azt sikerült elérni, hogy minimális tanulás után (CSS szelektorok ismerete a legtöbb tesztelőnél megvan) önállóan bárki tud klikkelgetős teszteket gyártani.
Én a BDD-re úgy tekintek, mint előre megírt specifikációra, amit akár az ügyféllel is leegyeztetünk. Ellenben a Selenium tesztek utólag készülnek, ügyfél nélkül, kizárólag belső ellenőrzésre, emiatt nem szükséges a laikusok számára az olvashatóság, illetve minimális scriptelés megengedett.
Egy teszter meg tudja tanulni
Igy nez ki egy feature egyebkent:
Mondjuk a nightwatch szintakszisa inkabb a capybarahoz hasonlit es az tenyleg elony, hogy a js egy elterjedt nyelv, igy relative konnyu betani ra valakit.
Ja elméletben jó terv lenne,
középút
Tehát egyik oldalon van a gherkin féle nagyon szépen olvasható leírás, ám minden egyes sorához kell egy-egy mintaillesztést gyártani. Másik oldalon van a Java-ban írt Selenium tesztek, amihez meg komoly programozói ismeretek szükségesek. Véleményem szerint valahol félúton, kompromisszumos megoldásként jött a Nightwatch.js. Programozói ismeret nélkül is könnyen megtanulható, ám utána gyorsan sorozatban gyárthatunk teszteket. (amúgy biztos vagyok benne, hogy még számtalan hasonló megoldás van, én elsőre ezzel találkoztam, megtetszett, bevált, de biztos van más is)
Később lehet, hogy változni fog a véleményem, de ma nem látom értelmét olyan tesztet készíteni BDD-vel, amit legalább egyszer meg nem mutatnék az ügyfélnek. Ám valószínűleg hülyét is kapna, ha mutatnék neki öt majdnem tök ugyanolyan tesztet, amelyben azt vizsgálom, hogy ha rossz sorrendben hajtom végre a műveleteket, akkor a különféle hibaüzenetek megadják, hogy mit csinálok rosszul. Az ilyen típusú tesztek nyugodtan mehetnek belső használatra, ahol nem szükséges a gherkin féle olvashatóság.
Az ügyfelet szerintem inkább
Szerintem mivel mindegyik a
Azért nem egyszerű egy ilyen felületet összehozni. Nézegettem a protractort, illetve az alatt lévő webdriver-t, és csurig van aszinkron kóddal, promise-ekkel, stb... A protractor próbálja valahogy elfedni ezt a jellegét a dolognak, többé kevésbé sikerrel, pl a jasmine köré tettek egy async wrapper-t, ami elfedi, hogy ténylegesen aszinkron tesztekről és promise-ekről van szó egy-egy expect hívásakor. Ettől függetlenül ja, tényleg nem tökéletes, amit csináltak, nem is igazán értettem, hogy miért jó ennyire túlbonyolítani valamit. Megnéztem a nightwatch-ot, és körülbelül én is ilyennek képzeltem el egy használható teszt rendszert.
Újabb kérdés, hogy mennyivel érdemesebb a seleniumot használni, mint mondjuk egy olyan http klienst, ami eleve automatizált kérésekre lett tervezve, pl phantomjs. karma-phantomjs-launcher?
off: ma úgy látszik ilyen bőbeszédű vagyok...
Phantom.js
Phantom.js-ben például IE
Én ezeket a különbségeket inkább külső keretrendszerekre bíznám, pl jquery... Egyébként én sem foglalkoztam még phantomjs-el, de szeretek tisztában lenni a lehetőségeimmel. Úgy nézem, hogy a selenium ugyanúgy támogatja a phantomjs-t is, szóval ha a sebesség szempont a teszteknél, akkor fejlesztéshez érdemesebb phantomjs-el használni a teszteket, és csak a végén debuggolni a böngészők közti különbségekből adódó hibákat, már ha vannak ilyenek...
bugdemó?
Teljes mértékben...
Demózás
Jó, de hogyan oldható meg a
Van a selenium esetében olyan opció, hogy mutassa, hogy mi folyik a böngészőben tesztelés közben, esetleg még animációs is csináljon róla mondjuk egy mesterséges kurzorral?
külön ablak
A kurzor mozgatása már más kérdés, ott csak egy mesterséges kurzor lehetne. Van olyan, hogy moveToElement utasítás, ez működhet.
Saucelabs
A tesztekről screenshotok, illetve videó is készül (és ahogy nézem, Seleniumot használ), szóval mindenképpen megoldható.
Ja így van, karmának van