Saltar al contenido

Convertir un contraejemplo en una prueba de regresión

Un contraejemplo es una asignación completa en la que dos cosas que deberían coincidir no coinciden. Esa es también la definición de una buena prueba de regresión. El desliz de la regla de entrada de abajo produce dos filas así, y la comparación del motor las entrega listas para conservar.

La regla prevista es (member OR invited) AND NOT banned; el desliz es member OR (invited AND NOT banned). La comprobación de equivalencia informa de que no son equivalentes, con el testigo member = VERDADERO, invited = FALSO, banned = VERDADERO: un socio vetado, admitido por el desliz y rechazado por la regla. La tabla marca una segunda fila distinta, el socio vetado que además está invitado. Seis filas de ocho coinciden, y por eso el desliz supera una prueba superficial y por eso estas dos filas merecen escribirse.

Convertir el testigo en una prueba requiere tres hechos que el motor ya da: la asignación, el resultado esperado según la regla prevista, y el resultado que produjo el desliz. El testigo se reproduce con un evaluador independiente antes de mostrarse, así que se sabe que la fila se comporta como se informa, y es completa, así que cualquiera puede reproducirla en cualquier implementación de la regla.

Con el tiempo el conjunto de pruebas de una regla se convierte en un registro de sus contraejemplos: el desliz que alguien casi puso en producción, la fila que comunicó un cliente, el caso que una ejecución de mutación encontró superviviente. Cada uno es una fila con una razón, que es el tipo de prueba más defendible que existe. La lección sobre contraejemplos crea el hábito, y la página de regresión muestra el mismo flujo de trabajo para una regla que cambia a propósito.

Ejemplo

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

Comprobaciones exactas

¿Siempre verdadera (tautología)? No Contraejemplo: member = F, invited = F, banned = F · Exhaustively checked and solver cross-checked · 1 filas
¿Siempre falsa (contradicción)? No Contraejemplo: member = F, invited = V, banned = F · Exhaustively checked and solver cross-checked · 3 filas
¿Puede ser verdadera? Sí Asignación de ejemplo: member = F, invited = V, banned = F · Exhaustively checked and solver cross-checked · 3 filas
¿Son equivalentes intended y slip? No Contraejemplo: member = V, invited = F, banned = V · Exhaustively checked and solver cross-checked · 6 filas

Tabla de verdad (8 filas)

Convertir un contraejemplo en una prueba de regresión
#memberinvitedbannedintendedslip
0FALSOFALSOFALSOFALSOFALSO
1FALSOFALSOVERDADEROFALSOFALSO
2FALSOVERDADEROFALSOVERDADEROVERDADERO
3FALSOVERDADEROVERDADEROFALSOFALSO
4VERDADEROFALSOFALSOVERDADEROVERDADERO
5VERDADEROFALSOVERDADEROFALSOVERDADERO
6VERDADEROVERDADEROFALSOVERDADEROVERDADERO
7VERDADEROVERDADEROVERDADEROFALSOVERDADERO

Lectura en lenguaje claro

Principianteintended es verdadero exactamente cuando se cumplen las dos condiciones siguientes:
1. al menos uno entre member e invited es verdadero (pueden serlo ambos)
2. banned es falso
En todos los demás casos, intended es falso.
Sobre los operadores:
- AND (Y) solo es verdadero cuando todas sus partes son verdaderas.
- OR (O) es inclusivo: es verdadero en cuanto al menos una parte es verdadera, también cuando lo son varias.
- NOT (NO) invierte un valor: lo verdadero pasa a ser falso y lo falso, verdadero.
Intermediointended es verdadero exactamente cuando se cumplen las dos condiciones siguientes:
1. al menos uno entre member e invited es verdadero (pueden serlo ambos)
2. banned es falso
En todos los demás casos, intended es falso.
Avanzadointended es verdadero exactamente cuando se cumplen las dos condiciones siguientes [conjunción ∧]:
1. al menos uno entre member e invited es verdadero (pueden serlo ambos) [disyunción inclusiva ∨]
2. banned es falso [negación ¬]
En todos los demás casos, intended es falso.
Notación formal: (member ∨ invited) ∧ ¬banned

Diagrama lógico

Turning a counterexample into a regression test Turning a counterexample into a regression test member invited banned intendedPRIMARY slip AND OR NOT OR AND NOT
Turning a counterexample into a regression test Turning a counterexample into a regression test member invited banned intendedPRIMARY slip AND OR NOT OR AND NOT

El error habitual

Corregir la fórmula y descartar la fila que la delató. La fila es la única evidencia de que el desliz existió; sin ella, la siguiente refactorización puede reintroducir el desliz y nadie lo notará hasta que el socio vetado vuelva a aparecer.

Preguntas

¿Un contraejemplo necesita las dos filas que difieren?

Una basta para refutar la equivalencia, y el motor informa de una. Para un conjunto de pruebas, conserva todas las filas distintas que marca la tabla; cada una es un escenario distinto en el que el desliz se equivocó.

¿El propio contraejemplo puede estar equivocado?

El motor lo reproduce con un evaluador independiente antes de mostrarlo y etiqueta el resultado si la reproducción falla. Lo que ninguna herramienta puede juzgar es si la fila es realista, y ahí entran los supuestos.

Relacionado

Véase también

Pruebas y reglas

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.