Hace unos meses conocíamos en nuestro Blog ¿Qué es BDD (Behavior Driven Development)?. Si aún no conoces esta estrategia de desarrollo dirigido por comportamiento, o no has leído el artículo, creo que ahora mismo es buen momento.

Hoy me gustaría presentarte un ejemplo de desarrollo dirigido a comportamiento BDD, en lenguaje Gherkin, basado en ‘Given-When-Then’. En otras palabras, Gherkin presenta el comportamiento de la aplicación, a partir de la cual con un framework como Cucumber puedes generar las prueba de tu aplicación. Además de integrar a todo el equipo con un objetivo común, diseñar la mejor documentación en un idioma común.

¿Cómo desarrollar un comportamiento BDD con Gherkin? Sintaxis y semántica

Como sabrás, cada lenguaje de programación tiene sus características y palabras clave. En la siguiente tabla verás las diferentes sintaxis y la semántica en el lenguaje Gherkin. Ten en cuenta que algunos frameworks BDD pueden no ser totalmente compatibles. Cucumber, por ejemplo, proporciona una referencia alineada al lenguaje Gherkin. Revisemos la sintaxis:

Sintaxis

Propósito

FEATURE

El propósito del FEATURE es proporcionar una descripción de alto nivel de una de las funciones de software y agrupar SCENARIOs relacionados.

SCENARIO o EXAMPLE

Un SCENARIO es un ejemplo concreto que contiene una regla de negocio. Consiste básicamente en una definición en el patrón ‘Given-When-Then’.

GIVEN

GIVEN es parte de patrón ‘Given-When-Then’. Se utilizan para describir el contexto inicial del sistema: la escena del escenario.

El propósito de los Given es poner el sistema en un estado concreto antes de que el usuario (o sistema externo) comience a interactuar con el sistema (en los WHEN). Es importante evitar hablar sobre la interacción del usuario en este patrón.

WHEN

WHEN es la segundo requisito del patrón ‘Given-When-Then’. Se utilizan para describir un evento o una acción. Puede ser una persona que interactúa con el sistema o puede ser un evento desencadenado por otro sistema.

THEN

THEN, la última descripción del patrón ‘Given-When-Then’.  Se utilizan para describir el resultado esperado. La definición de un THEN debe usar una aserción para comparar el resultado real (lo que el sistema realmente hace) con el resultado esperado (lo que se supone que debe hacer el sistema).

AND

AND se utiliza para añadir alguna condición más en alguno de los patrones Given, When o Then

BUT

Al igual que el AND se utiliza en los patrones Given, When o Then, pero en este caso se utiliza como condición extra.

BACKGROUND

Ocasionalmente, te encontrarás repitiendo los mismos GIVEN en muchos SCENARIO de una FEATURE.

Si es el caso, como se repite en cada escenario, esto es una indicación de que los patrones no son esenciales para describir los escenarios; Son detalles generales. Literalmente, puedes moverlos agrupándolos en un BACKGROUND.

SCENARIO OUTLINE

El SCENARIO OUTLINE se puede usar para ejecutar varios SCENARIO varias veces, con diferentes combinaciones de valores.

|

Los “Data Tables” o |, son útiles para pasar una lista de valores a una definición de patrones.

