<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>TDD on KnightLi Blog</title>
        <link>https://www.knightli.com/es/tags/tdd/</link>
        <description>Recent content in TDD on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>es</language>
        <lastBuildDate>Tue, 05 May 2026 14:35:38 +0800</lastBuildDate><atom:link href="https://www.knightli.com/es/tags/tdd/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Usar pruebas y descripciones de comportamiento para controlar codigo escrito por IA</title>
        <link>https://www.knightli.com/es/2026/05/05/ai-coding-tdd-bdd/</link>
        <pubDate>Tue, 05 May 2026 14:35:38 +0800</pubDate>
        
        <guid>https://www.knightli.com/es/2026/05/05/ai-coding-tdd-bdd/</guid>
        <description>&lt;p&gt;Al escribir codigo con IA, la experiencia mas comun es: al principio todo va rapido, despues se vuelve caotico. Las funciones iniciales se montan muy deprisa, pero cuando el proyecto crece y las modificaciones se acumulan, aparece el patron de arreglar un bug y crear tres mas.&lt;/p&gt;
&lt;p&gt;Esto no es solo problema de la IA. Muchas personas tambien programan asi; la diferencia es que la IA escribe mas rapido y los problemas se exponen antes. Para reducir ese descontrol, la clave no es pedir a la IA que &amp;ldquo;se esfuerce mas&amp;rdquo;, sino darle limites mas claros: primero definir que resultado cuenta como correcto y luego dejar que escriba la implementacion.&lt;/p&gt;
&lt;p&gt;TDD y BDD encajan bien dentro del flujo de programacion con IA. TDD convierte &amp;ldquo;si esta bien o mal&amp;rdquo; en pruebas automaticas; BDD convierte &amp;ldquo;si esto es lo que quiero&amp;rdquo; en descripciones de comportamiento comprensibles por personas. Combinados, hacen que la IA adivine menos, improvise menos y sea mas facil de revisar.&lt;/p&gt;
&lt;h2 id=&#34;que-problema-resuelve-tdd&#34;&gt;Que problema resuelve TDD
&lt;/h2&gt;&lt;p&gt;TDD significa Test Driven Development, desarrollo guiado por pruebas. Su secuencia basica es:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Escribir primero las pruebas.&lt;/li&gt;
&lt;li&gt;Ejecutarlas y confirmar que ahora fallan.&lt;/li&gt;
&lt;li&gt;Escribir despues el codigo funcional.&lt;/li&gt;
&lt;li&gt;Ajustar la implementacion hasta que las pruebas pasen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Esto es lo contrario de lo que mucha gente acostumbra. Al escribir una funcion de ordenacion, la intuicion suele ser escribir primero la funcion y luego probar algunos numeros a mano. TDD pide escribir antes las expectativas como pruebas: por ejemplo, que con &lt;code&gt;[3, 1, 2]&lt;/code&gt; se obtenga &lt;code&gt;[1, 2, 3]&lt;/code&gt;, que un array vacio devuelva un array vacio, y que una entrada con numeros repetidos tambien produzca un resultado correcto.&lt;/p&gt;
&lt;p&gt;El sentido de hacerlo asi es que, antes de empezar a desarrollar, el resultado correcto ya esta definido. Mas adelante, quien cambie el codigo solo necesita volver a ejecutar las pruebas para saber si rompio un comportamiento acordado.&lt;/p&gt;
&lt;h2 id=&#34;por-que-antes-costaba-mantener-tdd&#34;&gt;Por que antes costaba mantener TDD
&lt;/h2&gt;&lt;p&gt;TDD suena muy bien, pero en proyectos reales no es facil sostenerlo durante mucho tiempo.&lt;/p&gt;
&lt;p&gt;Primero, va contra la intuicion. Frente a un archivo vacio, muchas personas prefieren escribir la funcion antes que las pruebas. Cuando los requisitos todavia no estan claros, escribir casos de prueba tambien cuesta.&lt;/p&gt;
&lt;p&gt;Segundo, los requisitos cambian rapido. Una docena de pruebas escritas hoy con mucho cuidado pueden necesitar reescritura masiva si manana cambia el producto. A corto plazo, parece ralentizar el desarrollo.&lt;/p&gt;
&lt;p&gt;Tercero, las pruebas tambien tienen coste. El codigo de pruebas no aparece de la nada: antes lo escribia, mantenia y justificaba el programador. En equipos que solo miran la velocidad de entrega a corto plazo, esto se suele recortar.&lt;/p&gt;
&lt;p&gt;Pero la IA cambia esta estructura de costes. Convertir requisitos en pruebas es precisamente una tarea en la que la IA es fuerte. Pedirle que implemente segun pruebas tambien es mucho mas fiable que dejarla improvisar a partir de una descripcion vaga.&lt;/p&gt;
&lt;h2 id=&#34;como-usar-tdd-al-programar-con-ia&#34;&gt;Como usar TDD al programar con IA
&lt;/h2&gt;&lt;p&gt;Al pedir una funcion a la IA, puedes cambiar el prompt de &amp;ldquo;ayudame a implementar esto&amp;rdquo; a este orden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pedir a la IA que primero enumere casos de prueba segun el requisito.&lt;/li&gt;
&lt;li&gt;Exigir que cada caso tenga una explicacion en chino o en el idioma de trabajo del equipo.&lt;/li&gt;
&lt;li&gt;Revisar primero si los casos de prueba representan la necesidad real.&lt;/li&gt;
&lt;li&gt;Despues de confirmar las pruebas, pedir a la IA que escriba la implementacion.&lt;/li&gt;
&lt;li&gt;Pedir a la IA que ejecute las pruebas y corrija segun los fallos.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;En ese momento, la persona revisa sobre todo si las pruebas expresan bien el requisito, no una gran implementacion. Los casos de prueba suelen estar mas cerca de &amp;ldquo;cual es la entrada, cual deberia ser la salida y como se manejan los bordes&amp;rdquo;, por lo que son mas faciles de leer que la logica interna.&lt;/p&gt;
&lt;p&gt;Por ejemplo, puedes pedirlo asi:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Primero no implementes la funcion.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Segun el requisito siguiente, escribe casos de prueba. Cada caso debe incluir un comentario en chino que explique la regla de negocio cubierta.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cuando confirme las pruebas, implementa el codigo segun ellas.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este flujo reduce dos problemas comunes: que la IA se desvie del tema y que cambios posteriores rompan funciones antiguas.&lt;/p&gt;
&lt;h2 id=&#34;tdd-no-basta&#34;&gt;TDD no basta
&lt;/h2&gt;&lt;p&gt;TDD por si solo todavia deja dos huecos.&lt;/p&gt;
&lt;p&gt;El primero: que todas las pruebas pasen no significa que el producto cumpla la expectativa. Las pruebas solo demuestran que el codigo cumple las reglas que se escribieron en ellas. Si las pruebas no expresan bien la necesidad del usuario, el codigo puede seguir &amp;ldquo;haciendo mal lo correcto&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;El segundo: el codigo de pruebas sigue sin ser amable para usuarios no tecnicos. Incluso con comentarios, muchas personas no quieren leer montones de tests unitarios. Cuanto mas orientado a experiencia de producto sea el requisito, mas dificil es confirmar desde pruebas si &amp;ldquo;esto es lo que queria&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Ahi entra BDD.&lt;/p&gt;
&lt;h2 id=&#34;que-problema-resuelve-bdd&#34;&gt;Que problema resuelve BDD
&lt;/h2&gt;&lt;p&gt;BDD significa Behavior Driven Development, desarrollo guiado por comportamiento. No se centra en como esta escrito el codigo por dentro, sino en que comportamiento debe mostrar el sistema en un escenario determinado.&lt;/p&gt;
&lt;p&gt;La forma habitual de describir BDD es Given / When / Then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Given&lt;/code&gt;: dado cierto estado inicial.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;When&lt;/code&gt;: cuando el usuario o el sistema realiza una accion.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Then&lt;/code&gt;: entonces debe obtenerse cierto resultado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Por ejemplo, un personaje de juego con robo de vida puede describirse asi:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Given hay un vampiro en el tablero con 1 punto de vida restante, 2 de ataque y 5 de vida maxima
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;And hay una unidad enemiga adyacente con 10 puntos de vida restantes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;When el vampiro ataca a esa unidad enemiga
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Then la unidad enemiga queda con 8 puntos de vida
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;And el vampiro se cura hasta 3 puntos de vida
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Esto no es codigo, pero es mucho mas preciso que &amp;ldquo;se cura al atacar al enemigo&amp;rdquo;. Define estado inicial, accion y resultado; tambien expone preguntas posteriores: si el enemigo solo tenia 1 punto de vida, ¿el vampiro se cura por el dano causado o por su ataque? Si el vampiro ya esta al maximo, ¿que ocurre con la curacion sobrante?&lt;/p&gt;
&lt;p&gt;Cuanto antes aparezcan estas preguntas, menos tendra que adivinar la IA despues.&lt;/p&gt;
&lt;h2 id=&#34;por-que-bdd-encaja-tan-bien-con-ia&#34;&gt;Por que BDD encaja tan bien con IA
&lt;/h2&gt;&lt;p&gt;Antes, impulsar BDD tambien tenia coste. Requeria que producto, desarrollo y QA hablaran con la misma descripcion de comportamiento, y muchos equipos no tienen ese habito de colaboracion.&lt;/p&gt;
&lt;p&gt;En la era de la IA, el coste de BDD baja. Solo necesitas escribir primero una necesidad aproximada, por ejemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Despues de atacar a un enemigo, el vampiro recupera una cantidad de vida igual al dano causado.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Luego pides a la IA que genere escenarios Given / When / Then. Una buena IA agregara casos limite y preguntara por reglas ambiguas. Tu trabajo sera confirmar esas descripciones de comportamiento, no leer directamente la implementacion.&lt;/p&gt;
&lt;p&gt;Una vez confirmadas las descripciones, pide a la IA que las convierta en pruebas y finalmente que implemente segun esas pruebas. El camino se vuelve mucho mas claro.&lt;/p&gt;
&lt;h2 id=&#34;un-flujo-mas-estable-para-programar-con-ia&#34;&gt;Un flujo mas estable para programar con IA
&lt;/h2&gt;&lt;p&gt;En la practica, puedes encadenar BDD y TDD:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Escribe el requisito en lenguaje natural.&lt;/li&gt;
&lt;li&gt;Pide a la IA que lo convierta en escenarios BDD.&lt;/li&gt;
&lt;li&gt;Confirma si Given / When / Then encajan con la expectativa.&lt;/li&gt;
&lt;li&gt;Pide a la IA que convierta esos escenarios en pruebas automaticas.&lt;/li&gt;
&lt;li&gt;Revisa rapidamente la cobertura de las pruebas.&lt;/li&gt;
&lt;li&gt;Pide a la IA que implemente la funcion.&lt;/li&gt;
&lt;li&gt;Ejecuta las pruebas; si fallan, pide a la IA que corrija segun los errores.&lt;/li&gt;
&lt;li&gt;Haz una aceptacion manual y una revision de codigo final.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La clave esta en el orden. No empieces pidiendo una implementacion completa. Primero haz que la IA convierta el requisito en comportamiento verificable y despues en pruebas ejecutables. Asi su espacio de improvisacion se reduce mucho.&lt;/p&gt;
&lt;p&gt;Puedes usar directamente un prompt como este:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Procesa este requisito siguiendo un flujo BDD + TDD.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Paso 1: primero organiza el requisito en escenarios Given / When / Then, sin escribir codigo.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Paso 2: enumera las reglas ambiguas que detectes y preguntame para confirmarlas.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Paso 3: cuando los escenarios esten confirmados, conviertelos en casos de prueba.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Paso 4: cuando las pruebas esten confirmadas, implementa la funcion.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Paso 5: ejecuta las pruebas y corrige segun los fallos hasta que pasen.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Este tipo de prompt no es complicado, pero cambia claramente la forma de trabajar de la IA. Primero acota el requisito y luego entra en implementacion, en vez de escribir desde el principio mucho codigo que parece completo pero resulta dificil de verificar.&lt;/p&gt;
&lt;h2 id=&#34;escenarios-donde-conviene-usarlo-primero&#34;&gt;Escenarios donde conviene usarlo primero
&lt;/h2&gt;&lt;p&gt;BDD + TDD no tiene que aplicarse a todo. Para scripts de una sola vez, procesamiento temporal de datos o pequenos ajustes de estilo, el flujo completo puede ser excesivo.&lt;/p&gt;
&lt;p&gt;Encaja mejor en estos casos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hay muchas reglas de negocio y se entienden mal con facilidad.&lt;/li&gt;
&lt;li&gt;Hay muchos bordes y se seguira modificando.&lt;/li&gt;
&lt;li&gt;Funciones de logica densa como juegos, facturacion, permisos, maquinas de estado o validacion de formularios.&lt;/li&gt;
&lt;li&gt;Hace falta confirmar requisitos entre varias personas.&lt;/li&gt;
&lt;li&gt;El codigo se mantendra a largo plazo, no se genera una sola vez.&lt;/li&gt;
&lt;li&gt;El proyecto ya muestra el problema de que &amp;ldquo;cuanto mas corrige la IA, mas se enreda&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si solo quieres cambiar el texto de un boton, no hace falta todo el proceso. Pero si vas a crear un sistema de habilidades de personajes, flujo de estados de pedidos, logica de permisos o reglas de puntos, escribir primero comportamientos y pruebas suele compensar.&lt;/p&gt;
&lt;h2 id=&#34;que-tener-en-cuenta&#34;&gt;Que tener en cuenta
&lt;/h2&gt;&lt;p&gt;Primero, mas pruebas no siempre es mejor. Las pruebas deben cubrir reglas clave y bordes de alto riesgo, no bloquear cada detalle de implementacion. Si no, cualquier cambio menor de requisito convierte las pruebas en una carga de mantenimiento.&lt;/p&gt;
&lt;p&gt;Segundo, los escenarios BDD deben ser concretos. No escribas frases como &amp;ldquo;el sistema deberia funcionar normalmente&amp;rdquo; o &amp;ldquo;la experiencia deberia ser fluida&amp;rdquo;, porque no son verificables. Hay que especificar el estado dado, la accion y el resultado esperado.&lt;/p&gt;
&lt;p&gt;Tercero, las personas aun deben revisar. La IA puede generar pruebas y escenarios de comportamiento, pero no sabe cual es tu verdadero criterio de producto. Las reglas limite, en especial, deben ser confirmadas por una persona.&lt;/p&gt;
&lt;p&gt;Cuarto, despues de pasar las pruebas hay que ejecutar la funcion real. Las pruebas automaticas ayudan con la logica, pero la experiencia de interfaz, rendimiento, interaccion y sensacion de usuario aun requieren aceptacion manual.&lt;/p&gt;
&lt;h2 id=&#34;resumen&#34;&gt;Resumen
&lt;/h2&gt;&lt;p&gt;La IA escribe codigo rapido, pero rapido no significa estable. Cuanto mas complejo es el requisito, menos conviene depender de un simple &amp;ldquo;ayudame a implementarlo&amp;rdquo;. Es mejor dividir primero la necesidad en comportamientos verificables, convertirlos en pruebas ejecutables y finalmente dejar que la IA implemente segun esas pruebas.&lt;/p&gt;
&lt;p&gt;TDD le dice a la IA que resultado cuenta como correcto. BDD ayuda a las personas a confirmar si esa funcion es realmente la que quieren. Juntos no agregan ceremonia por la ceremonia, sino que reducen el espacio de adivinacion de la IA y convierten &amp;ldquo;escribir rapido&amp;rdquo; en &amp;ldquo;modificar de forma estable&amp;rdquo;.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
