Las pruebas de formularios de dirección fallan en lugares predecibles. Los campos son simples, así que el formulario se construye rápido, y luego corrompe silenciosamente un código postal canadiense, elimina un cero inicial alemán o exige una región después de que el usuario elige Hong Kong. Una lista de verificación vale más aquí que las pruebas exploratorias, porque el conjunto de fallos es bien conocido y finito.
Esta es una lista de verificación de 40 puntos agrupada en ocho áreas, con la regla concreta detrás de cada punto. Asume un formulario con línea 1, línea 2, ciudad, región, código postal y país, lo que cubre la gran mayoría de los flujos de pago y registro. Cada punto se puede observar sin acceso al backend, y cada uno corresponde a un defecto que se ha publicado en algún lugar.
1. Inventario de campos y restricciones
Empieza por anotar cada campo, su propósito, su límite de almacenamiento y si es obligatorio. La mitad de los defectos de esta lista son imposibles de evaluar sin esa tabla, porque «el formulario rechazó mi dirección» no es accionable hasta que sabes qué campo la rechazó y por qué.
Las restricciones deben ser por país, no globales. Una longitud máxima única de 10 para el código postal funciona en la mayoría de los países y falla en Irlanda con 8 caracteres y un espacio, y un máximo global de 30 para la ciudad trunca muchas nombres reales. Establece límites generosos y valida el patrón del país en lugar de una longitud elegida para un solo mercado.
| Campo | Obligatorio cuando | Máximo sugerido | Validar como |
|---|---|---|---|
| Línea de dirección 1 | Siempre, excepto formularios solo de PO Box | 100 caracteres | Texto libre, no vacío tras recortar |
| Línea de dirección 2 | Nunca | 100 caracteres | Texto libre, opcional |
| Ciudad | Siempre | 85 caracteres | Texto libre, no solo una lista |
| Región | Donde el país tiene regiones | 3 caracteres para US y CA | Lista controlada por país |
| Código postal | Donde el país tiene uno | 12 caracteres | Patrón del país |
| País | Siempre | Código de 2 letras más nombre | Lista fija |
2. Dependencia de país y región
Cambiar el país debe restablecer la región, cambiar la etiqueta del campo postal, cambiar el teclado y el patrón, y borrar cualquier estado de validación obsoleto. El error clásico es una provincia canadiense que queda seleccionada tras cambiar a Estados Unidos, lo que envía un formulario de aspecto válido con un par de valores imposible.
Hong Kong y los Emiratos Árabes Unidos no tienen códigos postales, así que el campo debe volverse opcional y la etiqueta debe indicarlo. Japón invierte el orden de la dirección, y el formulario debe presentar los campos en el orden local o dejar claro que se espera el orden occidental. Prueba el cambio en ambas direcciones y prueba un cambio de país después de que ya se haya mostrado un error de validación.
| Cambio de país | Lista de regiones esperada | Comportamiento postal esperado |
|---|---|---|
| US a CA | Provincias y territorios | Patrón A1A 1A1, espacio permitido |
| CA a US | 50 estados más DC y territorios | 5 dígitos o ZIP+4 |
| Cualquiera a HK | Distritos | Opcional, vacío permitido |
| Cualquiera a AE | Emiratos | Opcional, vacío permitido |
| US a GB | Condados o texto libre | Código exterior e interior |
| GB a JP | Prefecturas | 3-4 dígitos, guion permitido |
3. Momento y estado de la validación
Valida el formato al perder el foco, valida los campos obligatorios al enviar y borra un error en cuanto el valor sea válido. Validar en cada pulsación castiga al usuario que está a mitad de escribir un código postal, y validar solo al enviar hace que el usuario descubra seis errores a la vez sin ninguna orientación.
Nunca desactives el botón de envío como sustituto de la validación. Un botón desactivado sin explicación es la queja de accesibilidad más común en los formularios de dirección, porque el usuario no puede saber qué falta y un lector de pantalla puede no anunciar el cambio. Mantén el botón activo, envía y muestra un resumen con enlaces a cada campo.
| Evento | Qué validar | Qué mostrar |
|---|---|---|
| Al cambiar | Consistencia de país y región | Restablecer campos dependientes |
| Al perder el foco | Formato del campo que perdió el foco | Error en línea si no es válido |
| Al escribir tras un error | Volver a comprobar y borrar si se corrigió | Eliminar el error de inmediato |
| Al enviar | Todos los campos, incluidos los obligatorios | Resumen más foco en el primer error |
| Al recibir la respuesta del servidor | Errores del servidor por campo | Asignar de vuelta a los mismos ids de campo |
4. Textos de error y ubicación de los errores
Un mensaje de error debe decir qué campo está mal, cuál es el formato aceptado y cómo corregirlo. «Dirección no válida» falla en los tres. «El código postal debe tener 5 dígitos, por ejemplo 97205» los cumple. Para países cuyo formato es inusual, incluye un ejemplo en lugar de un patrón, porque los usuarios no leen expresiones regulares.
Coloca el error junto al campo y también en un resumen en la parte superior del formulario cuando este sea largo. Asócialo con aria-describedby y establece aria-invalid en el input. Mueve el foco al primer campo no válido al enviar, o al resumen si el resumen es interactivo. Prueba con un lector de pantalla, no solo visualmente.
- Nombra el campo en el mensaje
- Indica el formato esperado con un ejemplo
- Di qué hacer, no solo qué está mal
- Nunca culpes al usuario; di «Introduce un ZIP de 5 dígitos»
- Mantén el mensaje en el idioma y la dirección de la página
5. Manejo de la entrada: pegar, autocompletar y teclados
Pegar es donde salen a la luz los errores de formato. Un usuario pega «K1A 0B1» con un espacio de no separación, o una dirección completa en la línea 1. El formulario debe recortar, normalizar los separadores conocidos y conservar los espacios internos. No debe eliminar los guiones de un ZIP+4 ni de un código neerlandés, y no debe convertir a mayúsculas el nombre de una ciudad que legítimamente tiene mayúsculas y minúsculas mezcladas.
El autocompletado depende de los nombres de token correctos. Usa address-line1, address-line2, address-level2 para la ciudad, address-level1 para la región, postal-code y country, y no reutilices street-address en un campo de una sola línea a menos que realmente sea un bloque de calle multilínea. En móvil, los teclados numéricos suelen carecer de guion, así que un ZIP+4 o un código neerlandés introducido con inputmode="numeric" se vuelve imposible de completar. Usa inputmode="text" donde el patrón permita separadores.
| Campo | Token de autocompletado | Teclado móvil |
|---|---|---|
| Línea de dirección 1 | address-line1 | text |
| Línea de dirección 2 | address-line2 | text |
| Ciudad | address-level2 | text |
| Región | address-level1 | text o un selector |
| Código postal | postal-code | text cuando se permite un guion |
| País | country | selector |
6. Longitud, truncamiento y codificación
Prueba el límite y un carácter por encima para cada campo. El truncamiento es peor que el rechazo, porque el usuario ve un envío exitoso y el valor almacenado es incorrecto. Si la columna de la base de datos tiene 50 caracteres y el formulario permite 100, el defecto aparece solo con entradas largas, que es exactamente lo que nunca contienen los datos de prueba escritos a mano.
Prueba caracteres no ASCII: letras acentuadas, el apóstrofo en O Connell, el guion en un nombre de calle francés, la eszett en una calle alemana y escrituras de derecha a izquierda. Comprueba que el valor viaja de ida y vuelta por la API, la base de datos, la exportación CSV y la etiqueta impresa. Los errores de codificación a menudo aparecen solo en el paso de exportación, que es el paso que nadie prueba.
- Límite: máximo menos uno, máximo, máximo más uno
- Acentos: e con acento agudo, u con diéresis, c con cedilla
- Puntuación: apóstrofos, guiones, puntos en abreviaturas de calle
- Espacios en blanco: iniciales, finales, dobles, de no separación
- Escrituras: árabe y hebreo para la dirección, japonés para el ancho
- Ida y vuelta: formulario, API, base de datos, exportación, etiqueta
7. Accesibilidad y localización
Cada campo necesita una etiqueta visible asociada programáticamente al input. El texto de marcador de posición no es una etiqueta: desaparece al escribir y se anuncia de forma inconsistente. Agrupa los campos de dirección en un fieldset con un legend, y haz que los selectores de país y región se puedan operar con el teclado con búsqueda por escritura.
Para locales de derecha a izquierda, establece dir en el contenedor y no en los inputs individuales, para que la puntuación y el icono de error queden en el lugar correcto. Comprueba que las etiquetas traducidas no se desbordan al 200 por ciento de zoom y que el resumen de errores se anuncia cuando aparece. Son comprobaciones baratas que detectan los defectos por los que cobran las auditorías de accesibilidad.
| Comprobación | Condición de aprobado |
|---|---|
| Asociación de etiqueta | Al hacer clic en la etiqueta se enfoca el input |
| Aria en error | aria-invalid true y aria-describedby apunta al mensaje |
| Orden de foco | El orden de tabulación sigue el orden visual |
| Zoom | El diseño funciona al 200 por ciento sin solapamientos |
| RTL | Dirección establecida en el contenedor, iconos reflejados |
| Lector de pantalla | Se anuncian el nombre del campo, el valor y el error |
8. El paquete de regresión
Convierte la lista de verificación en un pequeño paquete automatizado que se ejecute en cada cambio. Veinte casos cubren el conjunto de fallos: un caso válido y uno no válido para el mercado principal, un caso para Canadá, el Reino Unido, Alemania, Japón, Brasil, Hong Kong y los Emiratos Árabes Unidos, más longitudes límite, una ciudad no ASCII, un valor pegado con un espacio de no separación y un cambio de país después de un error.
Mantén cada caso independiente y con datos iniciales definidos. Verifica la forma del resultado en lugar de una cadena literal, y verifica el texto de error visible para los casos no válidos, porque las regresiones en los textos de error son regresiones reales. Un paquete de este tamaño se ejecuta en segundos y detecta la mayoría de los defectos descritos anteriormente.
| Grupo de casos | Cantidad | Cubre |
|---|---|---|
| Mercado principal válido y no válido | 4 | Rutas principales y textos de error |
| Casos estructurales atípicos | 7 | CA, GB, DE, JP, BR, HK, AE |
| Longitudes límite | 4 | Truncamiento y rechazo |
| Codificación y pegado | 3 | No ASCII, NBSP, pegado de dirección completa |
| Restablecimientos de dependencias | 2 | Cambio de país, recarga con valores obsoletos |
Preguntas
- Unos veinte cubren el conjunto de fallos comunes: casos válidos y no válidos del mercado principal, casos estructurales atípicos como Canadá, Japón y Hong Kong, longitudes límite, codificación y restablecimientos al cambiar de país.
- No. Valida el formato al perder el foco y los campos obligatorios al enviar, y luego borra los errores en cuanto el valor sea válido. La validación por pulsación castiga a los usuarios que están a mitad de la entrada.
- Hong Kong no tiene códigos postales, así que un campo postal obligatorio bloquea una dirección válida. Lo mismo ocurre con los Emiratos Árabes Unidos; en ambos casos el campo debe ser opcional.
- address-line1, address-line2, address-level2 para la ciudad, address-level1 para la región, postal-code y country. Permiten que los navegadores rellenen el formulario correctamente.
- Envía un valor con la longitud máxima, un carácter menos y un carácter más, y luego lee el valor almacenado. El truncamiento silencioso tras un envío exitoso es el defecto que hay que detectar.
¿Cuántos casos de prueba necesita un formulario de dirección?+
¿Debe ejecutarse la validación en cada pulsación?+
¿Por qué Hong Kong rompe los formularios de dirección?+
¿Qué tokens de autocompletado debe usar un formulario de dirección?+
¿Cómo pruebo el truncamiento?+
Los ejemplos son sintéticos. No utilices una dirección generada para verificaciones de identidad, registro de cuentas ni entregas.