Zombie.js: insanely fast, full-stack, headless testing in Node.js

Poetro: Zombie.js: insanely fast, full-stack, headless #testing in #nodejs - a dream come true(?) - [Twitter - Poetro]

Ez egy érdekes próbálkozás. Több ismert és használt eszközt gyúr egy teljesen új eszközbe. Még akár működőképes is lehet.

A lényeg: vesszük a Node.js rendszert, hozzá a JSDom nevű modult, amiről a weblaboros Node.js alapok II. cikkem második felében írtam, és egybegyúrja egy tesztelési keretrendszerbe.

Ahogy erről a pár napja született bejegyzésben írnak egy igencsak rugalmas ugyanakkor gyors rendszerről van szó. Szerintem még nem vetekszik a böngészőben futtatott kóddal, bár mivel nincs szükség a megjelenítésre még akár igaz is lehet a dolog, elvégre a böngészők a futásuk nagy részében a megjelenítéssel foglalkoznak, és nem a JavaScript kód futtatásával. Ezt sajnos most még nem tudom letesztelni, de ha majd lesz időm és energiám akkor talán össze fogom hasonlítani a kettőt.

A kód letölthető a Github-ról is, bár inkább ajánlott npm-ből telepíteni. Dokumentációt a projekt oldalán találunk. Telepítés után a tesztelés már közel gyerekjáték:

var zombie = require("zombie");
var assert = require("assert");

// Betöltjük az oldalt localhost-ról
zombie.visit("http://localhost:3000/", function (err, browser) {
  if (!err) {
    // Az oldal már be van töltve

    // Kitöltjük az email és password mezőket majd elküldjük a form-ot.
    browser.
      fill("email", "zombie@underworld.dead").
      fill("password", "eat-the-living").
      pressButton("Sign Me Up!", function(err, browser) {
        // Form elküldve, az új oldal betöltődött.
        assert.equal(browser.text("title"), "Welcome To Brains Depot");
      });
  }
});

Természetesen van lehetőség még pár kisebb részlet megadására is, mint például a User-Agent megadása, illetve, hogy a HTML-ben levő JavaScript kód lefusson-e.

A Zombie.js a Shizzle.js JavaScript motort használja a DOM-ban való keresésre, tehát (szinte) minden amit jQuery-ben megtehetünk kiválasztásra, az itt is működni fog. Például:

// Megnézzük, hogy biztosan létezik-e `brains` azonosítójú (id) elem.
assert.ok(browser.querySelector("#brains"));

// A `body` elemnek kell hogy legyen két `hand` osztályú eleme.
assert.equal(browser.body.querySelectorAll(".hand").length, 2);

Ez leginkább az újabb böngészők querySelector és querySelectorAll képességére hajaz, bár a kettő nem ekvivalens.

Az űrlapoknak és linkeknek külön figyelmet szentel a modul, rengeteg segédfüggvénnyel könnyítve meg az elemek kitöltését, és a velük végzett interakciót. És ezen interakciók eseményeket váltanak ki, amit szintén tesztelni tudunk. Például ha jQuery kódot tesztelünk, a Zombie.js-t kérhetjük, hogy szimuláljon egy link kattintást, és ekkor a jQuery-vel rárakott eseménykezelőnk szintén le fog futni, aminek a működését szintén tesztelni tudjuk.

Amint látható, egy igencsak összetett modullal van dolgunk, és amennyiben a tesztelésünk során nem támaszkodunk az elemek méretére ( width , height , margin , padding ), és elhelyezkedésére ( offset ) akkor tökéletes társ lehet a tesztelésben. Sajnos mivel nincs megjelenítő réteg, ezért az előbb említett értékek teljesen irrelevánsak, és valószínűleg 0 -t vagy valami más teljesen használhatatlan értéket adnak vissza. További dokumentációval az API oldal szolgál.

comments powered by Disqus