BDD con Cucumber es el enfoque más popular para escribir tests automatizados en lenguaje natural comprensible por todo el equipo: desarrolladores, testers y stakeholders de negocio. Si buscas qué es Cucumber, cómo funciona Gherkin o cómo implementar Behavior-Driven Development en tu proyecto, esta es la guía definitiva. Con ejemplos en Python (Behave) y Java.
¿Qué es BDD (Behavior-Driven Development)?
BDD o Desarrollo Guiado por Comportamiento es una metodología que extiende TDD con un enfoque en el comportamiento del sistema desde la perspectiva del usuario. Los tests se escriben en lenguaje natural comprensible por todos: desarrolladores, testers y negocio.
El ciclo BDD es: Especificar → Implementar → Validar
- Los escenarios se acuerdan antes de escribir código
- Sirven como especificación viva y como suite de regresión automatizada
- Eliminan la ambigüedad entre lo que el negocio quiere y lo que el equipo implementa
¿Qué es Cucumber?
Cucumber es el framework de testing más popular para implementar BDD. Interpreta archivos Feature escritos en Gherkin y los conecta con código ejecutable mediante step definitions. Soporta múltiples lenguajes: Java, Python (Behave/pytest-bdd), JavaScript (Cucumber.js), Ruby, PHP...
Sintaxis Gherkin completa
Gherkin usa palabras clave estructuradas para organizar los escenarios de prueba:
# language: es
Caracteristica: Inicio de sesion de usuario
Como usuario registrado
Quiero poder iniciar sesion en la plataforma
Para acceder a mi contenido personalizado
Antecedentes:
Dado que existo como usuario con email "ana@ejemplo.com"
Y mi contrasena es "MiPassword123"
Escenario: Inicio de sesion exitoso
Cuando visito la pagina de login
Y introduzco el email "ana@ejemplo.com"
Y introduzco la contrasena "MiPassword123"
Y hago clic en "Iniciar sesion"
Entonces deberia ver el dashboard
Y deberia ver el mensaje "Bienvenida, Ana"
Escenario: Contrasena incorrecta
Cuando visito la pagina de login
Y introduzco el email "ana@ejemplo.com"
Y introduzco la contrasena "incorrecta"
Y hago clic en "Iniciar sesion"
Entonces deberia ver el mensaje de error "Credenciales incorrectas"
Y deberia permanecer en la pagina de login
Esquema del Escenario — Tests parametrizados
Esquema del escenario: Validacion de formulario de registro
Dado que estoy en la pagina de registro
Cuando introduzco el nombre "<nombre>"
Y introduzco el email "<email>"
Entonces deberia ver "<resultado>"
Ejemplos:
| nombre | email | resultado |
| Ana | ana@ejemplo.com | Registro exitoso |
| | sin@nombre.com | El nombre es obligatorio |
| Bob | email-invalido | Email no tiene formato valido |
| Carlos | carlos@ejemplo.com | Registro exitoso |
Step Definitions en Python con Behave
Instalar: pip install behave selenium
# features/steps/login_steps.py
from behave import given, when, then
from selenium.webdriver.common.by import By
@given(u'que existo como usuario con email "{email}"')
def crear_usuario(context, email):
context.usuario = {"email": email}
@when(u'visito la pagina de login')
def visitar_login(context):
context.browser.get("http://localhost:8000/login")
@when(u'introduzco el email "{email}"')
def introducir_email(context, email):
campo = context.browser.find_element(By.ID, "email")
campo.clear()
campo.send_keys(email)
@then(u'deberia ver el dashboard')
def verificar_dashboard(context):
assert "/dashboard" in context.browser.current_url
@then(u'deberia ver el mensaje "{mensaje}"')
def verificar_mensaje(context, mensaje):
cuerpo = context.browser.find_element(By.TAG_NAME, "body").text
assert mensaje in cuerpo
Step Definitions en Java
Dependencias Maven: cucumber-java, cucumber-junit, selenium-java
// src/test/java/steps/LoginSteps.java
import io.cucumber.java.es.*;
import static org.junit.Assert.*;
public class LoginSteps {
private WebDriver driver;
@Dado("que estoy en la pagina de login")
public void estoyEnPaginaLogin() {
driver = new ChromeDriver();
driver.get("http://localhost:8080/login");
}
@Cuando("introduzco el email {string}")
public void introduzcoEmail(String email) {
driver.findElement(By.id("email")).sendKeys(email);
}
@Entonces("deberia ver el dashboard")
public void verificarDashboard() {
assertTrue(driver.getCurrentUrl().contains("/dashboard"));
}
}
Hooks de Cucumber — Setup y Teardown
# features/environment.py (Behave)
from selenium import webdriver
def before_all(context):
context.browser = webdriver.Chrome()
context.browser.implicitly_wait(10)
def after_all(context):
context.browser.quit()
def before_scenario(context, scenario):
limpiar_base_de_datos_de_test()
def after_scenario(context, scenario):
if scenario.status == "failed":
context.browser.save_screenshot(f"capturas/{scenario.name}.png")
BDD vs TDD vs Testing tradicional
| Aspecto | TDD | BDD | Testing tradicional |
|---|---|---|---|
| ¿Quien escribe los tests? | Developers | Todo el equipo | Testers |
| Lenguaje | Codigo | Lenguaje natural | Codigo |
| Cuando | Antes del codigo | Antes del codigo | Despues del codigo |
| Foco | Unidades de codigo | Comportamiento de negocio | Funcionalidad |
Buenas prácticas con Cucumber
- Escribe escenarios desde la perspectiva del usuario, no de la implementacion tecnica
- Un escenario = un comportamiento. No verifiques multiples cosas en el mismo escenario
- Usa Antecedentes para el contexto comun entre escenarios del mismo Feature
- Evita detalles de UI en Gherkin: di "hago clic en Guardar", no "hago clic en el boton azul de 40px"
- Mantén los steps cortos y reutilizables entre distintos feature files
Preguntas frecuentes sobre BDD y Cucumber
¿Qué es BDD y para qué sirve?
BDD (Behavior-Driven Development) es una metodología que especifica el comportamiento del sistema en lenguaje natural comprensible por todos. Su objetivo es eliminar la ambigüedad entre lo que el negocio quiere y lo que el equipo técnico implementa. Los escenarios Gherkin sirven a la vez como especificación viva del software y como suite de regresión automatizada que se ejecuta en cada build del proyecto.
¿Qué es Gherkin y cuál es su relación con Cucumber?
Gherkin es el lenguaje de dominio específico (DSL) que Cucumber usa para escribir los escenarios de prueba. Usa palabras clave como Given (Dado), When (Cuando), Then (Entonces), And (Y) y But (Pero) para estructurar los escenarios de forma legible por personas no técnicas. Cucumber interpreta los archivos .feature escritos en Gherkin y los conecta con código ejecutable a través de los step definitions.
¿Cuál es la diferencia entre BDD y TDD?
TDD se centra en pruebas unitarias escritas por desarrolladores antes de implementar la funcionalidad. BDD se centra en el comportamiento del sistema desde la perspectiva del usuario, con tests en lenguaje natural escritos por todo el equipo. BDD es más colaborativo y orientado a negocio, TDD es más técnico y de bajo nivel. Son complementarios: usa BDD a nivel de aceptación y TDD a nivel unitario.
¿Cucumber funciona con Python?
Sí. Para Python existe Behave, la implementación de BDD más popular. Funciona igual que Cucumber: escribes archivos .feature con Gherkin y los step definitions en Python con los decoradores @given, @when y @then de la librería behave. También existe pytest-bdd si prefieres integrarlo con el ecosistema pytest. La sintaxis Gherkin es idéntica independientemente del lenguaje de implementación.
¿Cómo instalar Cucumber para empezar?
Para Python: pip install behave, crea la carpeta features/ con tus archivos .feature y features/steps/ con los step definitions. Para Java: añade cucumber-java y cucumber-junit a tu pom.xml o build.gradle. Para JavaScript: npm install @cucumber/cucumber. En todos los casos la estructura es la misma: archivos .feature con Gherkin y step definitions en el lenguaje elegido.
Conclusión
BDD con Cucumber hace que los tests sean comprensibles por todo el equipo y que el software cumpla realmente con los requisitos de negocio. Complementa esta guía con los tutoriales de Cucumber en profundidad y pruebas funcionales automatizadas con Gherkin.