Cuando el código habla el idioma del negocio: introducción a BDD
Imagínese esta situación: ha escrito un módulo de pago perfecto, desde el punto de vista del código. Todos los métodos funcionan, las excepciones se manejan, la cobertura de pruebas unitarias es del 99%. Abre el champán, pero llega el gerente y dice: «¿Por qué se descuenta el dinero antes de confirmar el pedido?». Y se da cuenta: el error no está en el código, sino en la comprensión de la tarea.
¿Le suena familiar? Precisamente para estos casos existe BDD (Behaviour-Driven Development): desarrollo guiado por el comportamiento. No es solo otra metodología, sino un puente entre «quiero que funcione» y «cómo implementarlo en PHP». Si está cansado de reescribir la lógica después de cada aclaración de requisitos, este artículo es para usted.
En este material, analizaremos cómo implementar BDD en PHP utilizando el framework Behat, escribiremos pruebas reales y entenderemos por qué esto hace que el código sea más limpio y la comunicación más transparente.
¿Qué es BDD y en qué se diferencia de TDD?
Muchos confunden Behaviour-Driven Development con el TDD (Test-Driven Development) habitual. Y es cierto, externamente son similares: en ambos casos primero se escriben las pruebas. Pero la diferencia está en el enfoque.
- TDD se trata de «cómo verificar que una función devuelve el número correcto». Las pruebas se escriben en el lenguaje del programador: assert, equals, mock.
- BDD se trata de «cómo se comporta el sistema en una situación de negocio específica». Los escenarios se escriben en un lenguaje natural, casi humano.
La idea clave de BDD en PHP es utilizar un lenguaje unificado para la comunicación. Desarrolladores, testers y gerentes leen el mismo escenario. Y si en él está escrito «el usuario agrega un producto al carrito sin autenticarse», todos lo entienden de la misma manera.
Herramientas: Behat y Gherkin
En el mundo de PHP, la herramienta principal para BDD es Behat. Es un framework que analiza escenarios escritos en lenguaje Gherkin y los convierte en pruebas ejecutables. Gherkin es un lenguaje simple en español (o inglés) con palabras clave: Feature, Scenario, Given, When, Then.
Instalemos Behat en su proyecto PHP:
composer require --dev behat/behat behat/mink-extension behat/mink-goutte-driverDespués de la instalación, inicializamos el proyecto:
vendor/bin/behat --initLa estructura se verá así:
features/ bootstrap/ FeatureContext.php your_feature.featurebehat.ymlEscribiendo nuestro primer escenario BDD en PHP
Supongamos que tenemos una tienda en línea. El requisito de negocio es: «Un usuario registrado puede agregar un producto al carrito y ver el total». Creamos el archivo features/cart.feature:
Feature: Carrito del comprador Como usuario registrado Quiero agregar productos al carrito Para ver el costo total
Scenario: Agregar un producto Given accedo al sitio como usuario "ivan@example.com" And en la página del catálogo hay un producto "Portátil" por 50000 rublos When hago clic en "Agregar al carrito" para el producto "Portátil" Then veo el mensaje "Producto agregado" And el total del carrito es igual a 50000 rublosObserve: este escenario puede ser leído por cualquier gerente sin conocimientos de PHP. Pero para Behat, es una prueba ejecutable.
Implementación de pasos (Step Definitions)
Ahora necesitamos «enseñar» a Behat a entender estos pasos. Abra features/bootstrap/FeatureContext.php:
<?php
use Behat\\Behat\\Context\\Context;use Behat\\Gherkin\\Node\\PyStringNode;use Behat\\Gherkin\\Node\\TableNode;
class FeatureContext implements Context{ private $currentUser; private $cart = []; private $products = [];
/** * @Given accedo al sitio como