·4 min de lectura·Mounaji Studio

Una página puede estar caída sin devolver un solo error

Nuestro formulario de contacto respondía, se veía bien y no enviaba nada. Dos rutas indexadas devolvían 200 y estaban vacías. Ningún monitor de disponibilidad lo detecta, porque nada falla — lo que falta es la última milla.

engineeringtestingweb

También en: English · 日本語

Un monitor de disponibilidad responde una sola pregunta: ¿respondió el servidor? Es una buena pregunta, y no es la que se hacen tus clientes. Ellos preguntan si lo que vinieron a hacer realmente ocurrió.

Encontramos el hueco en nuestro propio sitio, que es el lugar menos cómodo para encontrarlo.

Tres fallas que devolvían 200

El formulario de contacto no enviaba nada. El enlace "Contact" de nuestra navegación apuntaba a una página armada con una plantilla de UI sin tocar: cuatro campos sin estado y sin atributo name, y un botón "Submit" sin manejador de envío. Se veía perfecto. No validaba nada, no enviaba nada y no le avisaba al visitante que algo andaba mal — porque, desde el punto de vista del navegador, nada andaba mal.

Dos rutas indexadas estaban vacías. Una tenía 587 líneas de código, unas 470 comentadas, y renderizaba un contenedor vacío de cuatro pantallas de alto. Estaba en nuestro sitemap con prioridad 0.9 y cinco enlaces desde el footer. La otra contenía las palabras "Web Development" dentro de un div de siete pantallas. Las dos devolvían 200. Las dos estaban en el índice de Google.

Cinco íconos daban 404 en cada carga. El <head> y el web manifest pedían apple-touch-icon.png, dos favicons y dos íconos de Android. Ninguno de los cinco archivos existía. Cada visita a cada página disparaba cinco peticiones fallidas, y la página igual se veía bien.

Por qué los códigos de estado no lo ven

Un código de estado describe el transporte, no la transacción. 200 OK significa que el servidor encontró algo para mandar. No dice nada sobre si ese algo hace su trabajo.

El patrón va más allá de las páginas web:

  • Un webhook que devuelve 200 y descarta el payload.
  • Un checkout que muestra la confirmación antes de que el cobro se acredite.
  • Un formulario que envía bien a un servicio de email cuya plantilla fue borrada.
  • Un proceso en segundo plano que termina con código cero después de atrapar el error que tenía que reportar.

En todos los casos el monitoreo está en verde, los logs están tranquilos y el trabajo no se está haciendo. La falla no es un error: es un acuse de recibo confundido con un resultado.

Qué revisar en cambio

La pregunta útil no es "¿respondió?" sino "¿ocurrió el efecto?", y el efecto casi siempre está en otro lugar que la respuesta.

Para cada camino que importa, nombra el efecto observable y comprueba eso:

Camino Chequeo débil Chequeo real
Formulario de contacto La página devuelve 200 Llega un mensaje a la bandeja
La ruta existe Código de estado Leer el <title> y un texto conocido del cuerpo
Recurso referenciado El archivo está en el repo Pedir la URL que el HTML realmente emite
Proceso en segundo plano Código de salida 0 La fila que tenía que escribir está ahí

Vale la pena detenerse en el chequeo del <title>. En nuestro sitio listamos siete productos y dos juegos, cada uno con un enlace a algo vivo. Dos subdominios .vercel.app que dábamos por nuestros respondían 200 sirviendo la página "Create Next App" de fábrica. El código de estado decía que el enlace estaba bien. Leer el título decía que no.

La versión barata

No hace falta una suite de tests para cerrar la mayor parte del hueco. Hace falta una aserción por camino crítico que nombre el efecto:

  • Enviar el formulario real desde un navegador real una vez por deploy, y mirar la bandeja.
  • Para cada URL del sitemap, pedirla y verificar un texto que sólo esa página contiene.
  • Para cada recurso referenciado en el <head>, pedirlo y verificar que el cuerpo no esté vacío.

Cada una se escribe en minutos. Las tres juntas habrían detectado todo lo de arriba, meses antes.

La regla que nos quedó: un chequeo que sólo puede dar verde no es un chequeo. Si no puedes describir el estado del mundo que haría fallar tu test, el test está midiendo el transporte, y el transporte nunca fue lo que te preocupaba.

Chat with us