Guía completa de Cucumber y Gherkin

A continuación, se desarrolla toda la información de estas tecnologias para explicar en mayor profundidad las características, configuraciones y ejemplos de Cucumber y Gherkin en el contexto del Desarrollo Guiado por Comportamiento (BDD).


Introducción al Desarrollo Guiado por Comportamiento (BDD)

El BDD (Behaviour-Driven Development) es una metodología que promueve la colaboración entre los stakeholders del negocio, desarrolladores y testers para asegurar que el software cumple con los requisitos del negocio desde el inicio.


¿Qué aporta el BDD?

  1. Mejora la comunicación: Los requisitos se expresan en un lenguaje entendible tanto para personas técnicas como no técnicas.
  2. Pruebas vivas: Los archivos de características no solo documentan requisitos, sino que también sirven como pruebas automatizadas que se actualizan con el proyecto.
  3. Reducción de errores: Los equipos trabajan con una visión compartida desde el principio, minimizando malentendidos.


Cucumber como herramienta BDD

Cucumber traduce los requisitos en pruebas ejecutables:

  1. Usa Gherkin para escribir los escenarios en lenguaje natural.
  2. Convierte esos escenarios en código Java que interactúa con el sistema.


Flujo de Trabajo de Cucumber

El flujo típico de trabajo con Cucumber incluye los siguientes pasos:

  1. Crear el archivo de características (Feature File):
    1. Es el punto inicial donde se describen los escenarios en lenguaje natural utilizando Gherkin.
    2. Ejemplo:

Feature: Checkout

  Scenario: Comprar un plátano

    Given el precio de un "plátano" es 40c

    When compro 1 "plátano"

    Then el precio total debería ser 40c

 

  1. Definir los pasos (Step Definitions):
    1. Cada paso de los escenarios (Given, When, Then) se asocia a métodos en Java.
    2. Ejemplo:

@Given("^el precio de un \"(.*?)\" es (\\d+)c$")

public void setPrice(String item, int price) {

    // Lógica para establecer el precio

}

 

  1. Ejecución:
    1. Cucumber ejecuta los escenarios y marca cada paso como PASSED, FAILED o SKIPPED.
    2. Los resultados se visualizan en la consola o en un reporte generado.


Sintaxis y Palabras Clave de Gherkin

Gherkin es el lenguaje que utiliza Cucumber para definir escenarios. Su diseño prioriza la legibilidad, permitiendo que cualquiera pueda entender las pruebas.


Palabras clave principales:

1. Feature: Define una funcionalidad general del sistema.

Ejemplo:

Feature: Checkout

  Este archivo prueba el sistema de compras.


2. Scenario: Representa un caso de prueba específico.

Ejemplo:

Scenario: Comprar un plátano

  Given el precio de un "plátano" es 40c

  When compro 1 "plátano"

  Then el precio total debería ser 40c


3. Scenario Outline: Permite reutilizar un escenario con diferentes conjuntos de datos.

Ejemplo:

Scenario Outline: Comprar múltiples plátanos

  Given el precio de un "plátano" es 40c

  When compro <cantidad> "plátano"

  Then el precio total debería ser <total>c


4. Steps (Given, When, Then, And, But):

    1. Given: Establece el contexto inicial.
    2. When: Describe las acciones realizadas.
    3. Then: Verifica el resultado esperado.
    4. And y But: Combinan pasos.


Uso de Hooks

Los hooks en Cucumber permiten ejecutar código antes o después de los escenarios para preparar o limpiar el entorno de pruebas.


Tipos de hooks:

1. @Before: Código que se ejecuta antes de cada escenario.

Ejemplo:

@Before

public void setUp() {

    System.out.println("Iniciando escenario");

}



2. @After: Código que se ejecuta después de cada escenario.

Ejemplo:

@After

public void tearDown() {

    System.out.println("Escenario finalizado");

}



3. Hooks etiquetados: Ejecutan código solo para escenarios específicos etiquetados.

Ejemplo:

@Before("@Etiqueta")

public void beforeTaggedScenario() {

    System.out.println("Preparando escenario etiquetado");

}



4. Orden de ejecución: Los hooks pueden definirse con un orden específico.

Ejemplo:

@Before(order = 1)

public void firstHook() { ... }


@Before(order = 2)

public void secondHook() { ... }


Tablas de Datos

Las tablas en Gherkin permiten simplificar la introducción de datos en los escenarios.

1. Tablas en pasos individuales: Asociadas a un solo paso.

Ejemplo:

Given los precios son:

  | producto | precio |

  | plátano  | 40c    |

  | manzana  | 25c    |


2. Tablas en Scenario Outline: Permiten múltiples ejecuciones con diferentes conjuntos de datos.

Ejemplo:

Scenario Outline: Comprar frutas

  Given el precio de un "plátano" es 40c

  When compro <cantidad> "plátano"

  Then el precio total debería ser <total>c


Configuración Práctica de Cucumber

Para usar Cucumber en un proyecto Java, se necesitan varios componentes clave:

  1. Feature Files: Definen los escenarios (.feature).
  2. Step Definitions: Implementan los pasos de los escenarios.
  3. Runner Class: Configura y ejecuta las pruebas con Cucumber.
  4. Archivo pom.xml: Configura las dependencias necesarias, como JUnit y Cucumber.


Expresiones Regulares en Cucumber

Cucumber utiliza expresiones regulares para mapear pasos en Gherkin a métodos en Java.


Ejemplos de patrones:

1. Captura de números:

@When("^compro (\\d+) \"plátano\"$")

public void buyBanana(int cantidad) { ... }



2. Captura de texto:

@Given("^el precio de un \"(.*?)\" es (\\d+)c$")

public void setPrice(String producto, int precio) { ... }



3. Uso de OR:

@Given("^el producto es \"plátano|manzana\"$")

public void validateProduct(String producto) { ... }


Ejemplo Práctico Completo

Archivo Checkout.feature:

Feature: Checkout

  Scenario: Comprar un plátano y una manzana

    Given el precio de un "plátano" es 40c

    And el precio de una "manzana" es 25c

    When compro 1 "plátano"

    And compro 1 "manzana"

    Then el precio total debería ser 65c


Definiciones de pasos:

@Given("^el precio de un \"(.*?)\" es (\\d+)c$")

public void setPrice(String item, int price) { ... }


@When("^compro (\\d+) \"(.*?)\"$")

public void buyItem(int count, String item) { ... }


@Then("^el precio total debería ser (\\d+)c$")

public void verifyTotal(int total) { ... }

Siguiente Publicación