Inicio / Verificar lo que devuelve
Prueba el verificador antes de creer su veredicto
Un control que da una cifra plausible no es lo mismo que un control que da una cifra correcta, y un control defectuoso rara vez falla de forma ruidosa, da un resultado que parece correcto.
Un script escrito para medir algo, un número de problemas, de caracteres que coinciden con un patrón, de archivos mal nombrados, se ejecuta y muestra una cifra que parece plausible. Una cifra plausible y una cifra correcta no son lo mismo, y la diferencia entre ambas casi nunca se anuncia por sí sola.
Cinco bugs, cinco cifras falsas y convincentes
Durante una sola auditoría, cinco mediciones escritas a medida resultaron ser falsas, cada una por una razón distinta. Una comprobación de directorio devolvía falso ante un enlace simbólico válido, como si la carpeta enlazada no existiera. Una comparación a nivel de bytes contaba mal los caracteres acentuados, compuestos por varios bytes. Una operación de agrupación ignoraba las mayúsculas y minúsculas y fusionaba elementos que deberían haber quedado separados. Una marca de orden de bytes inyectada al principio del archivo falseaba cualquier lectura posterior, y una expresión regular mal ajustada a los finales de línea se saltaba contenido. Ninguno de los cinco errores se anunció: cada uno produjo una cifra razonable, y cada una era falsa.
Lo que el punto de una expresión regular realmente atraviesa
El caso de los finales de línea se mide en lugar de suponerse. En JavaScript, por defecto, el punto de una expresión regular no atraviesa ningún salto de línea, ni el simple retorno de línea de los sistemas Unix ni el par de caracteres que usa Windows. El script pointe.js compara ambos casos, sobre un archivo de cada estilo.
node pointe.js unix.txt
point simple, sans drapeau s : false
point simple, drapeau s : true
deux points, drapeau s : false
node pointe.js windows.txt
point simple, sans drapeau s : false
point simple, drapeau s : false
deux points, drapeau s : true
La trampa propia de Windows solo aparece una vez activada la bandera que permite al punto atravesar saltos de línea: un final de línea de Windows cuenta como dos caracteres, un retorno de carro y un salto de línea, y un solo punto solo cubre uno de los dos. En un archivo Unix, esa misma bandera basta, ya que solo hay un carácter que atravesar. Una autoprueba que incluya contenido a caballo sobre un final de línea de Windows, con la bandera activa, atrapa el error que la misma entrada con final de línea Unix no puede revelar.
La autoprueba, antes de confiar
El remedio cuesta unos minutos y debe ejecutarse antes de la primera salida real de un script de medición. Dale una entrada fabricada que debe señalar sin falta, y una entrada limpia que no debe señalar bajo ningún concepto. Haz que estos dos casos cubran las particularidades reales de tu terreno: finales de línea distintos, caracteres acentuados, enlaces simbólicos, mayúsculas y minúsculas mezcladas. Un script incapaz de clasificar correctamente sus propios casos de prueba de respuesta conocida no merece ninguna confianza sobre datos reales, sea cual sea la plausibilidad de su cifra.
Contar también las falsas alertas
Un verificador de enlaces rotos señaló un día un lote de problemas del que la figura que acompaña esta lección da el recuento exacto y la parte realmente fundada. La mayoría de los avisos venían de una incoherencia de nomenclatura que el verificador no había previsto, y dos bugs distintos de falsos positivos se escondían bajo ese ruido: una marca de orden de bytes confundida con un bloque de metadatos faltante, y un ejemplo entre comillas dentro de un bloque de código confundido con una verdadera infracción de estilo. Estos dos bugs solo se encontraron probando el detector contra casos conocidos, nunca escudriñando su salida con más atención. Una acusación falsa cuesta tanta confianza como un defecto no detectado: mide la tasa de falsos positivos de un detector, no solo lo que atrapa.
Hacer que el propio programa escriba su archivo de salida evita la marca de orden de bytes: en PowerShell 5.1, la redirección y Out-File insertan una, invisible; Set-Content no añade ninguna pero escribe en codificación local, rompiendo los acentos (E9, E0, E7). Remedio: escritura explícita en UTF-8 sin marca, mediante WriteAllText y UTF8Encoding($false). Este principio se une a un verde no prueba nada hasta que no ha sido probado el mismo: un control que no ha demostrado su valía en casos conocidos no merece ningún crédito en casos reales.
Cinco fallos silenciosos y la autoprueba que los atrapa
| Modo de fallo silencioso | A qué se parece | Autoprueba que lo atrapa |
|---|---|---|
| Enlace simbólico leído como inexistente | Una comprobación de directorio devuelve falso ante un enlace simbólico válido | Incluir una carpeta enlazada por enlace simbólico en el caso de prueba limpio conocido |
| Recuento erróneo de caracteres acentuados | Una comparación a nivel de bytes cuenta mal los caracteres multibyte | Incluir caracteres acentuados en los dos casos de prueba |
| Marca de orden de bytes inyectada por PowerShell 5.1 | En Windows PowerShell 5.1, el operador de redirección y Out-File añaden una marca invisible al principio del archivo; Set-Content no añade ninguna pero escribe en codificación local, lo que rompe los caracteres acentuados | Escribir explícitamente en UTF-8 sin marca, por ejemplo WriteAllText con UTF8Encoding($false), y luego verificar los primeros bytes y la relectura de los acentos |
| Punto de una expresión regular que no atraviesa ningún final de línea | En JavaScript, sin la bandera que lo permite, no se encuentra ningún contenido a caballo sobre un salto de línea | Incluir contenido a caballo sobre un salto de línea, con la bandera activa, en el caso malo conocido |
| Agrupación insensible a mayúsculas y minúsculas | Un paso de agrupación fusiona entradas que solo difieren en mayúsculas y minúsculas | Incluir un par mismo texto, distinta capitalización, en el caso malo conocido |
Un verificador de enlaces rotos, probado contra sí mismo
Un script de recuento recibe una carpeta de prueba construida para el ejercicio. Esta carpeta contiene una subcarpeta enlazada por enlace simbólico, además de varios archivos de texto en formato ASCII simple. El script recorre toda la carpeta y devuelve un recuento que incluye los archivos alcanzados por el enlace simbólico.
Escribe en una frase lo que este resultado establece, y en una frase lo que no establece.
Lo que esto establece: El script cuenta correctamente los archivos alcanzados por un enlace simbólico, la trampa que esta carpeta de prueba cubría.
Lo que esto no establece: No establece que el script cuente correctamente archivos que contienen caracteres acentuados o una marca de orden de bytes, trampas que esta carpeta de prueba no cubría.
Los tres calibrados falsos más frecuentes
- Demasiado amplio El script contará a partir de ahora correctamente cualquier carpeta real, sean cuales sean los caracteres o marcas que contenga.
- Demasiado estrecho Este resultado no prueba nada, ya que solo se usó una carpeta de prueba.
- Fuera de lugar Este resultado muestra que el script se ejecuta más rápido que la versión anterior del mismo script.
- Un script de medición defectuoso rara vez falla de forma ruidosa: da una cifra que parece correcta.
- En JavaScript, el punto de una expresión regular no atraviesa ningún salto de línea por defecto; la trampa de Windows solo aparece con la bandera que lo permite, y exige dos puntos ya que un final de línea de Windows cuenta como dos caracteres.
- La autoprueba se compone de una entrada mala conocida que hay que señalar y de una entrada limpia conocida que no hay que señalar, ambas construidas sobre las particularidades reales del terreno.
- La tasa de falsos positivos de un detector se mide con la misma importancia que lo que atrapa, ya que una acusación falsa cuesta tanta confianza como un defecto no detectado.
- En Windows PowerShell 5.1, el operador de redirección y Out-File inyectan una marca de orden de bytes invisible; Set-Content no añade ninguna pero escribe en codificación local y rompe los caracteres acentuados, siendo el remedio medido una escritura explícitamente codificada en UTF-8 sin marca.
Toma un script de medición que ya uses, escríbele una entrada fabricada que debe señalar y una entrada limpia que no debe señalar, añade un caso límite real de tu terreno, y confirma los dos veredictos antes de seguir usándolo.