Testing por Mutación
logo_bacterio_2

BACTERIO Mutation Test System es una herramienta de pruebas para Java basada en la técnica de mutación. La mutación es un técnica de pruebas que se basa en la capacidad de los casos de prueba para encontrar fallos en el sistema que se está probando. La mutación es una técnica desarrollada durante las últimas décadas en el ámbito de la investigación cuya transferencia al entorno industrial se está realizando con éxito durante los últimos años.

 

¿En qué consiste el testing por mutación?

 

Partiendo de un sistema S que se desea probar, la mutación genera un conjunto M={M1, M2, … Mn} de mutantes de S. Cada mutante contiene uno o más cambios sintácticos, la mayoría de los cuales pueden considerarse fallos. La idea original de la mutación consiste en construir un conjunto de casos de prueba (test suite) que detecte todos los fallos inyectados en los mutantes. Cada cambio sintáctico se introduce en el mutante por medio de un “operador de mutación”:

  • La tabla a) muestra el código fuente del programa original y de algunos mutantes.
  • La tabla b) presenta los resultados obtenidos al ejecutar algunos casos de prueba, con los datos indicados, sobre cada una de las versiones del programa (original y mutantes).

El caso de prueba correspondiente a los datos de prueba (1, 1) produce salidas diferentes en el programa original (cuya salida es correcta) y en el mutante 1: así, este caso de prueba ha encontrado el fallo introducido en el mutante, diciéndose que el mutante está muerto. Por otro lado, ya que todos los casos de prueba ofrecen la misma salida en el programa original y en el mutante 4, se dice que el mutante está vivo. Además, este mutante es un mutante “funcionalmente equivalente”, ya que nunca podrá ser muerto por ningún caso de prueba. Los mutantes funcionalmente equivalentes se pueden considerar como ruido al analizar los resultados, ya que realmente entorpecen el conocimiento de la calidad del test suite: contienen un cambio sintáctico cuya detección, sin embargo, es imposible para los casos de prueba.

Versión

Código

Original

int sum(int a, int b) {
return a + b;
}

Mutante 1

int sum(int a, int b) {
return a - b;
}

Mutante 2

int sum(int a, int b) {
return a * b;
}

Mutante 3

int sum(int a, int b) {
return a / b;
}

Mutante 4

int sum(int a, int b) {
return a + b++;
}

a) Código de algunos mutantes

Datos de prueba (a,b)

(1, 1)

(0, 0)

(-1, 0)

(-1, -1)

Versiones del prorgama

Original

2

0

-1

-2

Mutante 1

0

0

-1

0

Mutante 2

1

0

0

1

Mutante 3

1

Error

Error

1

Mutante 4

2

0

-1

-2

b) Resultados con algunos datos de prueba