Com començar a treballar amb el Behat

El testeig automatitzat és un dels recursos que facilita molt la tasca de desenvolupament i una de les eines que podem triar fer servir amb bona integració amb el Drupal és el Behat. Es tracta d'un framework open source de testing de comportament, és a dir, que prova el web fent-lo servir tal i com ho faria un usuari.

Una de les seves principals fortaleses resideix en la seva legibilitat: s'escriu en llenguatge natural descrivint el comportament que es vol provar, i ens permet comprovar en qualsevol moment si la nostra aplicació es comporta com s'espera.

A Ymbra ens és especialment útil per saber si qualsevol nou canvi que hem introduït al codi fa que hi hagi alguna regresió en la funcionalitat, el que pot passar desapercebut i trigar-se en detectar.

Què necessitem per començar

Per integrar el Behat amb el Drupal és recomanable fer servir la Drupal Extension, una capa d'integració que proporciona definicions de passes per les proves d'escenaris específics de webs desenvolupades amb el Drupal.

Haurem de començar per instal·lar el Behat mitjançant Composer amb la següent comanda:

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

el que crearà a l'arrel del projecte el fitxer composer.json.

I a continuació haurem de crear el fitxer behat.yml on inclourem la nostra configuració 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: ~

Amb la comanda:

    vendor/bin/behat --init

es crearà el fitxer FeatureContext.php on es poden definir les pròpies passes que es voldran executar posteriorment.

Es pot trobar informació detallada sobre el procés d'instal·lació a la documentació de la Drupal Extension.


Com escriure el primer test

El nostre fitxer foo.feature inclourà una funcionalitat que contindrà un o més escenaris segons siguin les nostres necessitats. L'esquema serà el següent:

    Feature: (títol)
      In order to (benefici)
      As a (rol)
      I need to (funcionalitat)

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

A continuació afegirem els escenaris amb la seva descripció, accions a realitzar i resultat esperat.

      Scenario: (títol)
      Given (context)
      When (acció)
      Then (resultat esperat)

Per exemple:

      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
    


A aquest exemple voliem comprovar que un usuari anònim pugui visualitzar un apartat concret, "Publicaciones", que el seu pathauto estigui ben configurat, que s'hagi migrat correctament el contingut per defecte d'un llistat de publicacions creat mitjançant una vista i que aquesta mostri un paginador.

Com es pot veure cada escenari consta d'un conjunt de passes que han de començar per les paraules clau Given, When, Then, But o And.

Per conèixer totes les passes que tenim disponibles podem fer servir la comanda:

    vendor/bin/behat -dl

Al següent exemple complet podem veure com ens és d'utilitat per provar els camps que es mostren en un formulari i la seva validació:

    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. |

Amb el primer escenari volem testejar si quan un usuari anònim signa un formulari determinat la redirecció posterior es realitza correctament i s'actualitza un comptador de signants del formulari.
Amb el segon es desitja comprovar si quan un usuari anònim introdueix dades bancàries errònies a un formulari per fer un donatiu es mostren els missatges d'error esperats. No és necessari executar un pas per la comprovació de cada error, tenim disponible la opció de crear un array de strings per avaluar.

Al primer escenari `@javascript` ens permet obrir un navegador web amb el que a més poder generar captures de pantalla dels errors que es produeixin. Selenium i Phantom.js són les eines més emprades per fer executar les funcionalitats a navegadors reals amb el Behat.

Un cop escrit el nostre test només ens queda executar-lo amb la següent comanda:

    vendor/bin/behat

Si el test s'executa sense errors ens informarà de quants escenaris i passes s'han superat correctament. En cas contrari veurem el nombre de passes que han fallat i de quines es tracta en concret.

Conclusió

El Behat és una eina recomanable per la seva capacitat de fer les proves amigable, i la fàcil comprensió de les proves fa que puguin arribar a ser escrits i mantinguts també per altres perfils professionals a més dels desenvolupadors.

Pot també fer-se servir per mostrar als stakeholders1 del projecte en el que estiguem treballant per tal de que que validin les funcionalitats que desitgen, i comprovar així si tant les parts interessades com els desenvolupadors estan treballant amb la mateixa comprensió del que cal desenvolupar.

Podeu trobar molta més informació detallada per ampliar aquesta introducció a la documentació oficial.

1. Les persones involucrades en el projecte, no necessàriament només el client final, les necessitats dels quals ha de ser tenida en compte