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?
- Mejora la comunicación: Los requisitos se expresan en un lenguaje entendible tanto para personas técnicas como no técnicas.
- 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.
- 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:
- Usa Gherkin para escribir los escenarios en lenguaje natural.
- 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:
- Crear el archivo de características (Feature File):
- Es el punto inicial donde se describen los escenarios en lenguaje natural utilizando Gherkin.
- 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
- Definir los pasos (Step Definitions):
- Cada paso de los escenarios (Given, When, Then) se asocia a métodos en Java.
- Ejemplo:
@Given("^el precio de un \"(.*?)\" es (\\d+)c$")
public void setPrice(String item, int price) {
// Lógica para establecer el precio
}
- Ejecución:
- Cucumber ejecuta los escenarios y marca cada paso como PASSED, FAILED o SKIPPED.
- 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):
- Given: Establece el contexto inicial.
- When: Describe las acciones realizadas.
- Then: Verifica el resultado esperado.
- 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:
- Feature Files: Definen los escenarios (.feature).
- Step Definitions: Implementan los pasos de los escenarios.
- Runner Class: Configura y ejecuta las pruebas con Cucumber.
- 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) { ... }