Metamorphic Testing Property Based Testing - proyectosuniandes/Proyecto-MISO4208 GitHub Wiki
Metamorphic Testing
Pruebas Metamórficas (MT) están basadas en la noción de MR. Las MR se definen como “propiedades esperadas o existentes sobre una serie de entradas diferentes y sus correspondientes resultados para evaluaciones múltiples de una función objetivo”.
Cuando la implementación es correcta, es de esperar que las entradas y salidas del programa cumplan algunas propiedades necesarias que son relevantes para los algoritmos subyacentes. Estas propiedades son conocidas tradicionalmente como asertos. En este sentido, una MR es un tipo de aserto que se expresa en función de los valores de un caso de prueba (es decir, una entrada de un programa y la salida esperada).
Pero, además, una MR debe proveer una forma de generar nuevos casos de prueba a partir de los suministrados inicialmente. Para ilustrar esto, consideremos un programa de ordenación, ordena, que ordena una lista de enteros dada como entrada, resultando una lista con los mismos valores pero ordenados ascendentemente.
Por ejemplo, cuando tenemos como entrada la lista l1 = {4, 7, 2}, el resultado esperado de ordena(l1)es {2, 4, 7}. Por tanto, si utilizamos una función, perm, que permuta elementos de una lista dada para generar un caso de prueba nuevo en la entrada, podemos asegurar que su resultado tiene que ser el mismo (en este caso, la condición sobre la salida es la función igualdad).
Siguiendo con el mismo ejemplo, sea l2 = perm(l1, {(1, 2)}) = {7, 4, 2} (sólo hay un intercambio entre el primer y el segundo elemento), el resultado esperado de ordena(l2) tiene que ser el mismo que el de ordena(l1). Esto es, ordena(l1) = ordena(l2). Por tanto, podemos formalizar esta propiedad, MR 1 , de la siguiente forma:
MR 1 ≡ (∃x l2 = perm(l1, x)) → ordena(l2) = ordena(l1)
donde l1 es la entrada original y l2 será el caso de prueba siguiente (la permutación x-ésima de l1). Es preciso tener en cuenta que perm es la función de generación de casos de prueba asociada a MR 1 , que recibe una lista de entrada (el caso de prueba inicial) y una permutación (una lista de pares de índices), y produce una nueva lista (el caso de prueba siguiente). Si la propiedad metamórfica no se cumple entonces el programa contiene un error.
La generación de casos de prueba puede ser automatizada con técnicas tradicionales. Volviendo al ejemplo de la sección anterior, si reemplazamos el segundo parámetro de perm por una permutación aleatoria obtendríamos la prueba aleatoria tradicional para este ejemplo. Naturalmente, una sola MR es, en general, insuficiente. En el ejemplo de la sección anterior, podríamos no detectar ciertos fallos con MR1 , ya que la corrección para la ordenación implica el uso de la permutación (la lista resultante tiene que ser una permutación de la original) y una restricción de orden (tiene que estar ordenada).
Ası́, MT es una técnica de prueba que comienza con un conjunto de casos de prueba previo (que será producido con alguna estrategia de generación) y un conjunto de MR. Tras la ejecución del programa, obtenemos que algunos casos de prueba detectan errores y otros no. Los primeros, hacen que el programa sea revisado y el error corregido y, los segundos, llamados casos de prueba exitosos, serán seleccionados como entrada a la arquitectura que vamos a utilizar. Entonces, el conjunto de MR se utiliza para generar los casos de prueba siguientes a partir de este conjunto exitoso. Estos casos de prueba siguientes formarán el conjunto de casos de prueba (inicial) de la siguiente iteración y el proceso se repetirá.
Por tanto, una vez generado un conjunto de casos de prueba previo (con una estrategia de generación) para aplicar con éxito MT hay que llevar a cabo los siguientes pasos:
- Escoger los casos de prueba que no resulten erróneos (casos de prueba exitosos). Estos conforman el conjunto de casos de prueba inicial.
- Seleccionar adecuadamente las MR teniendo en cuenta el problema a resolver y la estructura del algoritmo empleado en el programa.
- Generar el conjunto de casos de prueba siguientes aplicando las MR al conjunto de casos de prueba inicial.
- Ejecutar el programa con los casos de prueba inicial y siguiente.
- Comparar los resultados.
- Mejorar el programa corrigiendo los erorres detectados, seleccionar nuevos casos de prueba y/o nuevas MR mejoradas para la siguiente iteración.
Castro Cabrera, M.C., Camacho Magriñán, A.; Medina Bulo, I.; Palomo Duarte, M.: Una arquitectura basada en pruebas metamórficas para composiciones de servicios WS-BPEL. Escuela Superior de Ingeniería, Universidad de Cádiz, C/Chile 1, 11002 Cádiz, España