Blog
Cómo estructurar los casos de prueba en una aplicación vibecodeada

En esta página
Una aplicación vibecodeada se construye describiendo lo que se quiere en lenguaje natural y dejando que una IA genere el código. Funciona rápido, pero ese código suele cubrir lo que pediste y poco más. Puede pasar las comprobaciones básicas y esconder inconsistencias, fallos en casos límite y riesgos de seguridad que solo aparecen en condiciones reales. Un caso de prueba bien estructurado es la forma más barata de encontrarlos antes de que lo hagan tus usuarios. testfort
Empieza con un objetivo claro
Un caso de prueba describe un comportamiento específico que se quiere comprobar. Anota el objetivo, las condiciones iniciales y la información necesaria antes de seguir los pasos.
Un escenario ilustrativo
Imagina un formulario de práctica con un campo de nombre obligatorio. El objetivo es comprobar qué ocurre cuando ese campo está vacío.
- Abre el formulario de práctica en su estado inicial.
- Deja el campo de nombre vacío y selecciona Enviar.
- Comprueba el resultado esperado: un mensaje explica que el nombre es obligatorio y el formulario sigue disponible para corregirlo.
Registra lo que ocurrió
Mantén el resultado observado separado del resultado esperado. Si difieren, describe la diferencia y las condiciones necesarias para reproducirla. Este ejemplo no presenta una prueba ejecutada ni un resultado medido.
Por qué una app vibecodeada pide un enfoque propio
En un desarrollo tradicional, las pruebas se apoyan en que el código cambia de forma controlada. Con vibe coding eso se rompe: las pruebas escritas contra una versión del código generado pueden fallar cuando este se regenera o se actualiza, y a veces no queda claro si el problema está en el código, en el prompt que lo creó o en la propia prueba. testrigor
Por eso los casos de prueba de estas apps conviene anclarlos a lo que el usuario ve y hace, no a cómo está construido por dentro. Como el código puede cambiar bajo el capó, apoyarse en la estructura interna es una estrategia débil. testrigor
También hay un motivo de seguridad. Un análisis de Veracode de 2025 encontró que el 45 % del código generado por IA contiene vulnerabilidades del OWASP Top 10. Ese dato no significa que tu app las tenga, pero justifica incluir casos de acceso y autenticación desde el principio. frugaltesting
Anatomía de un buen caso de prueba
Todos los casos deberían compartir la misma estructura. Los campos habituales son:
| Campo | Qué debe contener |
|---|---|
| ID y título | Un identificador único y un título que diga qué se verifica (por ejemplo, «TC-FORM-003: Enviar con nombre vacío»). |
| Objetivo | El comportamiento concreto que se quiere comprobar, en una frase. |
| Precondiciones | Lo que debe ser cierto antes de empezar: estado de la app, usuario, datos de prueba. |
| Pasos | Acciones breves, en el orden en que las haría una persona real. |
| Resultado esperado | Lo que debería ocurrir, de forma verificable: mensaje exacto, redirección, dato guardado. |
| Resultado observado | Lo que ocurrió realmente al ejecutarlo (se rellena después). |
| Estado | Aprobado o fallido, según si observado y esperado coinciden. |
Algunas reglas que mejoran cualquier caso:
- Un caso, un comportamiento. Si un caso intenta probar varias cosas a la vez o tiene demasiados pasos, conviene dividirlo en casos más pequeños, cada uno centrado en una función. testdevlab
- Define las precondiciones y los datos de prueba. Así quien ejecute el caso no tiene que adivinar nada. Basta con algo como «usar una cuenta de prueba válida» en lugar de un correo concreto que pueda cambiar.
- Si hay varios resultados intermedios, anótalos paso a paso. Cuando los pasos son complejos, lo más sensato es definir el resultado esperado después de cada paso y no solo al final. testdevlab
- Sé específico. «Se guarda el nombre» es vago. «Aparece el mensaje de confirmación y el perfil muestra el nuevo nombre» se puede comprobar.
Empieza explorando, luego estructura
En una app que no conoces bien, escribir casos formales demasiado pronto suele ser un error. Comenzar con pruebas exploratorias ayuda a descubrir riesgos desconocidos antes de invertir tiempo en casos estructurados o en automatización. Usa la app como lo haría una persona real, anota lo que te sorprenda y convierte los hallazgos importantes en casos repetibles. testfort
Qué familias de casos cubrir primero
No todas las funciones merecen el mismo esfuerzo. Prioriza los flujos críticos del negocio y organiza los casos por tipo de riesgo. Estas categorías suelen dar buen rendimiento en apps generadas con IA:
- Validación de formularios. Campos vacíos, formatos inválidos, valores límite. Es el ejemplo de este artículo. Un estudio informal con seis apps públicas creadas con Bolt, Lovable y Base44 encontró, entre otros problemas, una calculadora financiera que daba un veredicto optimista a partir de entradas en blanco. plushcap
- Persistencia y recarga. Recarga la página en mitad de un flujo y comprueba si se pierde el progreso. Ese mismo estudio detectó pérdida silenciosa de estado tras recargar en dos de las seis apps. plushcap
- Errores de consola y de red. Abre las herramientas del navegador mientras ejecutas los casos. Los errores visibles ahí a menudo no se ven en la pantalla. En el estudio citado, cinco de las seis apps tenían errores de consola o de red. plushcap
- Acceso y permisos. Qué ve un usuario sin sesión, qué ocurre si un usuario intenta abrir datos de otro. Son casos que el prompt original casi nunca pidió.
- Casos límite y entradas inesperadas. Textos muy largos, caracteres especiales, conexión interrumpida, doble clic en un botón.
- Seguridad básica. Revisa que no haya credenciales escritas en el código y que las entradas no se manejen de forma insegura. Los modelos suelen incrustar claves de API, contraseñas de bases de datos y tokens directamente en el código generado. Esto complementa los casos funcionales, pero no los sustituye por un análisis de seguridad especializado. noqta
Un ejemplo completo con la plantilla
Siguiendo la estructura anterior, el escenario del formulario quedaría así:
- ID y título: TC-FORM-003, Enviar el formulario con el nombre vacío.
- Objetivo: Comprobar que el campo de nombre es obligatorio.
- Precondiciones: El formulario está en su estado inicial, sin datos escritos.
- Pasos:
- Dejar el campo de nombre vacío.
- Seleccionar Enviar.
- Resultado esperado: Aparece un mensaje que indica que el nombre es obligatorio, no se envía ningún dato y el formulario sigue disponible para corregirlo.
- Resultado observado: (se rellena al ejecutar el caso)
- Estado: (pendiente)
Si al ejecutarlo el formulario se enviara sin avisar, registrarías la diferencia así: «Esperado: mensaje de campo obligatorio. Observado: el formulario se envía y muestra la pantalla de éxito. Reproducible siempre, en estado inicial, con el campo vacío». Esa redacción es suficiente para que quien arregle el problema, o quien le pida a la IA que lo arregle, sepa exactamente qué corregir.
Cómo mantener los casos vivos
- Vuelve a ejecutarlos después de cada sesión importante de prompts. Un cambio pequeño en la interfaz puede afectar a varias partes de la app sin que lo notes.
- Vincula cada caso al requisito que protege. Si el requisito cambia, sabrás qué casos revisar.
- Evita pasos atados a detalles que cambian a menudo. Escribe «seleccionar Enviar» en lugar de depender de coordenadas, colores o textos secundarios.
- Retira o actualiza los casos obsoletos. Un caso que ya no describe la app genera falsos fallos y desconfianza.
- Automatiza después, no antes. Cuando un caso se vuelva estable y se repita a menudo, es buen candidato para automatizar, pero empieza por los más críticos.
Errores frecuentes
- Pasos vagos como «probar el formulario».
- Casos sin resultado esperado.
- Casos largos que mezclan varias comprobaciones.
- Confiar en que, si la demo funciona, todo funciona.
- Escribir solo los caminos felices y olvidar entradas vacías, inválidas o inesperadas.
Conclusión
Estructurar bien los casos de prueba convierte el «a mí me funciona» de una app vibecodeada en evidencia que otros pueden repetir. Define un objetivo, fija las condiciones iniciales, escribe pasos claros, separa lo esperado de lo observado y prioriza por riesgo. No hace falta cubrirlo todo desde el primer día: empieza por los flujos que más importan y amplía a medida que la app crece.
Fuentes consultadas: Vibe Testing (TestFort) · What are Vibe Coding Tests? (testRigor) · How to Test Vibe-Coded Software Before It Reaches Production (Frugal Testing) · 9 Vibe Coding Risks and How to Test for Them (TestMu AI) · Why 45% of Vibe-Coded Apps Have Security Holes (Noqta) · How to write good test cases (TestDevLab) · Best Practices for Writing Test Cases (TestDevLab)