Glosario · Fundamentos de testing
Oráculo de prueba
En inglés: Test oracle
También llamado: oráculo de pruebas, oráculos de prueba, problema del oráculo, oracle problem
Definición
La fuente de verdad que usa un test para decidir si una salida es correcta, como una especificación, una versión anterior, un modelo de referencia o una regla.
Un oráculo de prueba (test oracle) es aquello que te dice cuál es la respuesta correcta. Ejecutar un test produce una salida; el oráculo es el mecanismo que juzga esa salida como aprobada o fallida. Normalmente es el resultado esperado escrito en el caso de prueba, pero en muchos sistemas averiguar el resultado esperado es la parte más difícil de probar. Esa dificultad se conoce como el problema del oráculo.
Tipos de oráculo
- Resultado especificado. Un requisito dice que un pedido de 200 $ con un 10 % de descuento suma 180 $. La aserción compara con ese valor.
- Implementación de referencia. Comparar con una alternativa de confianza: una release anterior, el cálculo de un competidor o un algoritmo sencillo pero lento que comprueba otro rápido y optimizado.
- Consistencia y propiedades. Puede que no sepas la salida exacta, pero conoces reglas que debe cumplir. Una ordenación debe devolver los mismos elementos en orden no decreciente; codificar y luego decodificar debe devolver la entrada original.
- Línea base guardada. Los tests de snapshot y de regresión visual tratan como correcta una salida anterior aprobada.
- Juicio humano. Un tester decide si un layout o un texto generado es aceptable. Flexible, pero lento e inconsistente.
Ejemplo: un oráculo basado en propiedades
No puedes escribir a mano la salida esperada para cada entrada posible de una función de ordenación, pero sí comprobar propiedades que cumple cualquier resultado correcto:
function checkSorted(input: number[], output: number[]): boolean {
const sameLength = input.length === output.length;
const ordered = output.every((v, i) => i === 0 || output[i - 1] <= v);
const sameItems =
[...input].sort((a, b) => a - b).join(',') === output.join(',');
return sameLength && ordered && sameItems;
}
Por qué importa
Un test es tan bueno como su oráculo. Un test que recorre el checkout y solo comprueba que no apareció ningún error tiene un oráculo muy débil: pasará aunque cobre un importe equivocado. Los oráculos débiles son una de las principales razones por las que una cobertura de código alta no garantiza una buena suite. El problema del oráculo también es central al probar sistemas de IA, donde las salidas varían y los equipos recurren a conjuntos de datos de referencia (golden datasets), rúbricas o un segundo modelo que actúa como juez.