Cómo empezar a trabajar con Behat

El testeo automatizado es uno de los recursos que facilita mucho la tarea de desarrollo y una de las herramientas que podemos elegir usar con una buena integración con Drupal es Behat. Se trata de un framework open source de testing comportamental, es decir, que prueba la web usándola tal y como lo haría un usuario.

Una de sus principales fortalezas reside en su legibilidad: se escribe en lenguaje natural describiendo el comportamiento que se quiere probar, y nos permite comprobar en cualquier momento si nuestra aplicación se comporta como se espera.

En Ymbra nos resulta especialmente útil para saber si cualquier nuevo cambio que hemos introducido en el código produce alguna regresión en la funcionalidad, lo que puede pasar fácilmente desapercibido y tardarse en detectar.

Qué necesitamos para empezar

Para integrar Behat con Drupal es recomendable usar Drupal Extension, una capa de integración que proporciona definiciones de pasos para las pruebas de escenarios específicos que podemos encontrar en webs desarolladas con Drupal.

Empezaremos instalando Behat mediante Composer con el siguiente comando:

php composer.phar require --dev drupal/drupal-extension=~3.1

que creará en la raíz del proyecto el fichero composer.json

Y a continuación crearemos el fichero behat.yml , en el que incluiremos nuestra configuración básica:

    default:
        suites:
        default:
            contexts:
              - Drupal\DrupalExtension\Context\DrupalContext
    extensions:
      Behat\MinkExtension:
        goutte: ~
        base_url: http://example.org/  # Replace with your site's URL
      Drupal\DrupalExtension:
        blackbox: ~

Con el comando:

    vendor/bin/behat --init

se creará el fichero FeatureContext.php , en el que es posible definir los propios pasos a ejecutar posteriormente.

Es posible encontrar información detallada sobre el proceso de instalación en la documentación de Drupal Extension.

Cómo escribir el primer test

Nuestro fichero foo.feature incluirá una funcionalidad que contendrá uno o más escenarios según sean nuestras necesidades. El esquema a seguir será el siguiente:

    Feature: (título)
      In order to (beneficio)
      As a (rol)
      I need to (funcionalidad) 

Por ejemplo:
      Feature: Test Publications
        In order to see interesting publications
        As a visitor
        I need to see a page to view them

A continuación añadiremos los escenarios con su descripción, acciones a realizar y resultado esperado.

      Scenario: (título)
      Given (contexto)
      When (acción)
      Then (resultado esperado)

Por ejemplo:

      Scenario: Publications list
      Given I am an anonymous user
      And I am on "/"
      When I click "Publicaciones"
      Then the url should match "actualidad/publicaciones$"
      And I see the heading "Publicaciones"
      # Eight publications.
      And I should see 8 ".view-publications .item-list > li" elements
      # There is a pager.
      And I should see a ".pager" element
    


En este ejemplo queremos comprobar que un usuario anónimo pueda visualizar un apartado concreto, "Publicaciones", que su pathauto esté bien configurado, que se haya migrado correctamente el contenido por defecto de un listado de publicaciones creado a través de una vista y que esta muestre un paginador.

Como se puede ver, cada escenario consta de un conjunto de pasos que deben empezar por una de las palabras clave  Given, When, Then, But o And.

Para conocer todos los pasos que tenemos disponibles podemos usar el comando:

    vendor/bin/behat -dl

En el siguiente ejemplo completo podemos ver cómo nos es de utilidad para probar los campos que se muestran en un formulario y su validación.


    Feature: Test fundraising forms
      In order to participate in the company cause.
      As a visitor
      I need to see and send a form with my data.

      @api @javascript
      Scenario: Visit a form and check the count.
      Given I am an anonymous user
      And I am on "/colabora"
      Then I should see the text "¡Ya somos 100 firmantes!"
      And I fill in "Nombre" with "Juan"
      And I fill in "Primer Apellido" with "Perez"
      And I fill in "Población" with "Villarriba del rio"
      And I select "BADAJOZ" from "Província"
      Given I press "Enviar" in the content region
      And I go to "/colabora"
      Then I should see the text "¡Ya somos 101 firmantes!"

      @api
      Scenario: Visit a form and check the display and validations after introducing invalid data.
      Given I am an anonymous user
      And I am on "/donativo"

      # Introducing an invalid bank account
      When I fill in "IBAN" with "ES18"
      When I fill in "Entidad" with "0049"
      When I fill in "Oficina" with "15000"
      When I fill in "DC" with "ab"
      When I fill in "Cuenta" with "2710151321"

      When I press the "Haz un donativo" button

      Then I should see the following error messages:
        | error messages             |
        | El campo DC debe ser numérico. |
        | El campo Oficina debe contener exactamente 4 dígitos, "15000" tiene 5 dígitos. |
        | El IBAN no es válido. |

Con el primer escenario queremos testear si cuando un usuario anónimo acepta un formulario determinado la redirección posterior se realiza correctamente y se actualiza un contador de firmantes del formulario.

Con el segundo queremos comprobar si cuando un usuario anónimo introduce datos bancarios erroneos en un formulario para hacer un donativo se muestran los mensajes de error esperados. No es necesario ejecutar un paso para la comprobación de cada uno de los errores, tenemos disponible la opción de crear un array de strings para que todos ellos sean evaluados.

En el primer escenario @javascript nos permite abrir un navegador web con el que además poder generar capturas de pantalla de los errores que se produzcan. Selenium y Phantom.js son las herramientas más utilizadas para ejecutar las funcionalidades en navegadores reales con Behat.

Una vez escrito nuestro test sólo nos queda ejecutarlo con el siguiente comando:

    vendor/bin/behat

Si el test se ejecuta sin errores nos informará de cuántos escenarios y pasos se han superado correctamente. En caso contrario veremos el número de pasos que han fallado y de cuáles en concreto se trata.

Conclusión

Behat es una herramienta recomendable por su capacidad de hacer las pruebas amigables, y la facil comprensión de las pruebas hace que puedan llegar a ser escritos y mantenidos también por otros perfiles profesionales además de los desarrolladores.

Puede también usarse para mostrar a los stakeholders1 del proyecto en el que estemos trabajando para que validen las funcionalidades que desean, y comprobar así si tanto las partes interesadas como los desarrolladores están trabajando con la misma comprensión sobre qué es necesario desarrollar.

Es posible encontrar mucha más información detallada para ampliar esta introducción en la documentación oficial.

1. Las personas involucradas en el proyecto, no necesariamente sólo el cliente final, las necesidades de los cuales deben ser tenidas en cuenta.