En las pruebas de software , un oráculo de pruebas (o simplemente oráculo ) es un proveedor de información que describe el resultado correcto en función de la entrada de un caso de prueba . Las pruebas con un oráculo implican comparar los resultados reales del sistema bajo prueba (SUT) con los resultados esperados proporcionados por el oráculo. [1]
El término "oráculo de prueba" fue introducido por primera vez en un artículo de William E. Howden. [2] Elaine Weyuker exploró trabajos adicionales sobre diferentes tipos de oráculos . [3]
Un oráculo puede funcionar por separado del SUT; se puede acceder a él en el momento de ejecución de la prueba , o se puede utilizar antes de ejecutar una prueba con los resultados esperados codificados en la lógica de la prueba. [4]
Sin embargo, las poscondiciones del método son parte del SUT, como oráculos automatizados en los modelos de diseño por contrato . [5]
Determinar la salida correcta para una entrada dada (y un conjunto de estados del programa o sistema) se conoce como el problema del oráculo o problema del oráculo de prueba , [6] : 507 que algunos consideran un problema relativamente difícil e implica trabajar con problemas relacionados con la controlabilidad y la observabilidad. [7]
Una encuesta de literatura de investigación que abarcó el período 1978 a 2012 [6] encontró varias categorías potenciales de oráculos de prueba.
Un oráculo especificado se asocia típicamente con enfoques formalizados para el modelado de software y la construcción de código de software. Está conectado con la especificación formal , [8] el diseño basado en modelos que se puede utilizar para generar oráculos de prueba, [9] la especificación de transición de estado para la cual se pueden derivar oráculos para ayudar a las pruebas basadas en modelos [10] y las pruebas de conformidad de protocolos , [11] y el diseño por contrato para el cual el oráculo de prueba equivalente es una afirmación .
Los oráculos de prueba especificados presentan una serie de desafíos. La especificación formal se basa en la abstracción, que a su vez puede tener naturalmente un elemento de imprecisión, ya que todos los modelos no pueden capturar todos los comportamientos. [6] : 514
Un oráculo de prueba derivado diferencia el comportamiento correcto del incorrecto mediante el uso de información derivada de artefactos del sistema. Estos pueden incluir documentación, resultados de ejecución del sistema y características de versiones del SUT. [6] : 514 Los conjuntos de pruebas de regresión (o informes) son un ejemplo de un oráculo de prueba derivado: se construyen sobre la suposición de que el resultado de una versión anterior del sistema se puede utilizar como ayuda (oráculo) para una versión futura del sistema. Las características de rendimiento medidas previamente se pueden utilizar como un oráculo para futuras versiones del sistema, por ejemplo, para activar una pregunta sobre la degradación potencial del rendimiento observada. La documentación textual de versiones anteriores del sistema se puede utilizar como base para guiar las expectativas en futuras versiones del sistema.
Un pseudo-oráculo [6] : 515 entra en la categoría de oráculo de prueba derivado. Un pseudo-oráculo, según la definición de Weyuker, [12] es un programa escrito por separado que puede tomar la misma entrada que el programa o SUT de modo que sus salidas se puedan comparar para entender si podría haber un problema que investigar.
Un oráculo parcial [6] : 515 es un híbrido entre un oráculo de prueba especificado y un oráculo de prueba derivado. Especifica propiedades importantes (pero no completas) del SUT. Por ejemplo, las pruebas metamórficas explotan dichas propiedades, llamadas relaciones metamórficas, en múltiples ejecuciones del sistema.
Un oráculo de prueba implícito se basa en información y suposiciones implícitas. [6] : 518 Por ejemplo, puede haber alguna conclusión implícita de una falla del programa, es decir, un comportamiento no deseado: un oráculo para determinar que puede haber un problema. Hay varias formas de buscar y probar el comportamiento no deseado, ya sea que algunos lo llamen prueba negativa, donde hay subconjuntos especializados como fuzzing .
Los oráculos de prueba implícitos tienen limitaciones, ya que se basan en conclusiones y suposiciones implícitas. Por ejemplo, una falla de un programa o proceso puede no ser un problema prioritario si el sistema es tolerante a fallas y, por lo tanto, opera bajo una forma de autorreparación o autogestión . Los oráculos de prueba implícitos pueden ser susceptibles a falsos positivos debido a dependencias del entorno. Las pruebas basadas en propiedades se basan en oráculos implícitos.
Un humano puede actuar como un oráculo de pruebas. [7] Este enfoque se puede categorizar como cuantitativo o cualitativo. [6] : 519–520 Un enfoque cuantitativo tiene como objetivo encontrar la cantidad correcta de información para recopilar en un SUT (por ejemplo, resultados de pruebas) para que una parte interesada pueda tomar decisiones sobre la adecuación al propósito o el lanzamiento del software. Un enfoque cualitativo tiene como objetivo encontrar la representatividad e idoneidad de los datos de prueba de entrada y el contexto de la salida del SUT. Un ejemplo es usar datos de prueba realistas y representativos y dar sentido a los resultados (si son realistas). Estos pueden guiarse por enfoques heurísticos , como instintos viscerales, reglas generales, ayudas de listas de verificación y experiencia para ayudar a adaptar la combinación específica seleccionada para el SUT.
Los oráculos de prueba se basan más comúnmente en especificaciones y documentación . [13] [14] Una especificación formal utilizada como entrada para el diseño basado en modelos y las pruebas basadas en modelos sería un ejemplo de un oráculo de prueba especificado . El oráculo basado en modelos utiliza el mismo modelo para generar y verificar el comportamiento del sistema. [15] La documentación que no es una especificación completa del producto, como una guía de uso o instalación, o un registro de características de rendimiento o requisitos mínimos de la máquina para el software, normalmente sería un oráculo de prueba derivado.
Un oráculo de consistencia compara los resultados de una ejecución de prueba con otra para comprobar su similitud. [16] Este es otro ejemplo de un oráculo de prueba derivado.
Un oráculo para un programa de software podría ser un segundo programa que utiliza un algoritmo diferente para evaluar la misma expresión matemática que el producto en prueba. Este es un ejemplo de un pseudo-oráculo, que es un oráculo de prueba derivado. [12] : 466
Durante la búsqueda en Google , no tenemos un oráculo completo para verificar si la cantidad de resultados devueltos es correcta. Podemos definir una relación metamórfica [17] de modo que una búsqueda acotada posterior produzca menos resultados. Este es un ejemplo de un oráculo parcial, que es un híbrido entre un oráculo de prueba especificado y un oráculo de prueba derivado.
Un oráculo estadístico utiliza características probabilísticas, [18] por ejemplo, con el análisis de imágenes, donde se define un rango de certeza e incertidumbre para que el oráculo de prueba declare una coincidencia o no. Este sería un ejemplo de un enfoque cuantitativo en un oráculo de prueba humano.
Un oráculo heurístico proporciona resultados representativos o aproximados sobre una clase de entradas de prueba. [19] Este sería un ejemplo de un enfoque cualitativo en un oráculo de prueba humano.