🔍검색

Inicio › Guías

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

CausaQué se observa
La suite ya fallaba o era inestable antes de la mutaciónMuchas eliminaciones con el mismo error sin relación
Las pruebas importan el archivo original, no la copia mutadaEliminaciones solo por tiempos de espera o errores de entorno
Tiempos de espera agotados por máquinas lentasEliminaciones 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

  1. Copie el proyecto a un directorio nuevo, exactamente como lo hará la herramienta de mutación (mismo sandbox, mismas variables de entorno).
  2. Ejecute allí la suite de pruebas completa sin mutación, tres veces.
  3. 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

  1. 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.
  2. Haga una tabla de recuento sencilla.
MotivoPatrón saludableSeñal de alarma
Fallo de aserciónLa mayoría de las eliminaciones—
Otra excepciónAlgunasUn mismo mensaje idéntico en muchos mutantes
Tiempo de esperaPocas (mutantes de bucle infinito)Una proporción grande; aumenta en máquinas más lentas
Error de importación / recopilaciónCasi ningunoCualquier proporción significativa: falla el arnés, no las pruebas

Resumen

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

Relacionado (coreano): 개발 지식 모음 (en coreano)

🌐 English · Español · Bahasa Indonesia · 日本語 · ไทย · Tiếng Việt · 中文

📤 공유