"""

Doc Strings o “”” es útil si necesitas añadir mucha información a los patrones.

@

Prefijo para una etiqueta: @. Las etiquetas pueden ser colocadas antes de los patrones o SCENARIO. El objetivo principal es ayudarte a filtrar SCENARIOs.

#

Para definir comentarios. Solo se permiten al comienzo de una nueva línea.

Ejemplo de desarrollo basado en comportamiento BDD con Gherkin

La sintaxis y la semántica de Gherkin que hemos repasado pueden parecer confusas. La mejor forma de aprender Gherkin y BDD es con ejemplos que muestran cómo usar toda esta sintaxis.

En los siguientes ejemplos plasmaré una simple búsqueda en Google, una función que todos conocemos y que es fácil de explicar.

Definición simple BDD con Gherkin

Definición simple BDD con Gherkin

En el ejemplo verás que comienza con una sección de FEATURE y una descripción. La descripción es opcional y puedes añadir tantas líneas como necesites. Como práctica recomendada Agile, debes incluir la historia del usuario, defiendo ejemplos concretos. Este FEATURE podría tener más SCENARIOs, pero por simplicidad, este ejemplo tiene solo uno. Cada SCENARIO se ejecutará independientemente de los otros SCENARIOs: ¡el resultado de un SCENARIO no tiene relación con el siguiente!

Observa la descripción del SCENARIO y la FEATURE, es importante que cualquier persona, no técnica, pueda comprender fácilmente cómo deberían comportarse las búsquedas de Google al leer este escenario. “¿Buscar pingüino? ¡Obtener resultados de pingüino! El comportamiento de la FEATURE es claro para el desarrollador y el usuario. Por lo tanto, este archivo de características puede ser compartido por todas las partes interesadas, integrando a todo el equipo con un objetivo común.

Definición adicional de patrones en BDD con Gherkin

No todos los comportamientos se pueden describir completamente con los tres patrones básicos ‘Given-When-Then’. Afortunadamente, los escenarios pueden definir más casuísticas con los patrones adicionales AND y  BUT. Extendamos el ejemplo anterior:

Definición adicional de patrones en BDD con Gherkin

Documentación adicional en BDD con Gherkin

Si necesitas añadir documentación extra en algún patrón, puedes utilizar las cadenas de texto “Doc Strings”. Continuemos con el ejemplo:

Documentación adicional en BDD con Gherkin

Como verás la documentación extra están delimitada por las tres comillas dobles “””'.

Tablas o Listado de valores en BDD con Gherkin

Las tablas “Data Tables” son una valiosa estructura para añadir ejemplos que después se podrán pasar en las pruebas. Veamos un ejemplo:

Tablas o Listado de valores en BDD con Gherkin

Las tablas están delimitadas por el símbolo de tubería "|". Puedes añadir tantas filas o columnas como necesites. La primera fila contiene el nombre de la columna y no se trata como valor de entrada.

Antecedentes y escenarios en BDD con Gherkin

A veces, los SCENARIO de una FEATURE pueden compartir pasos de configuración comunes. En lugar de duplicar estos patrones, se pueden definir como BACKGROUND:

Antecedentes y escenarios en BDD con Gherkin

Como cada SCENARIO es independiente, los pasos definidos en BACKGROUND se ejecutarán antes de que se ejecute cada SCENARIO.

Esquemas de escenario en BDD con Gherkin

Los SCENARIO OUTLINES te permitirán automatizar aún más la definición en Gherkin. Observa el ejemplo anterior, los dos escenarios son idénticos si no fuese por sus términos de búsqueda “pingüino” y “panda”. Veamos ahora un ejemplo de como podrías combinar en una sola SECTION con SCENARIO OUTLINES:

Esquemas de escenario en BDD con Gherkin

Como ves se define utilizando las “Data Tables” EXAMPLES. Cada columna de la tabla contiene el título definidos en los patrones con los diferentes ejemplos.

¡Ojo! no confundir las tablas que proporcionan estructuras de datos de entrada con estas que son ejemplos de entrada.

Tags en BDD con Gherkin

Las etiquetas o ‘tags’ “@” son una excelente manera de clasificar SCENARIOs. Se pueden usar para ejecutar selectivamente pruebas basadas en el nombre de la etiqueta. Veamos un ejemplo:

Tags en BDD con Gherkin

Las etiquetas comienzan con el símbolo "@". Los nombres de las etiquetas distinguen entre mayúsculas y minúsculas y espacios en blanco. Como práctica, te recomiendo escribir siempre en minúsculas y utilizar guiones ("-") como espacios.

Comentarios en BDD con Gherkin

Los comentarios te permiten agregar información adicional como podría ser el autor o cualquier identificación en tu organización. Las líneas de comentarios pueden aparecer en cualquier lugar. Por ejemplo:

Comentarios en BDD con Gherkin

Conclusión

Hemos repasado la sintaxis de Gherkin y ejemplos reales para que te sea más sencillo iniciar tu próximo proyecto basado en una estrategia de desarrollo dirigido por comportamiento BDD (Behavior Driven Development). Recuerda que con BDD y frameworks como Cucumber basados en el lenguaje Gherkin puedes generar las prueba de tu aplicación. Además de integrar a todo el equipo con el objetivo común de diseñar la mejor documentación en un idioma común.

¿Utilizas BDD en tus proyectos? ¿Qué perfiles de usuario implicas en el diseño de tus desarrollos?

Photo by Marvin Heilemann on Unsplash

Referencias: