Gratis · Sin registro

Ejemplos reales de QA:
historia de usuario, casos de prueba y bug report.

El QA no se aprende leyendo definiciones. Se aprende viendo cómo se hace. Aquí tienes un ejemplo completo y real: desde la historia de usuario hasta el bug report, pasando por los criterios de aceptación y los casos de prueba.

La funcionalidad de ejemplo es un sistema de cupones de descuento: algo que cualquier persona conoce y que tiene más casuística de la que parece a primera vista.

Historia de usuario

Todo empieza aquí. Antes de testear nada, el QA necesita entender qué se está construyendo y para quién. La historia de usuario es la forma en que los equipos ágiles definen una funcionalidad desde el punto de vista del usuario.

¿Qué es una historia de usuario?

Una historia de usuario describe una funcionalidad desde el punto de vista de quien la va a usar, no desde el punto de vista técnico. El formato estándar es: "Como [tipo de usuario], quiero [hacer algo], para [conseguir un beneficio]". Este formato obliga a pensar en el por qué, no solo en el qué.

US-042 Sistema de cupones de descuento Historia de usuario
Como usuario registrado que quiere adquirir un curso de pago, quiero poder introducir un código de descuento en el proceso de compra, para que el precio final se actualice automáticamente reflejando el descuento antes de completar el pago.

Contexto y alcance

Queremos dar la posibilidad a los usuarios de aplicar códigos de descuento antes de pagar. Los códigos pueden ser de porcentaje (ej: 10% de descuento) o de importe fijo (ej: 5€ menos). El precio debe actualizarse en tiempo real en cuanto el código se valide correctamente.

La validación debe ocurrir siempre en el backend, nunca en el frontend, para evitar manipulaciones. Un código puede estar caducado, ya haber sido usado por ese usuario, haber agotado su límite global de usos o no ser aplicable al curso que se está comprando. Cada caso tiene su propio mensaje de error.

El descuento debe persistir si el usuario recarga la página o navega atrás, pero se invalida automáticamente si el usuario lleva más de 30 minutos en el checkout sin completar la compra.

Criterios de aceptación principales

Campo de cupón visible en el checkout antes del botón de pago. Botón "Aplicar" deshabilitado mientras el campo esté vacío.
El campo acepta mayúsculas y minúsculas indistintamente. Los espacios al inicio o final se ignoran automáticamente.
Si el código es válido: precio original tachado, precio con descuento aplicado y opción para eliminar el código.
Mensajes de error específicos según el motivo: código inválido, caducado, ya usado, límite agotado o no aplicable al curso.
Solo se puede aplicar un código por compra. El precio resultante nunca puede ser negativo (mínimo 0,00€).
El precio cobrado por Stripe debe coincidir con el precio calculado en el servidor, nunca con el mostrado en el DOM.

Junto a la historia, el equipo de diseño entrega el diseño en Figma: la referencia visual de cómo tiene que verse la funcionalidad. El QA lo usa para verificar que lo implementado coincide con lo diseñado.

17lab / Checkout / US-042 / Cupón de descuento Figma: Diseño de referencia

Resumen de tu compra

Aprende QA desde cero 49€
Código de descuento
Aplicar
Total 49€
Pagar 49€
Estado inicial: sin cupón

Resumen de tu compra

Aprende QA desde cero 49€
BIENVENIDO10
Eliminar
✓ 10% de descuento aplicado −4,90€
Total 44,10€
Pagar 44,10€
Cupón válido aplicado

Resumen de tu compra

Aprende QA desde cero 49€
INVALIDO123
Aplicar

Este código no es válido. Revisa que esté escrito correctamente.

Total 49€
Pagar 49€
Error: código inválido

Los tres estados que el QA tiene que verificar: sin cupón, cupón válido aplicado y error. El diseño define exactamente qué debe verse en cada caso: colores, textos, disposición de elementos.

El papel del QA en este momento

Cuando el QA recibe la historia y el diseño, su primer trabajo no es testear: es hacer preguntas. ¿Qué pasa si el código caduca mientras el usuario está en el checkout? ¿Dónde se valida el descuento, en el frontend o en el backend? ¿El precio del botón de pago también se actualiza? Las preguntas que el QA hace antes de empezar a desarrollar son las que evitan bugs después. Muchos de los criterios de aceptación de esta historia surgieron exactamente así, de preguntas que alguien hizo a tiempo.


Criterios de aceptación

Los criterios de aceptación son las condiciones concretas que la funcionalidad tiene que cumplir para considerarse correctamente implementada. Son el puente entre la historia de usuario y los casos de prueba.

¿Por qué son tan importantes?

Sin criterios de aceptación, cada persona del equipo entiende la funcionalidad a su manera. El desarrollador puede implementar algo que técnicamente funciona pero que no es lo que el usuario espera. Los criterios eliminan esa ambigüedad. Un criterio bien escrito es específico, verificable y sin interpretación posible.

