Prueba las interacciones JavaScript con Behat

Siguiendo con la serie que comenzó Mercè y las sesiones que he dado quería escribir un poco más acerca de Behat y alguna de las ventajas que he ido aprendiendo por el camino.

Uno de los principales puntos por los que la gente se interesa en Behat no es sólo por la posibilidad de usar lenguaje natural para describir y hacer pruebas sobre la aplicación sino también por la posibilidad de que esos tests se ejecuten sobre un navegador de verdad.

Vamos a revisar las piezas principales que necesitamos para lograr una estrategia de testing más amplia.

Selenium

Hacer pruebas automáticas sobre navegadores comenzó a obtener popularidad con una herramienta llamada Selenium, ésta permitía a los desarrolladores interactuar con un navegador usando clicks y pulsaciones de tecla para después reproducir esa interacción tantas veces como fuese necesario. Selenium evolucionó para dar lugar a un componente llamado webdriver que define un protocolo para manejar navegadores reales abriendo de esta manera la puerta a la automatización.

¿Por qué es esto relevante para Behat? Debido a que Mink, uno de los componentes principales de Behat puede hablar con selenium usando un driver.

Integración continua

Para dar un poco de contexto: lo que normalmente se pretende es poder estar seguros muy a menudo de que la aplicación se comporta como debe. Para conseguir ésto, lanzar los test de vez en cuando no es suficiente. Necesitamos automatizar el lanzamiento estableciendo un proceso que se repita periódicamente. Ésto significa reaccionar a los cambios que ocurren en el repositorio de código y lanzar entonces nuestros tests y aseveraciones contra esos cambios. Cómo damos a entender más arriba, vamos a necesitar un navegador de verdad (no un sustituto como podría ser el uso de curl para inspeccionar el html descargado) para ejecutar el JavaScript que se sirve junto con la página web.

En nuestros portátiles tenemos una pantalla y es sencillo ejecutar aplicaciones gráficas como un navegador pero en un servidor sin pantalla o entorno gráfico es un poco más complicado.

Servidor Selenium

Una de las primeras herramientas que aparecieron y la primera que nosotros empezamos a usar fue Selenium server. Para ejecutarse correctamente necesita xvfb, que simula una pantalla en memoria, el servidor selenium en java para mandar comandos al navegador y Firefox para renderizar y ejecutar las partes JavaScript de nuestra aplicación.

Este hecho conlleva una pila muy grande de dependencias y por ello necesita controlarse muy bien para poder iniciar los distintos demonios y finalizarlos cuando hayamos terminado.

PhantomJS

Para simplificar esta pila disponemos de PhantomJS, una herramienta que integra estos tres componentes: renderiza la página internamente (da igual si dispone de un entorno gráfico), entiende los comandos de webdriver enviados por Mink (el driver en Behat será el mismo, selenium2) y dentro tiene un navegador webkit (motor similar a Chrome y Safari). Ésto acelera la ejecución de las pruebas debido a que nos hemos librado de mucha complejidad. ¡Incluso lo puedes instalar con Composer!

Recuerda que la combinación de Firefox y Selenium es intercambiable con PhantomJS para poder hacer debugging en cualquier momento debido a que al final no son más que servicios en tu ordenador que escuchan en un puerto.

Etiqueta los escenarios

Cambiando el software que soporta las pruebas hemos ganado algo de velocidad; pero igualmente semejante nivel de tests será lento casi por definición. La razón de ésto se debe a que estamos intentando ser lo más fieles posible a un escenario real con una instalación Drupal completa y un navegador con todas sus características.

Para aliviar esta situación podemos marcar únicamente los escenarios Behat que necesiten ejecutarse en un navegador usando la etiqueta @javascript en la línea anterior al comienzo del escenario. El resto de escenarios simularán un navegador falso mediante curl mucho más ligero y rápido.

Ésta es una breve introducción a las herramientas más populares para automatizar el proceso y cómo trabajan juntas. Nuestra intención es continuar esta serie demostrando configuraciones específicas y cómo lo usamos en nuestros desarrollos del día a día. Manteneos atentos.