Ir al contenido
wannacode

Transiciones de estado

En resumen: La máquina de estados da tres medidas para las pruebas: se visita cada estado (2 pruebas para el pedido), se recorre cada transición válida (3 pruebas) y se intenta y se rechaza cada transición inválida. Las inválidas son la mayoría: de 30 pares «estado y evento», 6 son válidos. También son las que nadie prueba.

Problema

El pedido cancelado y pagado

Un cliente cancela un pedido nuevo. Luego, en otra pestaña del navegador donde la página de pago sigue abierta, pulsa «Pagar». El pago se realiza. El pedido pasa a «pagado», el almacén lo empaqueta, la mensajería lo entrega.

Las pruebas del pedido pasaban: pagar un pedido nuevo, cancelar un pedido nuevo, enviar uno pagado. Cada una era una transición permitida. Nadie había probado una prohibida.

La idea

La máquina como pruebas

En la lección «Cuando una tabla es más clara» la máquina de estados era un requisito. Aquí está completa, con la transición que allí faltaba:

Desde Evento y guarda A
nuevo el cliente paga pagado
nuevo el cliente cancela cancelado
pagado el cliente cancela (antes del envío) cancelado
pagado el almacén entrega el paquete enviado
enviado la mensajería entrega entregado
entregado el cliente pide una devolución, dentro de 14 días desde la recepción devuelto

Seis estados, seis transiciones válidas. «Cancelado» y «devuelto» son finales: no hay salida de ellos.

Una prueba aquí no es una entrada y una salida. Es un camino: una secuencia de eventos, y después de cada uno se comprueba el estado. Esto son las pruebas de transiciones de estado.

En las tareas de esta lección una fila de la tabla es un camino desde un pedido nuevo («pagar, enviar»), y lo que se comprueba es el estado al final y si el último evento se rechazó. Junto a la tabla hay un diagrama de la máquina: ve a una fila y se ilumina a lo largo de su camino.

La idea

Tres medidas

¿Cuántos caminos hacen falta? Depende de lo que quieras cubrir.

  • Todos los estados: cada estado se visita al menos una vez. Aquí bastan 2 pruebas. Cuáles, lo encontrarás en la tarea.
  • Todas las transiciones válidas: cada fila de la tabla se recorre al menos una vez. Las dos pruebas recorren 5 de las 6 transiciones, y la sexta necesita una tercera. 3 pruebas.
  • Todas las transiciones: las válidas, y cada una de las inválidas, intentada y rechazada. Aquí las pruebas pasan a ser muchas más.

Cada medida incluye la anterior. Todos los estados es la débil: el error del principio vivía en una transición a la que no llegaba ningún camino.

Más precisamente, para curiosos

ISTQB CTFL v4.0.1 describe la técnica en la sección 4.2.4 (pruebas de transiciones de estado) con estas tres medidas: cobertura de todos los estados, cobertura de transiciones válidas (también llamada cobertura 0-switch) y cobertura de todas las transiciones. La máquina se puede escribir como un diagrama o como una tabla de estados. La tabla muestra también las transiciones inválidas, el diagrama normalmente no.

Para los sistemas críticos (trenes, aparatos médicos) las pruebas no bastan. Allí la máquina de estados se comprueba además de forma formal: una herramienta demuestra que ningún camino lleva a un estado prohibido. Eso es la verificación de modelos (model checking), un tipo de verificación formal. IEEE 1012 liga la cantidad de comprobación al nivel de integridad: cuanto más cara es la falla, más comprobación. Para la tienda la comprobación formal es demasiado cara, para el freno de un tren no.

Pruébalo

Todos los estados

Escribe los caminos que visitan cada uno de los seis estados. Bastan dos filas.

La regla: Un pedido nuevo se paga, uno pagado se envía, uno enviado se entrega y uno entregado se devuelve. Un pedido nuevo o pagado se puede cancelar antes de enviarlo. Cancelado y devuelto son estados finales. Cualquier otro evento se rechaza, y el pedido se queda donde está.

