El guardián funcionaba. Lo había escrito para que ninguna sesión abierta en un proyecto tocara los archivos de otro, tenía tres pruebas, y las tres estaban en verde. Llevaban meses en verde.
Estaba ciego en 1.029 de las 6.309 líneas que vigilaba. Ochocientas veinticuatro de ellas con código ejecutable.
Y las tres pruebas seguían pasando, porque las tres miraban rutas que estaban limpias.
El defecto no está en el detector: está en cómo se prueba
Un detector se prueba con casos. Lo natural es sacarlos del propio sistema: se le pasan los archivos reales y se comprueba que no encuentra nada, porque el sistema está sano. Cien casos, todos en verde, y la sensación de haber medido algo.
No se ha medido nada.
Un banco hecho solo de negativos sobre artefactos que hoy están limpios sale verde con la regla buena y sale verde con una regla que no mira. Un archivo sin infracciones devuelve vacío en los dos mundos: en el del detector que funciona y en el del detector que se rompió hace tres meses. Los dos resultados son idénticos, y por tanto el banco no distingue entre ellos.
Lo que ese banco mide es el artefacto vigilado, no el vigilante. Y el vigilante es justo la pieza cuyo fallo no se queja nunca.
Es la forma disfrazada de un error muy conocido, y por eso se cuela: las pruebas existen, están bien escritas, son legibles y pasan. No hay nada que revisar en la revisión de código. El defecto no está en ninguna línea; está en el conjunto.
La pareja
La corrección es barata y cabe en una frase: toda sonda nace con dos casos, no con uno. El que TIENE que ver algo y el que TIENE que no verlo.
Con solo el primero pasa igual un instrumento que diga que sí a todo. Con solo el segundo, uno ciego. Hacen falta los dos, y hacen falta juntos: cada uno tapa exactamente el punto ciego del otro.
Y hay dos condiciones que se olvidan en cuanto se escribe el segundo caso, que son las que hacen la diferencia entre una pareja de verdad y una decorativa.
Primera: el caso rojo tiene que fallar por la vía real. Romper la regla en el arnés de pruebas no sirve. Hay que romperla en el código que se está midiendo, y exigir que la prueba se ponga roja de verdad. Si al mutilar el detector la prueba sigue verde, lo que se estaba midiendo era el arnés. Y conviene comprobar además que el mutante compiló: una prueba que se pone roja porque el código no construye no ha demostrado nada sobre la regla.
Segunda: el detector se prueba también contra fuente sintética. No basta con los archivos reales. Hay que fabricar un texto que SÍ tenga la infracción y otro que no, y pasarlos por la misma costura que usa el camino real. Si la prueba entra por otra puerta —una función auxiliar, un objeto ya construido— el rojo puede venir del arnés y no del detector, y se vuelve al principio.
El mutante ya existe, y es gratis
Esta es la parte que más rinde por minuto invertido, y casi nadie la usa.
Cuando se corrige un detector, la versión anterior de la regla es el mutante que hace falta. Está en el historial, a un comando de distancia:
git show HEAD:ruta/al/detector.py > /tmp/version_anterior.py
Se corre la pareja nueva de pruebas contra esa versión vieja. Si el caso rojo se pone rojo con ella, la pareja discrimina: distingue la regla buena de la regla ciega. Si sale verde con las dos, las pruebas nuevas no valen más que las viejas y todavía no se ha arreglado nada.
Cuesta un minuto. Es la diferencia entre creer que se ha reparado un detector y saberlo.
Cómo apareció el ciego, que también enseña
No lo encontró una prueba. Lo encontró tirar del hilo contrario.
El guardián daba una falsa alarma: avisaba cada vez que un comando redirigía a un archivo cualquiera, incluso a /dev/null. Molesto y visible. Al escribir el caso que faltaba para arreglar ese falso positivo, apareció su pareja silenciosa: escribir directamente en un archivo de otro proyecto no avisaba jamás. Llevaba así desde el primer día.
No eran dos defectos. Era uno solo, mirado por los dos lados. El lado ruidoso se quejaba todos los días; el lado ciego no se iba a quejar nunca.
De ahí sale una regla práctica que vale para cualquier detector: cuando arregles un falso positivo, busca el falso negativo que comparte causa. El ruidoso te lleva al mudo, y el mudo es el caro.
Qué queda
Tres cosas, y ninguna cuesta dinero:
- Un banco de solo negativos no discrimina, por muchos casos que tenga. Si todas tus pruebas afirman «aquí no hay nada», salen verdes con la regla buena y con una regla muerta.
- Cada sonda va con su pareja, el rojo falla por la vía real, y el mutante se saca del historial.
- Toda alarma ruidosa esconde una gemela silenciosa. Búscala cuando la arregles.
Lo último, que es lo incómodo: esto pasó en un guardián mío, escrito por mí, con pruebas escritas por mí. La disciplina no se cae auditando lo ajeno; se cae justo donde el objeto de la comprobación es algo que acabas de escribir tú, porque pensarlo se siente ya verificado y no lo está.
Xiliux