what is mutation testing
Este tutorial explica qué es la prueba de mutación, cómo realizarla y los tipos de prueba de mutación con ejemplos:
¿Qué es la prueba de mutación?
La prueba de mutación es una técnica de prueba basada en fallas en la que las variaciones de un programa de software están sujetas al conjunto de datos de prueba. Esto se hace para determinar la efectividad del conjunto de prueba para aislar las desviaciones.
Suena un poco complicado, ¿no?
Lo que vas a aprender:
Prueba de mutación
Mutation Testing (MT) recorre un largo camino, se remonta a los años 70, donde se propuso por primera vez como un proyecto escolar. Se canceló ya que consumía muchos recursos. Sin embargo, a medida que los humanos continuaron desarrollando computadoras más avanzadas, lentamente regresó y ahora es una de las técnicas de prueba más populares.
Definición de prueba de mutación
MT también se conoce como pruebas basadas en fallos, mutación del programa, pruebas basadas en errores, o análisis de mutaciones .
Como sugiere su nombre, las pruebas de mutación son un tipo de prueba de software que se basa en cambios o mutaciones. Se introducen cambios minúsculos en el código fuente para comprobar si los casos de prueba definidos pueden detectar errores en el código.
El caso ideal es que ninguno de los casos de prueba debería pasar. Si la prueba pasa, significa que hay un error en el código. Decimos que el mutante (la versión modificada de nuestro código) vivió. Si la prueba falla, entonces no hay ningún error en el código y el mutante fue eliminado. Nuestro objetivo es matar a todos los mutantes.
Las pruebas de mutación también ayudan a probar la calidad de los casos de prueba definidos o los conjuntos de pruebas con un intento por escribir casos de prueba más efectivos. Cuantos más mutantes podamos matar, mayor será la calidad de nuestras pruebas.
Conceptos de prueba de mutaciones
Antes de analizar más las pruebas de mutación, exploremos algunos conceptos con los que nos encontraremos.
# 1) Mutantes: Es simplemente la versión mutada del código fuente. Es el código que contiene cambios mínimos. Cuando los datos de prueba se ejecutan a través del mutante, idealmente deberían darnos resultados diferentes del código fuente original. Los mutantes también se llaman programas mutantes .
Existen diferentes tipos de mutantes. Estos son los siguientes:
- Mutantes sobrevividos: Como hemos mencionado, estos son los mutantes que aún están vivos después de ejecutar datos de prueba a través de las variantes originales y mutadas del código fuente. Estos deben ser asesinados. También se les conoce como mutantes vivos.
- Mutantes asesinados: Estos son mutantes que mueren después de la prueba de mutación. Obtenemos estos cuando obtenemos resultados diferentes de las versiones original y mutada del código fuente.
- Mutantes equivalentes: Estos están estrechamente relacionados con los mutantes vivos, en el sentido de que están 'vivos' incluso después de ejecutar datos de prueba a través de ellos. Lo que los diferencia de los demás es que tienen el mismo significado que el código fuente original, aunque pueden tener una sintaxis diferente.
# 2) Mutadores / operadores de mutación: Esto es lo que hace posibles las mutaciones, están en el 'asiento del conductor'. Básicamente, definen el tipo de alteración o cambio a realizar en el código fuente para tener una versión mutante. Pueden denominarse fallas o reglas de mutación .
# 3) Puntuación de mutación: Esta es una puntuación basada en el número de mutantes.
Se calcula utilizando la siguiente fórmula:
Tenga en cuenta que, los mutantes equivalentes no se consideran al calcular la puntuación de mutación. La puntuación de mutación también se conoce como adecuación de la mutación . Nuestro objetivo debería ser lograr una alta puntuación de mutación.
Cómo hacer pruebas de mutación
Paso 1: Escribamos nuestra prueba unitaria de Jasmine.
Suite de pruebas (Jasmine)
|_+_|
Paso 2: Escribe el código original.
Código original (Javascript)
|_+_|Paso 3: Luego, ejecutaremos la prueba a través del código original para asegurarnos de que no hayamos fallado en las pruebas desde el principio. Deberíamos tener algún resultado que comunique que efectivamente hemos escrito una prueba con cero fallas.
Por ejemplo:
terminado en 0.019s 1 especificación, 0 fallas, aleatorizado con semilla 31435
Resultado del código original:
|_+_| Paso 4: Presenta al mutante. En este caso, cambiamos el mas grande que operador (edad_madre> edad_hija) a un menor que operador (edad_madre Código mutante (Javascript) Paso # 5: Luego ejecutamos la prueba a través del código mutante. Estos son los resultados de la prueba: terminado en 0.017s 1 especificación, 0 fallas, aleatorizado con semilla 89555 Resultado del código mutante: Paso # 6: Compare los resultados de la versión original y la versión mutante. En este caso, son diferentes, incluso si se utilizó el mismo conjunto de pruebas. Por tanto, hemos matado a nuestro mutante. Por lo tanto, nuestro conjunto de pruebas está listo para comenzar. Existen varios tipos de mutaciones. Estos se explican a continuación. Aquí, introducimos una mutación cambiando el parámetro y / o valores constantes, generalmente en +/- 1. Ejemplo: código original (Javascript) Si el código anterior estaba destinado a multiplicar los números pares donde I<4 , entonces la mutación de valor significaría cambiar la inicialización a sea i = 1 . Ejemplo: código mutante (Javascript) Aquí, eliminamos o duplicamos una declaración en un bloque de código. También podríamos reorganizar las declaraciones en un bloque de código. En un bloque if-else, por ejemplo, podríamos eliminar la parte else o incluso todo el bloque if-else. Ejemplo: código original (Javascript) Ejemplo: código mutante (Javascript) El objetivo aquí es el código que toma decisiones, por ejemplo, comparaciones de valores. Podemos cambiar > a< como en nuestro ejemplo del programa Madre-Hija. Otros operadores que podemos cambiar incluyen los siguientes: Las ventajas de las pruebas de mutaciones (MT) incluyen: Las desventajas de las pruebas de mutación (MT) incluyen: Las herramientas son útiles para acelerar el proceso de generación de mutantes. Aquí hay algunas herramientas que podemos usar en MT: Stryker, Jumble, PIT y Insure ++. Aprendamos de un ejemplo: Digamos, hay un sitio de hospital que permite que nuevos usuarios se registren. Lee la fecha de nacimiento o la edad del paciente. Si es mayor de 14, asigna un médico general como su médico principal. Para ello, invoca la función de 'médico general' que encuentra al médico disponible. Ahora, podría haber otra funcionalidad. Tal vez, los pacientes menores de 13 años sean asignados a un pediatra y así sucesivamente. Pero solo tomaremos el caso de mayores de 14 años. Así es como podría verse el código: 1) Leer edad Tenga en cuenta que las líneas de código anteriores no son específicas de ningún lenguaje de programación y no se ejecutarán. Es simplemente hipotético. Como probador, si mi conjunto de datos es 14, 15, 0, 13, algunos números aleatorios. El objetivo es comprobar si el conjunto de datos de los 4 valores (14, 15, 0 y 3) es adecuado para identificar todos los posibles problemas con este código. Leer también => Consejos para diseñar datos de prueba antes de ejecutar sus casos de prueba ¿Cómo logra esto Mutation Testing? En primer lugar, crea mutantes, variaciones del programa. Un mutante no es más que un programa escrito como una desviación. Contiene una falla auto sembrada. Ejemplos son: Estos reemplazos también se denominan 'Operadores de mutación'. Déjame mostrarte ejemplos: Mutante n. ° 1: operador relacionalreemplazo 1) Leer edad Mutante # 2: 1) Leer edad Mutante # 3: 1) Leer edad Mutante # 4: 1) Leer edad Mutante n. ° 5: eliminación de declaraciones 1) Leer edad Mutante # 6: Inserción de valor absoluto 1) Leer edad Mutante n. ° 7: sintaxis incorrecta 1) Leer edad Mutante n. ° 8: hace lo mismo que la prueba original 1) Leer edad Una vez, se crean todos los mutantes. Están sujetos al conjunto de datos de prueba. Nuestro conjunto es 14, 15, 0 y 13. ¿Cuál de estos mutantes encontrará nuestro conjunto de datos? Descúbrelo en la siguiente tabla: (Haga clic en la imagen para ampliarla) Como puede ver, nuestro valor de datos 14 encuentra fallas cuando se enfrenta a Mutantes 2, 3 y 4. O bien, 14 mata a los mutantes 2, 3 y 4. Pero es ineficaz contra 1, 6 y 8. Si su conjunto de datos mata a todos los mutantes, es efectivo. De lo contrario, incluya más o mejores datos de prueba. No es necesario que cada valor en el conjunto de datos mate a todos los mutantes. Pero juntos deberían matar a todos.Por ejemplo:14 mata a 2, 3 y 4. 15 mata a 1, 2 y 4. Y así sucesivamente. ¿Qué hay de 5, 7 y 8? Mutante # 5 - es la instancia del programa que fallará independientemente del valor de datos que proporciones. Esto se debe a que no realizará ninguna programación tanto para valores válidos como inválidos. Mutante # 7 – será un error de compilación. O en el caso de un lenguaje de scripting un error que impedirá su ejecución. Mutante # 8 – es lo mismo que el programa principal. Como puede ver, los mutantes anteriores no son útiles en absoluto. Por tanto, los mutantes a evitar son: ¿Estás pensando, si se necesita tanto esfuerzo, qué sucederá cuando tenga que probar grandes muestras de código? Las pruebas de mutación se basan en dos cosas: Asi que, se centra en la unidad más pequeña de código y confía en la habilidad del programador para escalar las pruebas de mutación a programas más grandes. Este tutorial cubrió la definición, los tipos y los pasos de las pruebas de mutación para realizar estas pruebas en detalle con ejemplos. Esperamos que haya disfrutado leyendo y aprendiendo sobre esta interesante técnica de prueba: las pruebas de mutación. Sobre el Autor: Este artículo fue escrito por Swati S., miembro del equipo de STH. Comparta sus comentarios, preguntas y pensamientos a continuación. Tipos de pruebas de mutación
# 1) Mutación de valor
# 2) Mutación de declaración
# 3) Mutación de decisión
Operador original Operador mutante 1 <= >= 2 >= == 3 === == 4 y o 5 || &&
Herramientas de prueba de mutaciones
Más sobre pruebas de mutaciones
2) Si la edad> 14
3) Doctor = Médico general ()
4) Terminara si
2) Si la edad con<’
3) Doctor = Médico general ()
4) Finalizar si
2) Si edad = 14 'Cambiar el> por ='
3) Doctor = Médico general ()
4) Finalizar si
2) Si edad> = 14 'Cambiar el> por> ='
3) Doctor = Médico general ()
4) Finalizar si
2) Si la edad con<=’
3) Doctor = Médico general ()
4) Finalizar si
2) Si edad = 14
3) 'eliminar la declaración de asignación del médico'
4) Finalizar si
2) Si la edad> 14
3) Doctor = Mr.X (inserción de valor absoluto; digamos que X es pediatra)
4) Finalizar si
2) Si edad %% 14 (sintaxis incorrecta)
3) Doctor = Médico general ()
4) Finalizar si
2) Si edad> 14 y edad> 14 'significa lo mismo que edad> 14'
3) Doctor = Médico general ()
4) Finalizar si
Puntos a tener en cuenta
cómo ejecutar un archivo jnlp
Conclusión
Lectura recomendada