Ponte en una fila y el diagrama iluminará su camino.

EntradaEsperadoEl sistema correcto
#CaminoAl finalÚltimo rechazado
Fila 1

Un camino es una serie de eventos desde un pedido nuevo: «pagar, enviar» (con coma o espacio). El estado se escribe con la palabra: nuevo, pagado, enviado, entregado, cancelado, devuelto. Una celda de resultado vacía no se comprueba.

La idea

Transiciones inválidas

La tabla de transiciones enumera lo que está permitido. Más útil para probar es la tabla estado × evento: cada celda dice qué pasa si el evento llega en ese estado.

Estado pagar cancelar enviar entregar devolver
nuevo pagado cancelado — — —
pagado — cancelado enviado — —
enviado — — — entregado —
entregado — — — — devuelto (dentro de 14 días)
cancelado — — — — —
devuelto — — — — —

30 celdas, 6 válidas. Las otras 24 son transiciones inválidas («—»). Cada una es una prueba: inténtala y comprueba que se rechaza.

Una prueba de una transición inválida comprueba tres cosas: el intento se rechaza, el estado no ha cambiado y el cliente ve por qué. Y un intento inválido por prueba: si el primero pasa por error, el pedido ya está en otro estado, y el segundo intento prueba otra cosa.

Pruébalo

¿Está prohibido?

1. El pedido está enviado. El cliente pulsa «Cancelar». ¿Qué espera la prueba?
2. ¿Por qué las transiciones inválidas se prueban una por prueba?
3. Un pedido entregado, el cliente pide la devolución el día 16. ¿Cuál es la prueba?

La idea

Guardas en las transiciones

Algunas transiciones tienen una guarda. «Entregado → devuelto» ocurre solo si la devolución se pide dentro de los 14 días desde la recepción. El evento es uno, pero el resultado depende de la guarda.

Aquí se encuentran las técnicas. La guarda es un número, así que tiene un límite: el día 14 se acepta, el día 15 se rechaza (si el paquete se recibió el día 1, son el 15 y el 16). La máquina dice dónde probar, los valores límite dicen con qué.

Lo mismo con «pagado → cancelado»: la guarda es «antes del envío». La prueba son dos: cancelar un pedido pagado antes de que el almacén lo entregue, y un intento de cancelar justo después.

Ejercicio

Todas las transiciones

1. Todas las transiciones y las inválidas. El evento inválido va al final del camino: así la fila comprueba solo ese. Empieza por las más arriesgadas: pagar, enviar, cancelar o devolver cuando no se debe. La columna «Último rechazado» importa: en algunos errores el estado es el mismo, y la única diferencia es el rechazo.

Escribe caminos para cada una de las seis transiciones válidas y una fila para las transiciones inválidas hasta atrapar todos los errores.

La regla: Un pedido nuevo se paga, uno pagado se envía, uno enviado se entrega y uno entregado se devuelve. Un pedido nuevo o pagado se puede cancelar antes de enviarlo. Cancelado y devuelto son estados finales. Cualquier otro evento se rechaza, y el pedido se queda donde está.

Ponte en una fila y el diagrama iluminará su camino.

EntradaEsperadoEl sistema correcto
#CaminoAl finalÚltimo rechazado
Fila 1

Un camino es una serie de eventos desde un pedido nuevo: «pagar, enviar» (con coma o espacio). El estado se escribe con la palabra: nuevo, pagado, enviado, entregado, cancelado, devuelto. Una celda de resultado vacía no se comprueba.

Test

Ponte a prueba

1. Las pruebas visitan todos los estados. ¿Recorren también todas las transiciones?
2. ¿Cuál es la medida más fuerte?
3. La tabla «estado × evento» del pedido tiene 6 estados y 5 eventos. ¿Cuántas celdas son transiciones inválidas?
4. ¿Qué es una guarda en una transición?
5. ¿Por qué las transiciones inválidas son las pruebas que más se olvidan?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·