Saltar al contenido

Lección 12: Diseñar pruebas que encuentren errores

Las pruebas que encuentran errores necesitan resultados esperados tomados del requisito, escenarios que muestren que cada entrada importa, y una forma de comprobar si el conjunto de pruebas notaría un error. Tres pasos, nivel avanzado, unos quince minutos.

Nivel: avanzado15 min7 afirmaciones de esta lección fueron confirmadas por el comprobador exacto al compilar

Escribe los resultados esperados a partir del requisito, muestra la influencia de cada entrada con escenarios emparejados y usa pruebas de mutación para ver si tus pruebas detectarían un error.

El primer paso separa el oráculo del código: un resultado esperado debe venir del requisito («las personas vetadas nunca entran»), no de ejecutar la fórmula, porque una fórmula con un desliz produce respuestas con el desliz y con total confianza. El segundo muestra la influencia de cada entrada con un par de escenarios que difieren solo en esa entrada y dan salidas distintas; para la regla de entrada, cuatro escenarios cubren las tres entradas. El tercero introduce las pruebas de mutación: pequeños errores deliberados como (member AND invited) AND NOT banned, un mutante que cambia OR por AND, se ejecutan contra el conjunto de pruebas, y un mutante muere cuando alguna prueba falla sobre él.

La comparación del mutante en la lección es una afirmación verificada de que el mutante difiere del original. Los ejercicios piden una asignación que mate a un mutante con un NOT eliminado, otra que mate a un mutante con el AND exterior sustituido por OR, un juicio sobre un mutante que solo reordenó operandos (equivalente, así que ninguna prueba puede matarlo), y un resultado esperado escrito a partir del requisito y no de una fórmula.

La sección de pruebas amplía cada paso en una página: pares de independencia para MC/DC, pruebas de mutación para reglas booleanas, y el error de que la cobertura no es corrección. El informe de mutación de la app clasifica cada mutante como muerto, superviviente o equivalente, y ofrece convertir el testigo de un mutante superviviente en una prueba.

Haz esta lección de forma interactiva en la app

Pasos

1. Los resultados esperados salen del requisito

Una prueba combina un escenario de entrada con un resultado esperado. Esa expectativa debe salir del requisito («quien tiene la entrada prohibida nunca entra»), no de ejecutar la fórmula.

Esta fórmula tiene un error: member OR invited AND NOT banned deja entrar a una socia con la entrada prohibida. Una prueba cuyo valor esperado se hubiera copiado de la fórmula también diría TRUE y se superaría, así que no demuestra nada. Tangibool marca las salidas copiadas como exploratorias, no como prueba de la intención.

allow_entry := member OR invited AND NOT banned · salida

member: la persona es socia; invited: la persona tiene una invitación; banned: la persona tiene prohibida la entrada; allow_entry: la persona puede entrar;

Los resultados esperados salen del requisito
#memberinvitedbannedallow_entry
0FALSOFALSOFALSOFALSO
1FALSOFALSOVERDADEROFALSO
2FALSOVERDADEROFALSOVERDADERO
3FALSOVERDADEROVERDADEROFALSO
4VERDADEROFALSOFALSOVERDADERO
5VERDADEROFALSOVERDADEROVERDADERO
6VERDADEROVERDADEROFALSOVERDADERO
7VERDADEROVERDADEROVERDADEROVERDADERO

Añade una prueba member=TRUE, invited=FALSE, banned=TRUE con el valor esperado FALSE según el requisito y ejecútala.

2. Demostrar que cada entrada importa

Las buenas pruebas demuestran la influencia de cada entrada con una pareja de escenarios que solo difieren en esa entrada y dan salidas distintas. Para la regla de entrada bastan cuatro escenarios:

- member=FALSE, invited=FALSE, banned=FALSE da FALSE; - cambiar solo member da TRUE; - cambiar solo invited da TRUE; - member=TRUE, invited=FALSE, banned=TRUE da FALSE (forma pareja con el escenario de socia).

La cobertura mide lo que tus pruebas han ejercitado; nunca sustituye a unos resultados esperados independientes.

allow_entry := (member OR invited) AND NOT banned · salida

