Pruebas de Mutación
Una técnica para evaluar la calidad de los tests introduciendo pequeños cambios (mutaciones) al código y verificando si los tests los detectan. Las mutaciones no detectadas indican tests débiles.
Definicion
Las pruebas de mutación crean "mutantes" — copias del código con pequeños cambios como invertir operadores (> a <), eliminar declaraciones o cambiar valores de retorno. Los buenos tests deberían fallar al ejecutarse contra mutantes ("matarlos"). Los mutantes supervivientes revelan brechas en la cobertura de tests o aserciones. Las herramientas incluyen Stryker (JavaScript/TypeScript), PIT (Java) y mutmut (Python). Mutation score = mutantes matados / total de mutantes.
Por que es importante
La cobertura de código puede ser alta mientras los tests siguen siendo débiles (ej. tests que ejercitan código sin verificar resultados). Las pruebas de mutación miden la efectividad real de los tests. La investigación muestra que las pruebas de mutación encuentran 2-4 veces más defectos que las pruebas basadas en cobertura.
Ejemplo
Código: if (age >= 18) return true. Un mutante cambia >= a >. Si los tests no lo detectan (todos los usuarios de prueba son >18, ninguno exactamente 18), el mutante sobrevive, revelando un test de caso límite faltante.