BDD en JavaScript: escribiendo pruebas que entiende el negocio

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Cómo explicarle a un programador que un bug no es "no funciona"?

\n

¿Alguna vez has recibido una tarea como: "Haz que el botón funcione correctamente"? ¿O, peor aún, escribiste código, las pruebas están en verde, y el cliente dice: "Bueno, esto no es lo que pedí"? ¿Te suena familiar? Bienvenido al mundo donde BDD (Behaviour-Driven Development) en JavaScript se convierte en un salvavidas.

\n

BDD no es solo otra abreviatura de moda. Es un enfoque que obliga a desarrolladores, testers y analistas de negocio a hablar el mismo idioma. En español, vivo, sin "metodologías" ni "paradigmas arquitectónicos". Hoy analizaremos cómo implementar BDD en un proyecto JavaScript, escribiremos pruebas reales y entenderemos por qué esto hace que el código sea más limpio y la vida más fácil.

\n\n
\n\n

¿Qué es BDD y en qué se diferencia de TDD?

\n

Aclaremos las cosas de inmediato. BDD (Behaviour-Driven Development) es una evolución de TDD (Test-Driven Development). Si TDD dice: "Primero escribe la prueba, luego el código", BDD añade: "Pero la prueba debe ser comprensible para la abuela inversora".

\n

La idea clave de BDD: probamos el comportamiento del sistema, no su estructura interna. No preguntamos: "¿La función devuelve true?". Preguntamos: "¿Puede el usuario agregar un producto al carrito y ver el total del pedido?". La diferencia es enorme.

\n

Para BDD en JavaScript existe un lenguaje especial: Gherkin. Es un pseudo-inglés (o pseudo-español) que parece un manual de instrucciones de Lego:

\n\n
Funcionalidad: Carrito de compras\n  Como usuario registrado\n  Quiero agregar productos al carrito\n  Para ver el costo total\n\n  Escenario: Agregar un producto\n    Dado que el usuario está autenticado\n    Cuando agrega el producto "Portátil" al carrito\n    Entonces en el carrito se muestra 1 producto\n    Y el costo total es igual a 99900 pesos\n
\n\n

¿Estás de acuerdo en que se lee como un requisito de negocio, no como código? Y esa es la principal característica de BDD.

\n\n
\n\n

Herramientas para BDD en JavaScript

\n

Para practicar behaviour-driven development en JavaScript, necesitas las herramientas adecuadas. Aquí están los tres pilares sobre los que se sostiene todo:

\n\n
    \n
  • Cucumber.js — el framework más popular para BDD. Analiza escenarios Gherkin y los vincula con el código.
  • \n
  • Jest + Jest-Cucumber — si ya usas Jest, esta es la opción ideal. Sin magia, solo integración limpia.
  • \n
  • Mocha + Chai + Gherkin — para aquellos a los que les gusta armar el rompecabezas manualmente. Flexible, pero más código.
  • \n
\n\n

Usaremos Cucumber.js porque es el estándar de la industria. La instalación es simple:

\n\n
npm install @cucumber/cucumber --save-dev\n
\n\n

Después de esto, creamos la carpeta features/ — allí vivirán nuestros archivos .feature. Y en la carpeta step_definitions/ — el código que da vida a los escenarios.

\n\n
\n\n

Escribimos la primera prueba BDD: autenticación de usuario

\n

Imaginemos que estamos haciendo una tienda en línea. Lo primero que hay que probar es el inicio de sesión. Creamos el archivo features/login.feature:

\n\n
# language: es\nFuncionalidad: Autenticación de usuario\n  Como visitante del sitio\n  Quiero iniciar sesión en mi cuenta personal\n  Para gestionar mis pedidos\n\n  Escenario: Inicio de sesión exitoso con datos correctos\n    Dado que estoy en la página de inicio de sesión\n    Cuando ingreso el email "user@example.com" y la contraseña "123456"\n    Y hago clic en el botón "Iniciar sesión"\n    Entonces veo el saludo "¡Bienvenido, Iván!"\n
\n\n

Ahora necesitamos escribir los pasos (steps) — código en JavaScript que ejecutará estas acciones. Creamos step_definitions/login.steps.js:

\n\n
const { Given, When, Then } = require('@cucumber/cucumber');\nconst { expect } = require('chai');\n\n// Estado de la aplicación (simulación)\nlet currentPage = '';\nlet userEmail =                

Blogs

Book Recommendations