Campo y botón
AC-01
El campo para introducir el código es visible en el checkout antes del botón de pago
AC-02
El botón "Aplicar" está deshabilitado mientras el campo esté vacío
AC-03
Al pulsar "Aplicar" el botón muestra un estado de carga mientras se valida el código en el servidor
AC-04
La validación siempre ocurre en backend, el frontend nunca determina si un código es válido o no
Tipos de descuento y cálculo
AC-05
Un código puede ser de tipo porcentaje (ej: 10%) o importe fijo (ej: 5€); ambos tipos son soportados
AC-06
El descuento se aplica sobre el precio final con IVA incluido y se redondea a 2 decimales
AC-07
Si el descuento de importe fijo es mayor que el precio del curso, el precio resultante es 0,00€, nunca negativo
Feedback al usuario
AC-08
El campo acepta mayúsculas y minúsculas indistintamente: BIENVENIDO10 y bienvenido10 funcionan igual
AC-09
Si el código es válido: precio original tachado, precio con descuento, tipo aplicado y opción para eliminar el código
AC-10
Código no existe → "Este código no es válido. Revisa que esté escrito correctamente."
AC-11
Código caducado → "Este código ha expirado."
AC-12
Código ya usado por ese usuario → "Este código ya ha sido utilizado en una compra anterior."
AC-13
Límite global de usos agotado → "Este código ya no está disponible."
AC-14
Código no aplicable al curso seleccionado → "Este código no es válido para este curso."
Restricciones y persistencia
AC-15
Solo se puede aplicar un código de descuento por compra
AC-16
Si el usuario recarga la página o navega atrás, el código y el descuento se mantienen
AC-17
Si el usuario lleva más de 30 minutos sin completar la compra, el código se invalida y debe volver a introducirlo
Criterio ambiguo vs criterio bien escrito

La diferencia entre un criterio útil y uno inútil es la especificidad.

✗ Ambiguo
"El sistema muestra un mensaje de error cuando el código no es válido."
✓ Bien escrito
"Si el código no existe, se muestra el mensaje: 'Este código no es válido. Revisa que esté escrito correctamente.' El precio no se modifica."

Casos de prueba

Los casos de prueba son el plan de trabajo del QA. Definen exactamente qué hay que probar, cómo y cuál es el resultado correcto. Un buen conjunto de casos de prueba cubre el happy path, los casos negativos y los edge cases.

Happy path, casos negativos y edge cases

Happy path: el flujo ideal donde todo funciona correctamente. Es lo primero que hay que validar, pero solo cubrirlo no es suficiente. Casos negativos: qué pasa cuando algo falla: código inválido, caducado, ya usado... Edge cases: los límites del sistema: descuento mayor que el precio, código con espacios, precio de 0€. Los bugs más frecuentes aparecen aquí.

IDDescripciónPasosResultado esperadoTipo
CP-001Código válido de porcentaje
  • Ir al checkout
  • Introducir BIENVENIDO10
  • Pulsar "Aplicar"
Precio original tachado, descuento del 10% aplicado, mensaje de confirmaciónHappy path
CP-002Código válido de importe fijo
  • Curso de 19€ en checkout
  • Introducir 5EUROS
  • Pulsar "Aplicar"
Precio resultante 14,00€Happy path
CP-003Código en minúsculas
  • Introducir bienvenido10
  • Pulsar "Aplicar"
Descuento aplicado correctamente, no distingue mayúsculasEdge case
CP-004Botón deshabilitado con campo vacío
  • No introducir nada
  • Intentar pulsar "Aplicar"
Botón deshabilitado, no se puede pulsarNegativo
CP-005Código inexistente
  • Introducir XXXXXXXXX
  • Pulsar "Aplicar"
Mensaje de error. Precio sin cambiosNegativo
CP-006Código caducado
  • Introducir código con fecha pasada
  • Pulsar "Aplicar"
"Este código ha expirado." Precio sin cambiosNegativo
CP-007Código ya usado por el usuario
  • Usuario que ya usó el código
  • Intentar aplicarlo de nuevo
"Este código ya ha sido utilizado." Precio sin cambiosNegativo
CP-008Límite global de usos agotado
  • Código con 100 usos máximos alcanzados
  • Intentar aplicarlo
"Este código ya no está disponible."Negativo
CP-009Código no válido para ese curso
  • Código solo válido para curso de empleo
  • Aplicarlo en checkout del curso QA Junior
"Este código no es válido para este curso."Negativo
CP-010Eliminar código aplicado
  • Código ya aplicado
  • Pulsar "Eliminar código"
Precio vuelve al original, campo vacío y habilitadoHappy path
CP-011Descuento mayor que el precio
  • Curso de 19€
  • Código con descuento de 25€
Precio resultante 0,00€, nunca negativoEdge case
CP-012Estado de carga al pulsar "Aplicar"
  • Introducir código válido
  • Pulsar "Aplicar"
  • Observar el botón durante la petición
Botón en estado de carga, no se puede pulsar dos vecesUX
CP-013Persistencia al recargar
  • Código ya aplicado
  • Recargar la página
Código y descuento se mantienenPersistencia
CP-014Persistencia al navegar atrás
  • Código ya aplicado
  • Pulsar atrás y volver
