¿Cómo nos ayuda BDD en el desarrollo de un proyecto?

Antes de empezar primero aclaremos ¿qué es BDD?. BDD es un conjunto de prácticas de ingeniería que están basadas en prácticas ágiles, específicamente TDD y DDD, para ayudar a desarrollar y entregar software de calidad y con mayor valor para el cliente. BDD otorga un lenguaje común, basado en oraciones estructuradas que permite la fácil comunicación entre los miembros del equipo y los stakeholders.

El flujo que BDD promueve consta en:

  1. Identificar las metas del negocio.
  2. Identificar las características a desarrollar que contribuyen a las metas del negocio.
  3. Creación de ejemplos para las características definidas y planteamiento de escenarios utilizando un lenguaje común (Given, When, Then).
  4. Codificación a nivel de pruebas de los escenarios.
  5. Codificación de características de bajo nivel.
  6. Codificación del código de la aplicación.

BDD está orientado al comportamiento (Behaviour driven development) ya que de esa forma las pruebas reflejan las características esperadas por el cliente.

En la práctica, cada característica del software puede ser descrita en un formato de una historia de usuario si el equipo lo desea y de cada una de ellas se identifican por medio de ejemplos los escenarios que se deben de probar y estos escenarios cumplen la función de criterios de aceptación para las posibles historias que creemos de nuestras características.

Ejemplo:

Primero definimos una característica

Feature: Disposición de efectivo de un cajero

(As [role], I want [feature], So that [benefit])

Como [titular de la cuenta]
Quiero [disponer de efectivo desde un cajero]
Para [obtener dinero cuando el banco está cerrado]

Luego encontramos los escenarios

(Given [context], And [more context…], When [event], Then [outcome], And [another outcome])

Escenario: La cuenta no tiene fondos suficientes

Dado que el balance de la cuenta es S/.100
Y la cuenta es válida
Y el cajero tiene suficiente dinero
Cuando el titular de la cuenta solicita S/. 20
Entonces el cajero debe otorgar S/. 20
Y el balance de la cuenta debe ser S/. 80
Y la tarjeta debe ser devuelta

(Ejemplo adaptado en español de la página de Dan North & Associates. Dan North es el creador de BDD)

Como se puede apreciar en el ejemplo, de esta forma se pueden definir los escenarios que se deben cubrir para que una caracteristica (feature) sea aceptada como completa (criterios de aceptación). Uno de los puntos más importantes a resaltar es que el lenguaje que expresa los escenarios es fácil de entender tanto para personas con habilidades técnicas como para los que no, de esta forma todos los miembros del equipo están alineados y además las pruebas pueden servir de documentación.

A continuación veremos un ejemplo de una implementación en BDD del escenario visto en lineas anteriores, para eso usaremos Cucumber para Scala.

(Código en español para que sea fácil de entender, se puede usar ES en vez de EN para usar Cuando en vez de Given por ejemplo)

Como se puede ver, tanto la especificación como el código son exactamente iguales. Cucumber lee las especificaciones en texto plano y realiza un comparación con el código para capturar los valores que sean necesarios (en este caso los valores numéricos).

Al ejecutar las pruebas se puede ver el resultado detallado.

bdd_example

Además, las pruebas se pueden exportar como html para que puedan ser compartidas con el cliente.

De esta forma podemos mejorar el flujo de trabajo teniendo mejores definiciones con el cliente, orientadas al comportamiento y que aportan valor al negocio, además están reflejadas directamente en el trabajo realizado en el código y se pueden usar como documentación.

El código utilizado para la demostración puede ser descargado desde GitHub.

https://github.com/evolbit/cucumber-play

¿Cómo nos ayuda BDD en el desarrollo de un proyecto?