member: la persona es socia; invited: la persona tiene una invitación; banned: la persona tiene prohibida la entrada; allow_entry: la persona puede entrar;

Demostrar que cada entrada importa
#memberinvitedbannedallow_entry
0FALSOFALSOFALSOFALSO
1FALSOFALSOVERDADEROFALSO
2FALSOVERDADEROFALSOVERDADERO
3FALSOVERDADEROVERDADEROFALSO
4VERDADEROFALSOFALSOVERDADERO
5VERDADEROFALSOVERDADEROFALSO
6VERDADEROVERDADEROFALSOVERDADERO
7VERDADEROVERDADEROVERDADEROFALSO

Guarda los cuatro escenarios como pruebas y abre la vista de cobertura.

3. Pruebas de mutación: ¿lo notarían tus pruebas?

Las pruebas de mutación introducen pequeños errores deliberados (mutantes), como cambiar OR por AND o quitar un NOT, y vuelven a ejecutar tu conjunto de pruebas. Un mutante queda eliminado cuando alguna prueba falla con él.

(member AND invited) AND NOT banned queda eliminado con la prueba member=TRUE, invited=FALSE, banned=FALSE: se esperaba TRUE y el mutante da FALSE. Un mutante que se comporta exactamente igual que el original es equivalente; Tangibool lo identifica con una comprobación exacta, así que nunca cuenta en contra de tu puntuación.

original := (member OR invited) AND NOT banned · salidamutant := (member AND invited) AND NOT banned · salida

member: la persona es socia; invited: la persona tiene una invitación; banned: la persona tiene prohibida la entrada;

Pruebas de mutación: ¿lo notarían tus pruebas?
#memberinvitedbannedoriginalmutant
0FALSOFALSOFALSOFALSOFALSO
1FALSOFALSOVERDADEROFALSOFALSO
2FALSOVERDADEROFALSOVERDADEROFALSO
3FALSOVERDADEROVERDADEROFALSOFALSO
4VERDADEROFALSOFALSOVERDADEROFALSO
5VERDADEROFALSOVERDADEROFALSOFALSO
6VERDADEROVERDADEROFALSOVERDADEROVERDADERO
7VERDADEROVERDADEROVERDADEROFALSOFALSO

Compara original con mutant y guarda el contraejemplo como prueba.

not-equivalent original / mutant · se cumple

Ejercicios

  1. A este mutante le falta el NOT: (member OR invited) AND banned. Encuentra un escenario de prueba que lo elimine (las dos salidas difieren). (find-assignment)
  2. Este mutante cambió el AND exterior por OR: (member OR invited) OR NOT banned. Encuentra un escenario que lo elimine. (find-assignment)
  3. Un mutante solo reordenó los operandos: NOT banned AND (invited OR member). Clasifica ((member OR invited) AND NOT banned) <-> (NOT banned AND (invited OR member)). (classify)
  4. Escribe el resultado esperado a partir del requisito, no de una fórmula: una socia que además está invitada, pero tiene la entrada prohibida (member=TRUE, invited=TRUE, banned=TRUE). ¿allow_entry debería valer TRUE o FALSE? (predict-output)

Haz esta lección de forma interactiva en la app

Preguntas

¿Cuántas pruebas necesita la regla de entrada?

Cuatro escenarios dan un par de independencia para cada una de sus tres entradas, el resultado del segundo paso. Es el recuento de n + 1 que MC/DC pide para n condiciones; la página de pares de independencia muestra las cuatro filas.

¿Qué es un mutante equivalente?

Un mutante que calcula la misma función que el original, como una reordenación de operandos. Ninguna prueba puede matarlo, y el motor lo señala como equivalente en lugar de contarlo como un error superviviente.

Relacionado

Herramientas

Véase también

Lecciones

Generado a partir del motor de Tangibool, semántica tangibool-semantics/1, motor 1.0.0, compilación . Cada tabla, mapa, simplificación y veredicto de estas páginas lo calculó el motor de Tangibool al compilar el sitio, y cada afirmación la volvió a comprobar el mismo verificador exacto que usa la app. Los límites se indican donde aplican. © 2026 Foreranger LTD.