Código y descuento se mantienenPersistencia
CP-015Caducidad por inactividad
  • Código aplicado
  • Dejar la página 30+ minutos
  • Intentar pagar
Aviso de código expirado por inactividadEdge case
CP-016Intentar aplicar segundo código
  • Código A ya aplicado
  • Introducir código B
  • Pulsar "Aplicar"
"Ya tienes un código aplicado. Elimínalo antes de introducir uno nuevo."Negativo
CP-017Corregir código inválido y reaplicar
  • Introducir código con error tipográfico
  • Ver error
  • Corregirlo y reaplicar
Error desaparece al editar, segundo intento aplica correctamenteUX
CP-018Código con espacios en blanco
  • Introducir BIENVENIDO10 con espacios
  • Pulsar "Aplicar"
Sistema elimina espacios automáticamente y aplica el descuentoEdge case
CP-019Validación en backend
  • Código aplicado
  • Modificar precio en el DOM
  • Completar pago
Precio cobrado = precio calculado en servidor. La manipulación del DOM no afectaSeguridad
CP-020Precio cobrado = precio mostrado
  • 10% descuento sobre 49€
  • Verificar checkout: 44,10€
  • Completar pago
  • Verificar recibo de Stripe
Importe cobrado = 44,10€ en checkout, recibo y email de confirmaciónHappy path
CP-021Formato del precio
  • 5€ descuento sobre 19€
  • Observar precio resultante
Se muestra 14,00€: con coma, dos decimales y € al final. Nunca 14€ ni 14.00€UX
¿Por qué el CP-019 es responsabilidad del QA?

Puede parecer un tema de seguridad que le corresponde al desarrollador. Pero el QA es quien verifica que el sistema es seguro de principio a fin. Manipular el DOM para alterar precios es una de las técnicas más básicas de fraude en ecommerce: si el backend no valida el precio, cualquiera puede pagar 0€ por cualquier cosa. El QA tiene que probarlo.


Bug report

Ejecutando los casos de prueba anteriores, el CP-021 ha fallado. El botón de pago muestra el precio original en lugar del precio con descuento. Así se documenta correctamente.

¿Qué es la severidad y en qué se diferencia de la prioridad?

Severidad: el impacto técnico del bug. ¿Cómo de grave es el fallo en sí mismo? Prioridad: la urgencia para corregirlo. ¿Cómo de rápido hay que solucionarlo? Un bug puede tener severidad alta pero prioridad media si afecta a algo que no está en producción todavía. O severidad baja pero prioridad alta si está bloqueando el trabajo del equipo.

BUG-001 El botón de pago muestra el precio original tras aplicar un descuento Severidad: Alta Abierto
Entorno
Chrome 124 Windows 11 Staging 17lab.pro/checkout Usuario registrado
Descripción
Al aplicar un código de descuento válido en el checkout, el resumen de la compra se actualiza correctamente mostrando el precio con descuento, pero el botón de pago sigue mostrando el precio original. El usuario ve dos precios diferentes en la misma pantalla, lo que genera confusión y desconfianza antes de completar la compra.
Pasos para reproducir
  • 1. Iniciar sesión en 17lab.pro
  • 2. Ir al checkout del curso "Consigue tu primer empleo como QA" (19€)
  • 3. Introducir el código BIENVENIDO10 en el campo de cupón
  • 4. Pulsar "Aplicar"
  • 5. Observar el resumen de la compra y el botón de pago
Resultado obtenido
El resumen muestra 17,10€ (correcto). El botón de pago muestra "Pagar 19€" (incorrecto).
Resultado esperado
Tanto el resumen como el botón deben mostrar el mismo precio: 17,10€. El botón debe decir "Pagar 17,10€".
Evidencia visual
17lab.pro/checkout
Resumen de tu compra
Consigue tu primer empleo como QA 19€
BIENVENIDO10
Aplicado ✓
✓ 10% de descuento aplicado −1,90€
Total 17,10€
El resumen muestra 17,10€ pero el botón dice "Pagar 19€": ahí está el bug
Notas para el desarrollador
Este bug afecta directamente a la confianza del usuario en el proceso de pago. Un usuario podría abandonar la compra al pensar que el descuento no se ha aplicado correctamente, o completarla creyendo que va a ser cobrado por el precio incorrecto. Parece que el componente del botón no está escuchando la actualización del precio cuando se aplica el descuento: el resumen sí lo actualiza pero el botón no. Prioridad alta antes del lanzamiento de la funcionalidad.
Por qué las notas finales importan

Un bug report no es solo documentar lo que falla. Es comunicar el impacto real al desarrollador que lo va a corregir. Las notas finales explican el contexto, sugieren dónde puede estar el problema y dan al dev toda la información que necesita sin tener que preguntar. Un buen bug report ahorra tiempo a todo el equipo.

¿Quieres aprender a hacer esto desde cero?

Todo lo que has visto aquí (historias de usuario, criterios de aceptación, casos de prueba, bug reports) es el trabajo real de un QA Junior. Si quieres aprender a hacerlo bien y conseguir tu primer empleo en el sector, estás en el sitio correcto.

Otros recursos gratuitos y cursos que te pueden interesar: