Las pruebas de mutación evalúan la calidad de las pruebas unitarias realizando pequeños cambios en el código y comprobando si las pruebas fallan. PIT es una herramienta para realizar pruebas de mutación de forma automática en Java. Realiza mutaciones como cambiar operadores o valores devueltos y mide si las pruebas matan o dejan vivir cada mutante. Las pruebas de mutación ayudan a mejorar la calidad de las pruebas al encontrar errores, aunque requieren mucho tiempo de ejecución.
15. Técnica que nos ayuda a
mejorar nuestras pruebas y
medir su calidad frente a la
cobertura tradicional.
16. ¿Cómo funciona?
Se realizan cambios en el código, mutaciones, y se ejecutan las
pruebas:
Si las pruebas pasan, el mutante sobrevive.
Si las pruebas fallan, el mutante muere.
Al final, nuestras pruebas deberían eliminar todas las mutaciones.
@jlrv | @rafaelvindel | @MalagaJUG
17. ¿Qué son las mutaciones?
× Modificar operadores
× Modificar constantes
× Modificar variables
× Eliminar llamadas a métodos
× ...
@jlrv | @rafaelvindel | @MalagaJUG
20. Un poquito de
historia...
Primera propuesta realizada por Richard Jay
Lipton en 1971 cuando era estudiante:
“Fault Diagnosis of Computer Programs”
21. Un poquito de
historia...
No fue hasta 1978 cuando DeMillo, Lipton y
Sayward publican:
“Hints on Test Data Selection:
Help for the Practicing Programmer”
22. En 1980, Timothy Budd publica en su doctorado
el primer sistema de mutación:
“Mutation Analysis”
Un poquito de
historia...
23. ¿Por qué No tuvo éxito?
× Incapacidad para añadir pruebas unitarias en el
desarrollo.
× Dificultades tecnológicas para automatizar las
pruebas.
× Mutaciones muy costosas computacionalmente.
@jlrv | @rafaelvindel | @MalagaJUG
29. PIT
Herramienta que permite realizar pruebas de
mutación de forma automática sobre pruebas en
Java.
× Rápido
× Fácil de usar
× En continuo desarrollo
@jlrv | @rafaelvindel | @MalagaJUG
30. ¿Cómo funciona?
PIT cambia el bytecode para introducir las
mutaciones.
× Números de línea
× Nombre del fichero
Para cada mutación, PIT genera una clase Java.
@jlrv | @rafaelvindel | @MalagaJUG
31. × Killed
× Lived
× No Coverage
× Non Viable
× Timeout
× Memory Error
× Run Error
resultados
@jlrv | @rafaelvindel | @MalagaJUG
32.
33. condicionales
× CONDITIONALS_BOUNDARY: cambia los límites de
las condiciones.
× NEGATE_CONDITIONALS: invierte la lógica de
todas las condiciones.
@jlrv | @rafaelvindel | @MalagaJUG
35. aritméticas
× MATH: cambia las operaciones aritméticas por su
inversa.
+ -
* /
& |
<< >>
% *
^ *
>>> <<
@jlrv | @rafaelvindel | @MalagaJUG
36. aritméticas
× INCREMENTS: intercambia las operaciones de
incremento y decremento.
× INVERT_NEGS: invierte el signo de los números.
@jlrv | @rafaelvindel | @MalagaJUG
37. otras
× INLINE_CONSTS: cambiar el valor de las
asociaciones de las variables.
boolean true por false y viceversa
int byte short 1 por 0, -1 por 1, 5 por -1 y el resto x + 1
long 1 por 0 y el resto x + 1
float 1.0 y 2.0 por 0.0 y el resto por 1.0
double 1.0 por 0.0 y el resto por 1.0
@jlrv | @rafaelvindel | @MalagaJUG
38. otras
× RETURN_VALS: cambia el valor devuelto por los
métodos.
boolean true por false y viceversa
int byte short 0 por 1 y el resto por 0
long x 1
float double NAN por 0 y el resto - (x + 1.0)
Object not null por null y RuntimeException por null
@jlrv | @rafaelvindel | @MalagaJUG
39. otras
× VOID_METHOD_CALLS: elimina las invocaciones a
todos los métodos que no tengan valor de
retorno.
@jlrv | @rafaelvindel | @MalagaJUG
40. otras
× NON_VOID_METHOD_CALLS: reemplaza el valor
de los métodos por sus valores por defecto.
boolean false
int byte short long 0
float double 0.0
char ‘u0000’
Object null
@jlrv | @rafaelvindel | @MalagaJUG
41. otras
× CONSTRUCTOR_CALLS: reemplaza el valor
devuelto por los constructores por null.
× EXPERIMENTAL_MEMBER_VARIABLE: reemplaza
la inicialización de las variables por sus valores
por defecto.
@jlrv | @rafaelvindel | @MalagaJUG
51. Análisis Incremental
× Si se detecta un bucle infinito y no se cambia la
clase, se sigue asumiendo el bucle infinito.
× Si se elimina una mutación y no se cambia la
clase ni la prueba, se sigue asumiendo que se
elimina.
@jlrv | @rafaelvindel | @MalagaJUG
52. Análisis Incremental
× Si una mutación sobrevive y no se cambia la
clase ni su cobertura, se sigue asumiendo que
sobrevive.
@jlrv | @rafaelvindel | @MalagaJUG
53. Análisis Incremental
× withHistory: para activarlo o desactivarlo.
× historyInputFile: fichero de donde leer el análisis
anterior.
× historyOutputFile: fichero donde escribir el
resultado del análisis actual (puede ser igual al
anterior).
@jlrv | @rafaelvindel | @MalagaJUG
54.
55. mutation result listener
× Recibe los resultados de las pruebas y se
configura en outputFormats.
× Para añadirlo, implementar:
org.pitest.mutationtest.MutationResultListenerFactory
@jlrv | @rafaelvindel | @MalagaJUG
56. mutation filter
× Se pueden eliminar las mutaciones generadas
antes de ser ejecutadas sobre las pruebas.
× Para añadirlo, implementar:
org.pitest.mutationtest.filter.MutationFilterFactory
@jlrv | @rafaelvindel | @MalagaJUG
57. test prioritiser
× Se puede personalizar el orden de ejecución de
las pruebas contra las mutaciones.
× Para añadirlo, implementar:
org.pitest.mutationtest.build.TestPrioritiserFactory
@jlrv | @rafaelvindel | @MalagaJUG
58. mutation engine
× Se puede proporcionar un motor de mutación
personalizado indicado por mutationEngine.
× Para más información, consultar:
org.pitest.mutationtest.engine.gregor.*
@jlrv | @rafaelvindel | @MalagaJUG
60. Ventajas
× Ayuda a mejorar la calidad de las pruebas.
× Ayuda a detectar errores de forma y contenido
en las pruebas.
@jlrv | @rafaelvindel | @MalagaJUG
61. inconvenientes
× Elevado tiempo de ejecución:
× Volumen de código a ser analizado.
× Conjunto de mutaciones a realizar.
× La cantidad de test que haya que ejecutar.
× Los resultados deben ser correctamente
interpretados:
× Falsos positivos.
@jlrv | @rafaelvindel | @MalagaJUG
63. frente a los altos tiempos de Ejecución...
× Acotar el conjunto de clases mutadas.
× Acotar el conjunto de pruebas ejecutados.
× Análisis incrementales.
@jlrv | @rafaelvindel | @MalagaJUG
64. frente a los Falsos positivos...
× Puede desenmascarar pruebas ambiguas por lo
que mejora también la calidad de las pruebas.
@jlrv | @rafaelvindel | @MalagaJUG
65. Resumiendo...
× ¿Es la cobertura una medida real de calidad?
× Altamente falsificada, no representa un valor
real.
@jlrv | @rafaelvindel | @MalagaJUG
66. Resumiendo...
× ¿Ha sido probado a fondo? ¿Son pruebas
adecuadas? ¿Son pruebas de calidad?
× Puede que sí o puede que no, pero ahora lo
sabemos.
@jlrv | @rafaelvindel | @MalagaJUG