Cuando el código se convierte en historia
\nImagine: escribe código en Go, ejecuta las pruebas — barra verde. Pero el gerente mira su t.Errorf y no entiende qué es lo que se rompió exactamente. El negocio dice: «Hagan que el usuario pueda registrarse», y el desarrollador lo traduce a «POST /api/v1/user con validación de email». La brecha entre el lenguaje técnico y el humano es el principal dolor de cabeza de muchos proyectos.
Hay una solución — BDD (Desarrollo Guiado por el Comportamiento) en Go. No son solo pruebas. Es un puente entre el código y la lógica de negocio. En este artículo, analizaremos cómo escribir pruebas BDD en Go, usando ejemplos reales, y por qué su gerente de producto le estará agradecido.
\n\n¿Qué es BDD y por qué Go?
\nDesarrollo Guiado por el Comportamiento (Behaviour-Driven Development) es una evolución de TDD. Si TDD se enfoca en el «cómo» (cómo implementar una función), BDD responde al «qué» (qué debe hacer el sistema desde el punto de vista del usuario).
\nGo es ideal para BDD gracias a su simplicidad, su paquete integrado testing y potentes frameworks como Ginkgo y Godog. La comunidad de Go utiliza activamente BDD para microservicios, APIs e incluso utilidades de línea de comandos.
Principios clave de BDD en Go
\n- \n
- Lenguaje ubicuo (Ubiquitous Language) — los escenarios se escriben en un inglés o español comprensible para el negocio. \n
- Given-When-Then — estructura de cualquier escenario: precondiciones → acción → resultado esperado. \n
- Automatización — los escenarios se convierten en pruebas ejecutables en Go. \n
Herramientas para BDD en Go
\nLa elección del framework depende de cómo quiera describir los escenarios. Aquí hay dos enfoques principales:
\n\n1. Ginkgo + Gomega (para desarrolladores Go)
\nGinkgo es un framework BDD que se escribe en Go puro. Los escenarios se ven como código Go con descripciones legibles. Gomega es una biblioteca de comparadores para aserciones.
\nVentajas: control total sobre el código, excelente integración con las herramientas de Go, soporte para pruebas asíncronas.
\n\n2. Godog (Cucumber para Go)
\nGodog es una implementación de Cucumber en Go. Escribe escenarios en Gherkin (archivos Feature en lenguaje natural) y luego implementa los pasos en Go.
\nVentajas: los escenarios son legibles incluso para no programadores, es fácil cambiar la lógica sin modificar el código.
\n\nPráctica: escribiendo una prueba BDD en Go con Ginkgo
\nVamos a crear un servicio simple — un carrito de compras de una tienda en línea. Escribamos una prueba BDD que verifique la adición de un producto.
\n\nPaso 1: Instalación de Ginkgo
\ngo get github.com/onsi/ginkgo/v2\ngo get github.com/onsi/gomega\n\nPaso 2: Inicialización del paquete de prueba
\ncd mycart\nginkgo bootstrap\nSe crea el archivo mycart_suite_test.go.
Paso 3: Escribimos el escenario
\nCreemos el archivo cart_test.go:
package mycart_test\n\nimport (\n . "github.com/onsi/ginkgo/v2"\n . "github.com/onsi/gomega"\n "mycart"\n)\n\nvar _ = Describe("Carrito", func() {\n var cart *mycart.Cart\n\n BeforeEach(func() {\n cart = mycart.NewCart()\n })\n\n Describe("Adición de producto", func() {\n Context("con ID y precio correctos", func() {\n It("debe incrementar la cantidad de elementos en 1", func() {\n cart.AddItem("sku-123", 100.0)\n Expect(cart.TotalItems()).To(Equal(1))\n })\n\n It("debe calcular correctamente el total", func() {\n cart.AddItem("sku-123", 100.0)\n cart.AddItem("sku-456", 250.0)\n Expect(cart.TotalPrice()).To(BeNumerically("~", 350.0, 0.01))\n })\n })\n\n Context("con un producto que ya existe", func() {\n It("debe incrementar la cantidad, no agregar un nuevo elemento", func() {\n cart.