BDD y Behat Ricardo Sanz @sanzante tunic en d.o [email protected] @metadrop Behavior Driven Development • Basado originalmente en TDD • Permite escribir tests en lenguaje natural comprensible por desarrolladores y usuarios • Centrado en historias de usuario Historias de usuario • Describen el comportamiento esperado • Compuestas por título, descripción y escenarios. • Los escenarios son cada caso particular, compuestos por precondiciones, eventos y resultados esperados Behat • Permite trabajar con BDD en entornos PHP • Inspirado en Cucumber, BDD para Ruby • Requiere PHP 5.3.1 Componentes básicos de Behat • Los tests (historias de usuario) se escriben usando Gherkin • Usa Mink para simular el navegador atacando a la aplicación web Behat es pegamento: lee Gherkin y ejecuta los pasos de los escenarios usando Mink. Gherkin • Lenguaje para definir tests • Las historias de usuario las llama features • Cada fichero .feature contiene una historia de usuario, que contendrá uno o más escenarios • Los escenarios se componen de pasos (steps) Una feature Título Feature: Users login In order to have users in my web app Descripción As a user I must be able to be recognized by web app. Scenario: Normal login Given I am an anonymous user Escenario 1 When I go to login URL And I fill username with 'username' And I fill password with 'password' And I press 'Login!' Then I must be a logged user And I must be at user page Escenario 2 Scenario: One access link login ... Steps Steps • Given: describen precondiciones Ponen el sistema en un estado conocido • When: indican una acción o evento • Given: describen estados esperados Realizan una transición del estado actual Examinan la salida del sistema y confirman resultados esperados And y But: legiblidad El escenario: Scenario: Multiple Givens Given one thing Given another thing Given another one thing more When I do something Then I should see something Then I should see some other thing Puede ser escrito como: Scenario: Multiple Givens Given one thing And another thing And another one thing more When I do something Then I should see something But I should see some other thing Steps • Behat no distingue entre tipos de steps • Cada step se mapea a una función PHP • El contenido de la función es lo que determina realmente si el step es precondición, acción o postcondición • Given, When, Then, But y And sirven para que sea legible por humanos Gherkin: otras características • Definir escenarios mediante una plantilla variando solo los datos (Scenario Outline) • Contextos para los escenarios de una feature; precondiciones a establecerse antes de cada escenario (Backgrounds) • Permite pasar tablas de datos como argumentos a steps (más cómodo) • Marcar escenarios con etiquetas (útil para organizar y con ciertas implicaciones técnicas) Behat + Gherkin: mapeado de funciones Behat usa expresiones regulares para asociar steps con funciones PHP: ... When I click "My account" ... Behat + Gherkin: sugerencia implementación de step Si no se encuentra una función acorde para un step Behat sugiere el código para añadirla: ... And I should be in the "shop" web section ... Behat + Web Frosty Morning Web Mink • Framework de tests de aceptación para aplicaciones web • PHP 5.3 • Algunos emuladores: Goutte, Selenium, Sahi • Incluye muchos steps definidos relacionados con testing de aplicaciones web Headless browser emulators • Envían peticiones HTTP y parsean el resultado • Rápidos, sencillos y no necesitan un navegador real ni servidor gráfico • Sin soporte JS/AJAX Browsers controllers • Controlan un navegador real • Simulan interacción del usuario con el navegador • Soporte completo para JS/AJAX (y todo lo que ofrezca un navegador real) • Requieren un navegador instalado, configuración y son más lentos Mink • Mink abstrae las diferencias entre los emuladores de navegadores disponibles mediante drivers para cada uno • Facilita el control del navegador (real o emulado), el análisis de la página o la manipulación de elementos Mink Drivers • GoutteDriver: headless browser • SahiDriver: controlador de navegador compatible con todos los navegadores • ZombieDriver headless browser escrito en node.js y permite interacciones JS • SeleniumDriver y Selenium2Driver: controlador de navegador Etiquetas de escenario • Ciertas etiquetas afectan al driver usado. • La etiqueta @javascript dispara un driver con soporte para JS (por defecto Selenium) Las etiquetas se colocan antes de cada escenario Drupal Extension • Parece ser el módulo más prometedor • Compatible con Drupal 6, 7, y 8 (salvo bugs) • Ofrece steps propios de Drupal como clear cache, log out, comprobaciones sobre regiones y otros • Detecta e incorpora otros steps provistos por otros módulos Drupal Extension Steps Drupal Extension Drivers Escribir steps propios • Crear subclase de DrupalContext • Añadir métodos con su expresión regular • Añadir Behat hooks Enlaces • http://behat.org/ • http://mink.behat.org/ • https://portland2013.drupal.org/session/behat-behavior al-driven-development-and-selenium-drupal • https://groups.drupal.org/behat • http://drupalwatchdog.com/2/2/behat-mink • http://dspeak.com/drupalextension/ ¿Preguntas?