Por Qué Importa el Testing de Manejo de Errores
Los usuarios inevitablemente encontrarán errores — visitarán páginas eliminadas, enviarán formularios inválidos, experimentarán timeouts de red y activarán fallos del servidor. Cómo tu aplicación maneja estos errores determina si los usuarios se quedan o se van, si confían en tu producto y si los atacantes pueden explotar las respuestas de error.
Categorías de Códigos de Estado HTTP
| Rango | Categoría | Significado |
|---|---|---|
| 2xx | Éxito | Solicitud completada exitosamente |
| 3xx | Redirección | El cliente debe tomar acción adicional |
| 4xx | Error del Cliente | La solicitud era inválida |
| 5xx | Error del Servidor | El servidor falló al cumplir una solicitud válida |
Códigos Clave a Probar
| Código | Significado | Cuándo Probar |
|---|---|---|
| 200 | OK | Cada solicitud exitosa |
| 301 | Movido Permanentemente | Migraciones de URL, redirects HTTPS |
| 400 | Bad Request | Datos de solicitud malformados |
| 401 | No Autorizado | Autenticación faltante o inválida |
| 403 | Prohibido | Auth válida pero permisos insuficientes |
| 404 | No Encontrado | URLs inexistentes |
| 429 | Demasiadas Solicitudes | Rate limiting |
| 500 | Error Interno del Servidor | Excepciones no manejadas |
| 503 | Servicio No Disponible | Mantenimiento, sobrecarga |
Testing de Páginas de Error Personalizadas
Página 404
- URL inexistente muestra 404 personalizado (no error genérico)
- Mantiene branding del sitio (header, footer, estilos)
- Navegación disponible
- Barra de búsqueda presente
- Links a páginas populares
- Retorna código HTTP 404 correcto (no 200)
- Funciona en todos los idiomas soportados
Página 500
- Mensaje amigable sin detalles técnicos
- Sin stack traces, errores de BD ni rutas de archivos
- Información de contacto o link de soporte
- Sugiere intentar de nuevo más tarde
Página 403
- Explica que el acceso es denegado sin revelar por qué
- Sugiere iniciar sesión si no está autenticado
Testing de Errores de Validación de Formularios
Validación del Lado del Cliente
| Escenario | Comportamiento Esperado |
|---|---|
| Campo requerido vacío | “Este campo es requerido” cerca del campo |
| Formato de email inválido | “Por favor ingresa un email válido” |
| Contraseña muy corta | “La contraseña debe tener al menos 8 caracteres” |
| Contraseñas no coinciden | “Las contraseñas no coinciden” |
Validación del Lado del Servidor
- Deshabilitar JavaScript y enviar formularios sigue mostrando errores
- Solicitudes directas por API retornan mensajes de error apropiados
Consideraciones de Seguridad
Qué NO deben revelar las respuestas de error: stack traces, errores de BD, rutas de archivos, versiones del servidor, IPs internas.
El login debe decir “Email o contraseña inválidos” (no “Email no encontrado”).
Ejercicio: Auditoría de Manejo de Errores
Prueba el manejo de errores de una aplicación web.
Parte 1: Páginas de Error HTTP
| Prueba | URL/Acción | Esperado | Real | Estado |
|---|---|---|---|---|
| Página 404 | /pagina-inexistente | 404 personalizado con nav | ||
| 404 retorna código correcto | Verificar response code | HTTP 404 | ||
| 404 en otros idiomas | /es/pagina-inexistente | 404 en idioma correcto | ||
| Página 403 | Acceder admin sin auth | 403 personalizado o redirect | ||
| Página 500 | Activar error del servidor | 500 sin stack trace |
Parte 2: Validación de Formularios
| Input | Valor | Mensaje de Error Esperado |
|---|---|---|
| vacío | “Email es requerido” | |
| “no-es-email” | “Ingresa un email válido” | |
| Contraseña | “123” | “Mínimo 8 caracteres” |
| Campo requerido | omitirlo | “Este campo es requerido” |
Parte 3: Seguridad de Mensajes de Error
| Verificación | Pasa/Falla |
|---|---|
| Sin stack traces en ninguna respuesta | |
| Sin errores de BD visibles | |
| Sin rutas de archivos | |
| Sin versión del servidor en headers | |
| Error de login no revela si email existe |
Solución: Bugs Comunes de Manejo de Errores
Bug 1: Página 404 retorna HTTP 200. Motores de búsqueda indexan páginas “no encontrado” como contenido real.
Bug 2: Stack trace visible en error 500 de producción. Error del servidor revelaba todo el stack trace.
Bug 3: Errores de validación desaparecen al hacer scroll. Los errores en la parte superior se perdían.
Bug 4: Login revela existencia de email. “No se encontró cuenta” ayuda a atacantes.
Bug 5: API retorna consulta SQL. Solicitud malformada exponía detalles de BD.
Bug 6: Página de error sin navegación. Solo “Página no encontrada” sin ningún link.
Automatización de Manejo de Errores
test('página 404 retorna código correcto', async ({ page }) => {
const response = await page.goto('/pagina-que-no-existe');
expect(response.status()).toBe(404);
await expect(page.locator('nav')).toBeVisible();
});
test('errores API no filtran internos', async ({ request }) => {
const response = await request.get('/api/users/id-invalido');
const body = await response.json();
expect(body.message).not.toContain('Exception');
expect(body.message).not.toContain('SELECT');
});
Puntos Clave
- El manejo de errores es frecuentemente sub-probado — inclúyelo como parte estándar del plan de testing
- Las páginas de error personalizadas deben mantener branding y proporcionar navegación
- Los mensajes de error deben ser amigables: explicar el problema y cómo corregirlo
- Nunca expongas detalles técnicos en respuestas de error de producción
- Previene filtración de información a través de respuestas de error (enumeración de login)
- Verifica que los códigos HTTP coincidan con el tipo de error