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.
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;
| # | member | invited | banned | allow_entry |
|---|---|---|---|---|
| 0 | FALSO | FALSO | FALSO | FALSO |
| 1 | FALSO | FALSO | VERDADERO | FALSO |
| 2 | FALSO | VERDADERO | FALSO | VERDADERO |
| 3 | FALSO | VERDADERO | VERDADERO | FALSO |
| 4 | VERDADERO | FALSO | FALSO | VERDADERO |
| 5 | VERDADERO | FALSO | VERDADERO | VERDADERO |
| 6 | VERDADERO | VERDADERO | FALSO | VERDADERO |
| 7 | VERDADERO | VERDADERO | VERDADERO | VERDADERO |
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;
| # | member | invited | banned | allow_entry |
|---|---|---|---|---|
| 0 | FALSO | FALSO | FALSO | FALSO |
| 1 | FALSO | FALSO | VERDADERO | FALSO |
| 2 | FALSO | VERDADERO | FALSO | VERDADERO |
| 3 | FALSO | VERDADERO | VERDADERO | FALSO |
| 4 | VERDADERO | FALSO | FALSO | VERDADERO |
| 5 | VERDADERO | FALSO | VERDADERO | FALSO |
| 6 | VERDADERO | VERDADERO | FALSO | VERDADERO |
| 7 | VERDADERO | VERDADERO | VERDADERO | FALSO |
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;
| # | member | invited | banned | original | mutant |
|---|---|---|---|---|---|
| 0 | FALSO | FALSO | FALSO | FALSO | FALSO |
| 1 | FALSO | FALSO | VERDADERO | FALSO | FALSO |
| 2 | FALSO | VERDADERO | FALSO | VERDADERO | FALSO |
| 3 | FALSO | VERDADERO | VERDADERO | FALSO | FALSO |
| 4 | VERDADERO | FALSO | FALSO | VERDADERO | FALSO |
| 5 | VERDADERO | FALSO | VERDADERO | FALSO | FALSO |
| 6 | VERDADERO | VERDADERO | FALSO | VERDADERO | VERDADERO |
| 7 | VERDADERO | VERDADERO | VERDADERO | FALSO | FALSO |
Compara original con mutant y guarda el contraejemplo como prueba.
not-equivalent original / mutant · se cumple
Ejercicios
- 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) - Este mutante cambió el
ANDexterior porOR:(member OR invited) OR NOT banned. Encuentra un escenario que lo elimine. (find-assignment) - 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) - 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_entrydeberí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
- Pares de independencia MC/DC, ejemplo resuelto con el informe de cobertura del motor
- Pruebas de mutación para reglas booleanas: mutantes de operador, negación y literal
- La cobertura no es corrección: las pruebas siguen necesitando resultados esperados
- Oráculo de prueba (resultado esperado): definición, ejemplo y equivalente en inglés
- Mutante (superviviente, eliminado): definición, ejemplo y equivalente en inglés
- Par de independencia: definición, ejemplo y equivalente en inglés
- Lección 9: Contraejemplos
- Derivar casos de prueba de una tabla de verdad sin probar todas las filas
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.