Prova les interaccions JavaScript amb Behat

Seguint la sèrie que va començar la Mercè i les sessions que he donat, volia escriure una mica més sobre el Behat i alguna de les avantatges que he anat aprenent pel camí.

Un dels principals punts pels quals la gent s'interessa pel Behat no és només per la possibilitat de fer servir llenguatge natural per descriure l'aplicació i fer proves, sinó també per la possibilitat que aquests test s'executin sobre un navegador de debò.

Revisarem les peces principals que necessitem per aconseguir una estratègia de testing més àmplia.

Selenium

El fer proves automàtiques sobre navegadors va començar a obtenir popularitat amb una eina anomenada Selenium. Aquesta permetia als desenvolupadors interactuar amb un navegador mitjançant clics i el teclat, per després reproduir aquesta interacció tantes vegades com fos necessari. Selenium va evolucionar per donar lloc a un component anomenat webdriver que defineix un protocol per gestionar navegadors reals obrint d'aquesta forma la porta a l'automatització.

Per què és important això pel Behat? Degut a que Mink, un dels components principals de Behat, pot parlar amb selenium usant un driver.

Integració contínua

Per donar una mica de context: el que volem és poder estar segurs el més sovint possible que l'aplicació es comporta com s’espera. Per aconseguir això, llançar els test de tant en tant no és suficient. Necessitem automatitzar-ho establint un procés que es repeteixi periòdicament. Això vol dir reaccionar als canvis en el repositori de codi i llançar els nostres tests i asseveracions contra aquests. Com hem donat a entendre més amunt necessitarem un navegador de veritat (no un substitut com podria ser l'ús de curl per inspeccionar l'html descarregat) per executar el JavaScript que se serveix juntament amb la pàgina web.

Als nostres portàtils tenim una pantalla i és senzill executar aplicacions gràfiques com un navegador però, en un servidor sense pantalla o entorn gràfic ja és una mica més complicat.

Servidor Selenium

La primera eina que va aparèixer i la primera que vam començar a fer servir va ser Selenium server. Per executar-se correctament necessita xvfb, que simula una pantalla en memòria, el servidor selenium en Java per enviar comandes al navegador i Firefox per a renderitzar i executar les parts JavaScript de la nostra aplicació.

Això és una pila molt gran de dependències i necessita controlar-se molt bé per iniciar els diferents dimonis i finalitzar-los quan hàgim acabat.

PhantomJS

Per simplificar aquesta pila disposem de PhantomJS, una eina que integra aquests tres components: renderitza la pàgina internament (tant si disposa d'un entorn gràfic com si no), entén les ordres de webdriver enviats per Mink (el driver a Behat serà el mateix, selenium2) i dins té un navegador webkit (motor similar a chrome i safari). Això accelera l'execució de les proves degut a que ens hem lliurat de molta complexitat. Fins i tot el pots instal·lar amb Composer!

Recorda que la combinació de Firefox i Selenium és intercanviable amb PhantomJS per poder fer debugging en qualsevol moment degut a que al final no són més que serveis al teu ordinador que escolten en un port.

Etiqueta els escenaris

Canviant el programari que suporta les proves hem guanyat una mica de velocitat però un nombre tan elevat de tests serà lent gairebé per definició. La raó d'això es deu al fet que estem intentant ser el més fidels possible a un escenari real amb una instal·lació Drupal completa i un navegador amb totes les seves característiques.

Per alleujar aquesta situació podem marcar els escenaris Behat que necessiten execució en un navegador només utilitzant l'etiqueta @javascript en la línia anterior al començament de l'escenari. La resta d'escenaris simularan un navegador fals mitjançant curl.

Aquesta és una breu introducció a les eines més populars per automatitzar el procés i com treballen juntes. Tenim intenció de continuar aquesta sèrie demostrant configuracions específiques i com les fem servir en els nostres desenvolupaments del dia a dia. Manteniu-vos atents.