Un generador de direcciones aleatorias es la forma más rápida de meter volumen realista en una prueba de formulario de dirección, y también la forma más rápida de crear una suite en la que nadie confía. La diferencia casi nunca está en el generador. Está en si la salida tiene semilla, en si la forma coincide con lo que la prueba afirma y en si las filas generadas acaban alguna vez en un entorno donde alguien las lee como reales.
Este manual cubre lo que importa en la práctica: elegir fixtures aleatorios pero representativos, propagar una semilla por todas las capas, generar casos límite a propósito en lugar de esperar que aparezcan y escribir aserciones que no dependan de la dirección en sí. Los ejemplos suponen un formulario con línea 1, línea 2, ciudad, región, código postal y país, que es la forma que usa la mayoría de los checkouts.
Por qué lo aleatorio supera a un fixture escrito a mano
Un fixture escrito a mano codifica una sola suposición, y normalmente es la dirección del propio autor. Ese único valor rara vez cubre un nombre de calle largo, una unidad secundaria, un código de territorio o un país cuyo código postal contiene letras. Cada caso no cubierto es un defecto esperando a que lo descubra un cliente.
La generación aleatoria con semilla fija da amplitud sin renunciar a la estabilidad. Puedes generar cien direcciones de 38 países, volver a ejecutar exactamente las mismas cien mañana y aun así plantar casos límite concretos donde quieras. El generador cubre 38 países con cinco fixtures de ciudad cada uno, así que la amplitud está acotada y se conoce, en lugar de depender de lo que internet produjera ese día.
Hay una segunda ventaja que los fixtures escritos a mano nunca tienen: cobertura negativa. Un autor suele escribir valores que espera que funcionen, lo que significa que la suite ejercita el camino feliz y lo da por completo. Un generador con semilla más una lista explícita de casos límite también ejercita los límites, y cuando uno falla, el informe nombra la semilla y la regla que produjo el valor en lugar de un literal que alguien escribió hace años.
- Amplitud: muchas combinaciones de país y patrón sin escribirlas a mano
- Estabilidad: una semilla hace que la secuencia sea repetible en cualquier máquina
- Legibilidad: los fallos informan de una semilla y un índice, no de un muro de datos
- Honestidad: la salida es explícitamente sintética, así que nadie la confunde con PII
Aleatorio no es lo mismo que representativo
El muestreo uniforme sobre 38 países no es una carga de trabajo. El tráfico real está muy sesgado hacia el mercado en el que vendes y usa sobre todo uno o dos países. Si tu prueba extrae países de forma uniforme, el 90 por ciento de las ejecuciones se dedica a locales que tus clientes nunca tocan, y el único mercado que importa recibe una fracción de la cobertura.
Elige pesos en lugar de aleatoriedad pura. Da al mercado principal la mayor parte del volumen, da a los mercados secundarios una cuota que puedas justificar y reserva una pequeña porción para países de cola larga cuyos formatos difieren estructuralmente, como Japón con su orden de líneas invertido o los Países Bajos con letras después de los dígitos. Añade Hong Kong y los Emiratos Árabes Unidos de forma explícita, porque ninguno tiene código postal y expondrán un error de campo obligatorio en la primera ejecución.
| Porción de fixtures | Cuota sugerida | Qué ejercita |
|---|---|---|
| Mercado principal | 60 por ciento | El camino que toma la mayoría de los clientes |
| Mercados secundarios | 25 por ciento | Listas de regiones y patrones postales que difieren |
| Casos estructurales atípicos | 10 por ciento | Japón, Países Bajos, Brasil, Canadá |
| Países sin código postal | 5 por ciento | Hong Kong, Emiratos Árabes Unidos |
Aleatoriedad con semilla, de extremo a extremo
Sembrar solo funciona si una semilla llega a todas las capas. Si la API genera un registro en la preparación de la prueba y el navegador genera otro durante el relleno del formulario, los dos no coinciden y la aserción falla por el motivo equivocado. Pasa la semilla por la fábrica de fixtures, el payload de la API y el helper del navegador como un único valor, y regístrala en el informe de la prueba.
El generador tiene semilla y es reproducible, así que la misma semilla produce las mismas direcciones en el mismo orden. Deriva sub-semillas de la semilla padre y de un índice estable para que añadir una prueba en medio no renumere todos los registros posteriores. Eso mantiene comparables los artefactos y capturas guardados entre ejecuciones, lo que importa cuando un diff visual es la única señal que tienes.
- Una semilla por ejecución de prueba, impresa en la salida del fallo
- Registra semilla más índice en cualquier artefacto que conserves
- Hashea la semilla padre con el índice del registro para las sub-semillas
- Nunca mezcles una ruta con semilla con una basada en reloj en la misma prueba
- Trata un cambio de semilla como un cambio de fixture y vuelve a establecer la línea base de las capturas
Ajustar el alcance de los fixtures al nivel de la prueba
La aleatoriedad correcta depende del nivel. Las pruebas unitarias quieren valores pequeños y explícitos que hagan obvia la aserción. Las pruebas de integración quieren longitudes de campo realistas. Las pruebas de extremo a extremo quieren valores que sobrevivan a un navegador real y a un serializador real. Las pruebas de carga quieren volumen y una distribución estable, no variedad.
Un error común es usar fixtures completos de extremo a extremo en todas partes. Eso hace ilegibles los fallos unitarios y ralentiza el bucle interno. El error opuesto, usar una dirección fija para e2e, oculta todas las ramas específicas de cada país. Elige el fixture más pequeño que pueda hacer fallar el comportamiento bajo prueba.
| Nivel | Origen del fixture | Volumen | Persistido |
|---|---|---|---|
| Unitario | Literal fijo, un campo por caso | 1-5 | No |
| Integración | Generador con semilla, un país por caso | 10-50 | Sí, en una base de datos de prueba |
| Extremo a extremo | Generador con semilla, países ponderados | 5-20 | Sí, limpiado en cada ejecución |
| Carga | Generador con semilla, conjunto de datos precalculado | 10k y más | Sí, almacén aislado |
| Visual | Generador con semilla, semilla congelada | 3-8 | No |
Casos límite que conviene generar a propósito
La aleatoriedad acabará produciendo un nombre de calle largo, pero no producirá deliberadamente una unidad secundaria de 35 caracteres ni un código postal con un espacio final. Esos casos son baratos de plantar y caros de pasar por alto. Genéralos desde una lista explícita en lugar de esperar que la distribución colabore.
Planta casos en el límite y uno más allá. Si la línea 1 está limitada a 100 caracteres, prueba 99, 100 y 101. Si el campo postal recorta espacios en blanco, prueba un valor con un espacio inicial y un valor con un espacio de no separación, porque son caracteres distintos y normalmente solo uno de ellos se recorta.
| Caso límite | Valor de ejemplo | Defecto que detecta |
|---|---|---|
| Línea de calle larga | Un nombre de calle de 100 caracteres | Truncamiento silencioso en la base de datos |
| Unidad larga | Apartment 1204 Building C West Wing | Límite de longitud de la línea 2 demasiado pequeño |
| Ciudad con acento | Montreal con una e acentuada | Daño de codificación en el serializador |
| Apóstrofo en la calle | O Connell Street con un apóstrofo | Error de escape de SQL o HTML |
| País sin código postal | Hong Kong con un código vacío | Regla de campo obligatorio incorrecta |
| Código postal con cero inicial | 01067 para Alemania | Almacenamiento como entero que pierde el cero |
| Código postal con guion | 97205-2515 | Patrón anclado solo a cinco dígitos |
| Espacio de no separación | Código postal con U+00A0 | Recorte que solo maneja U+0020 |
Afirma sobre la forma, no sobre la dirección
Una aserción que compara la dirección renderizada con una cadena generada literal es frágil: se rompe cuando cambia el fixture y no demuestra nada sobre el comportamiento. Afirma las propiedades de las que es responsable la aplicación. El país debe ir y volver sin cambios. El código postal debe coincidir con el patrón del país seleccionado. La fila almacenada debe ser igual a los valores enviados tras la normalización documentada.
Un patrón útil es una tabla de aserciones de forma compartida entre pruebas: para cada país, una regex del código postal, el número esperado de líneas de dirección y si la región es obligatoria. Así, cualquier valor generado, con cualquier semilla, o cumple el contrato o revela una divergencia real. La prueba deja de importarle qué nombre de calle salió del generador.
| Campo | Aserción | Motivo |
|---|---|---|
| País | El código de dos letras va y vuelve sin cambios | La normalización debe ser sin pérdida |
| Región | Miembro de la lista de regiones del país | Los selects dependientes se restablecen correctamente |
| Código postal | Coincide con el patrón del país | Estructura, no existencia |
| Línea 1 | No vacía tras el recorte, dentro de la longitud máxima | Límite de almacenamiento aplicado |
| Línea 2 | Cadena vacía en lugar de null cuando falta | Consistencia del serializador |
Mantener las filas generadas fuera de los entornos compartidos
Las direcciones generadas solo son seguras de almacenar donde todos aceptan que son falsas. Dales un marcador inconfundible: un email en el dominio reservado example.test, un registro de cliente marcado como fixture o un tenant dedicado en staging. El generador ya limita los números de teléfono al rango de ficción NANP 555-0100 a 555-0199 y los emails a example.test precisamente por esto.
Nunca siembres una base de datos de staging compartida que también leen ventas o soporte sin avisarles, y nunca copies una fila de staging a producción para depurar un informe. Las filas generadas parecen plausibles, que es su propósito y su peligro. Si un fixture se escapa a una tabla de analítica, las cifras de conversión se mueven y nadie puede distinguir qué pedidos eran reales.
- Etiqueta cada registro generado con un flag de fixture o un id de tenant
- Usa emails de example.test y números de teléfono 555-01xx, como hace el generador
- Limpia en cada ejecución en lugar de acumular una base de clientes falsa
- Bloquea el correo saliente y la captura de pagos para los tenants de fixture
- Nunca uses datos generados en una demo a un cliente sin una etiqueta visible
Preguntas
- Sí, cuando la salida tiene semilla y las aserciones comprueban la forma en lugar de valores literales. La salida sin semilla convierte cualquier aserción dependiente de los datos en una prueba inestable.
- Registra la semilla y el índice del registro junto con el fallo. La misma semilla e índice regeneran la dirección idéntica en cualquier máquina.
- No en todas las pruebas. Pondera mucho el mercado principal e incluye casos estructurales atípicos, además de Hong Kong y los EAU, que no tienen código postal, en una suite de formatos dedicada.
- Sí, precalcula un conjunto de datos con semilla y cárgalo en un almacén aislado. Nunca apuntes una prueba de carga a una base de datos que también sirve tráfico real.
- Coinciden con la estructura del país. Solo los ZIP de US tienen una comprobación de existencia contra 40.979 filas, y ningún país recibe una garantía de entregabilidad.
¿Es seguro un generador de direcciones aleatorias para pruebas automatizadas?+
¿Cómo reproduzco un fallo de CI?+
¿Deben las pruebas cubrir los 38 países?+
¿Puedo usar filas generadas para pruebas de carga?+
¿Las direcciones generadas pasan la validación postal?+
Los ejemplos son sintéticos. No utilices una dirección generada para verificaciones de identidad, registro de cuentas ni entregas.
Estándares de referencia
Herramientas relacionadas
- Abrir el generador de direcciones aleatorias
- Por país
- Formato de dirección
- Búsqueda de ZIP
- Validador de direcciones
- Generador por lotes