6.2.06

Mutaciones y Java.

Saludos.

Una técnica de prueba de código bastante antigua (de los 70) y famosa son las mutaciones. Sin embargo, esta técnica no suele ser muy conocida. Voy a hacer un breve resumen de ella y después comentaré una herramienta para Java.

A grandes rasgos, la técnica de las mutaciones surge de la idea de que todos los fallos de un programa vienen motivados por pequeños cambios en el código, como un error al escribir un número, un operador matemático o una comprobación. Obviamente, un fallo grande es un conjunto de fallos pequeños.

La técnica de las mutaciones propone un conjunto de operadores para obtener código mutado: por ejemplo cambiar un '>' por un '<' o un '+' por un '-'. Con esto, el código mutado que se genera es erróneo (aunque no siempre, puede dar la casualidad de que siga estando bien).

¿Pero para qué sirve el código mutado?. Principalmente tiene dos usos: 1) guiar la construcción de pruebas, 2) validar un conjunto de pruebas. Comentémoslos brevemente.

En primer lugar, el código mutado nos dice qué prueba hemos de construir. Por ejemplo, si hemos cambiado un '+' por un '-', debemos construir una prueba que sea capaz de detectar ese error. A más mutaciones, más pruebas y más fiable será nuestro código.

Además, las mutaciones pueden indicarnos lo bueno que es un conjunto de pruebas ya existente. Así, generamos un conjunto de mutaciones, ejecutamos las pruebas sobre el conjunto y, según el número de mutaciones detectadas podemos tener una idea de la eficacia de las pruebas.

Como ya he comentado, esta es una técnica antigua, por lo que ya existen muchos trabajos que describen operadores "mutacionales" para obtener mutaciones de código en muchos lenguajes como Fortran, C, o Java. También existen varias herramientas, aunque, personalmente, no conozco ninguna muy famosa, ni libre, ni fácil de usar.

La última que he visto (MuJava http://www.isse.gmu.edu/faculty/ofut/mujava/) es gratuita pero no libre. El trabajo con esta herramienta se divide en dos partes: en primer lugar la herramienta es capaz de generar ella sola un conjunto de mutantes a partir de las clases y métodos originales. Después, la herramienta permite ejecutar un conjunto de pruebas sobre los mutantes y detectar los mutantes eliminados (aquellos detectados con alguna prueba). Por desgracia, las pruebas hemos de escribirlas a mano. A la hora de la verdad, la herramienta se comía la primera letra de mis clases y solo era capaz de generar un montón de NullPointerException. Lástima que no sea libre y pueda corregir el código.

Aunque las herramientas que conozco no permitan sacar todo el jugo de la técnica de mutaciones, creo que los fundamentos son muy importantes para cualquier que escriba pruebas para código. Conocer los operadores para crear mutaciones nos va a dar muchas buenas ideas sobre qué pruebas escribir para verificar que nuestro código funciona y siga funcionando en el futuro.

2 comments:

Luis said...

Vamos haber, osea que te putea el código, entonces, ¿donde está la gracia?
para eso has hecho test y has puesto try catch en todos lo sitios criticos creo yo
no le veo el sentido, para eso hay que testear y testear y testear y hacer betas de la aplicacion. Nose es mejor a que te borren los nombres de las clases o que te puteen lo algoritmos, (pienso)

Javier J. said...

Saludos Luis.

No es esa la idea. Las mutaciones no cambian tu código, simplemente crean nuevas versiones defectuosas.

Hay muchos errores que no se detectan con try/catch. De hecho las excepciones solo deben utilizarse para detectar circunstancias anómalas que escapan al control del programa (entradas de usuarios, ficheros o registros corruptos, etc.).

Tienes razón, el código hay que testearlo y testearlo, ¿pero qué hay que hacer en cada prueba?. Si las pruebas no buscan errores reales e importantes, sirven de poco. Las mutaciones te dicen qué errores tienes que buscar en las pruebas que hagas.

Nos leemos.