Falsas eliminaciones en pruebas de mutación: línea base y motivos
Publicado 2026-10-27
Las pruebas de mutación cambian su código a propósito (un < pasa a <=, un return x pasa a return None) y comprueban si sus pruebas lo notan. Un mutante «eliminado» (killed) significa que una prueba falló. Pero una prueba puede fallar por motivos que nada tienen que ver con la mutación, y entonces su puntuación de mutación parece mejor de lo que realmente son sus pruebas. Esta guía presenta tres comprobaciones que detectan estas falsas eliminaciones.
Por qué ocurren las falsas eliminaciones
| Causa | Qué se observa |
|---|---|
| La suite ya fallaba o era inestable antes de la mutación | Muchas eliminaciones con el mismo error sin relación |
| Las pruebas importan el archivo original, no la copia mutada | Eliminaciones solo por tiempos de espera o errores de entorno |
| Tiempos de espera agotados por máquinas lentas | Eliminaciones concentradas en las pruebas de larga duración |
| Estado compartido entre ejecuciones (archivos temporales, cachés, puertos) | El resultado de la eliminación cambia al repetir el mismo mutante |
Los tiempos de espera importan para la puntuación: en Stryker, detected = killed + timeout y mutation score = detected / valid × 100. Una máquina que agota el tiempo con frecuencia infla la puntuación. Fuente: estados de mutantes y métricas de Stryker, consultada el 2026-10-19.
Comprobación 1 — Línea base en una copia limpia
- Copie el proyecto a un directorio nuevo, exactamente como lo hará la herramienta de mutación (mismo sandbox, mismas variables de entorno).
- Ejecute allí la suite de pruebas completa sin mutación, tres veces.
- Debe pasar las tres veces. Cualquier fallo aquí es un fallo preexistente que luego aparecerá como falsas eliminaciones: corríjalo o póngalo en cuarentena primero.
cp -r project /tmp/mt-baseline && cd /tmp/mt-baseline
for i in 1 2 3; do pytest -q -p no:cacheprovider || echo "BASELINE FAIL $i"; done
Comprobación 2 — Demostrar que las pruebas leen el archivo mutado
Si una prueba nunca carga el archivo mutado, no puede haber eliminado ese mutante. Registre el acceso a archivos durante cada ejecución de mutante. En Python, basta un gancho de auditoría:
# conftest.py
import sys, os
TARGET = os.environ.get("MUT_TARGET") # path of the mutated file
def hook(event, args):
if event == "open" and TARGET and str(args[0]).endswith(TARGET):
open("/tmp/mut_touched", "a").write("1")
sys.addaudithook(hook)
Ejecute cada mutante sin bytecode obsoleto (borre __pycache__ en la copia) para que el archivo fuente se lea realmente. Regla: una eliminación en la que el archivo objetivo nunca se abrió se marca como sospechosa y se repite. En otras pilas tecnológicas, strace -e trace=openat (Linux) o los datos de cobertura del ejecutor de pruebas cumplen el mismo propósito.
Comprobación 3 — Examine la distribución de motivos de eliminación
- Para cada mutante eliminado, guarde por qué falló la ejecución: error de aserción, otra excepción, tiempo de espera, fallo abrupto, error de recopilación/importación.
- Haga una tabla de recuento sencilla.
| Motivo | Patrón saludable | Señal de alarma |
|---|---|---|
| Fallo de aserción | La mayoría de las eliminaciones | — |
| Otra excepción | Algunas | Un mismo mensaje idéntico en muchos mutantes |
| Tiempo de espera | Pocas (mutantes de bucle infinito) | Una proporción grande; aumenta en máquinas más lentas |
| Error de importación / recopilación | Casi ninguno | Cualquier proporción significativa: falla el arnés, no las pruebas |
Resumen
- Línea base en verde 3/3 en una copia limpia
- Cada eliminación tiene un registro de «archivo objetivo abierto»
- Los fallos de aserción son el motivo de eliminación más numeroso
- Repita un 5% aleatorio de las eliminaciones; los resultados no deberían cambiar
Preguntas frecuentes
- ¿Debo aumentar el tiempo de espera?
- Fíjelo a partir de la línea base: mida el tiempo normal de la suite y permita un múltiplo de él. Demasiado bajo genera falsas eliminaciones; demasiado alto ralentiza la ejecución.
- ¿Cuentan los errores de compilación?
- En Stryker, los errores de compilación y de ejecución son mutantes «inválidos» y no forman parte de la puntuación.
Fuentes
- Stryker: estados de mutantes y métricas — consultado 2026-10-19
Relacionado (coreano): 개발 지식 모음 (en coreano)
🌐 English · Español · Bahasa Indonesia · 日本語 · ไทย · Tiếng Việt · 中文