Pruebas de mutación


Las pruebas de mutación (o análisis de mutación o mutación de programa ) se utilizan para diseñar nuevas pruebas de software y evaluar la calidad de las pruebas de software existentes. Las pruebas de mutación implican modificar un programa en pequeñas formas. [1] Cada versión mutada se denomina mutante y las pruebas detectan y rechazan mutantes haciendo que el comportamiento de la versión original difiera del mutante. Esto se llama matar al mutante. Los conjuntos de pruebas se miden por el porcentaje de mutantes que matan. Se pueden diseñar nuevas pruebas para matar mutantes adicionales. Los mutantes se basan en operadores de mutación bien definidos.que imitan los errores de programación típicos (como usar el operador o el nombre de variable incorrectos) o fuerzan la creación de pruebas valiosas (como dividir cada expresión por cero). El propósito es ayudar al evaluador a desarrollar pruebas efectivas o localizar debilidades en los datos de prueba utilizados para el programa o en secciones del código a las que rara vez o nunca se accede durante la ejecución . La prueba de mutación es una forma de prueba de caja blanca . [2] [3]

La mayor parte de este artículo trata sobre la "mutación del programa", en la que se modifica el programa. Una definición más general de análisis de mutaciones es el uso de reglas bien definidas definidas en estructuras sintácticas para realizar cambios sistemáticos en los artefactos de software. [4] El análisis de mutaciones se ha aplicado a otros problemas, pero generalmente se aplica a las pruebas. Por lo tanto , las pruebas de mutación se definen como el uso del análisis de mutaciones para diseñar nuevas pruebas de software o para evaluar las pruebas de software existentes. [4] Por lo tanto, el análisis y las pruebas de mutación se pueden aplicar a modelos de diseño, especificaciones, bases de datos, pruebas, XML y otros tipos de artefactos de software, aunque la mutación del programa es la más común. [5]

Se pueden crear pruebas para verificar la corrección de la implementación de un sistema de software dado, pero la creación de pruebas aún plantea la cuestión de si las pruebas son correctas y cubren suficientemente los requisitos que han originado la implementación. [6] (Este problema tecnológico es en sí mismo una instancia de un problema filosófico más profundo llamado " Quis custodiet ipsos custodes?" ["¿Quién protegerá a los guardias?"].) La idea detrás de las pruebas de mutación es que si se introduce un mutante, esto normalmente causa un error en la funcionalidad del programa que las pruebas deben encontrar. De esta manera, las pruebas se prueban. el conjunto de pruebas no detecta un mutante, esto generalmente indica que el conjunto de pruebas no puede localizar las fallas representadas por el mutante, pero también puede indicar que la mutación no presenta fallas, es decir, la mutación es un cambio válido que no afecta la funcionalidad Una forma (común) en que un mutante puede ser válido es que el código que se ha cambiado es un "código muerto" que nunca se ejecuta.

Para que las pruebas de mutación funcionen a escala, generalmente se introduce una gran cantidad de mutantes, lo que lleva a la compilación y ejecución de una cantidad extremadamente grande de copias del programa. Este problema del costo de las pruebas de mutación había reducido su uso práctico como método de prueba de software. Sin embargo, el aumento en el uso de lenguajes de programación orientados a objetos y marcos de prueba de unidades ha llevado a la creación de herramientas de prueba de mutación que prueban partes individuales de una aplicación.

Las pruebas de mutación fueron propuestas originalmente por Richard Lipton cuando era estudiante en 1971, [9] y fueron desarrolladas y publicadas por primera vez por DeMillo, Lipton y Sayward. [1] La primera implementación de una herramienta de prueba de mutaciones fue de Timothy Budd como parte de su trabajo de doctorado (titulado Análisis de mutaciones ) en 1980 de la Universidad de Yale . [10]

Recientemente, con la disponibilidad de potencia informática masiva, ha habido un resurgimiento del análisis de mutaciones dentro de la comunidad informática, y se ha trabajado para definir métodos de aplicación de pruebas de mutaciones a lenguajes de programación orientados a objetos y lenguajes no procedimentales como XML , SMV y máquinas de estados finitos .