Pruebas y QA · 6 min de lectura

Generador de direcciones aleatorias para pruebas: manual de QA 2026

Cómo usar un generador de direcciones aleatorias en pruebas sin suites inestables: salida con semilla, alcance de los fixtures por nivel, generación de casos límite y aserciones solo de forma.

Por Charlie Simmon ·

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 fixturesCuota sugeridaQué ejercita
Mercado principal60 por cientoEl camino que toma la mayoría de los clientes
Mercados secundarios25 por cientoListas de regiones y patrones postales que difieren
Casos estructurales atípicos10 por cientoJapón, Países Bajos, Brasil, Canadá
Países sin código postal5 por cientoHong 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.

NivelOrigen del fixtureVolumenPersistido
UnitarioLiteral fijo, un campo por caso1-5No
IntegraciónGenerador con semilla, un país por caso10-50Sí, en una base de datos de prueba
Extremo a extremoGenerador con semilla, países ponderados5-20Sí, limpiado en cada ejecución
CargaGenerador con semilla, conjunto de datos precalculado10k y másSí, almacén aislado
VisualGenerador con semilla, semilla congelada3-8No

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ímiteValor de ejemploDefecto que detecta
Línea de calle largaUn nombre de calle de 100 caracteresTruncamiento silencioso en la base de datos
Unidad largaApartment 1204 Building C West WingLímite de longitud de la línea 2 demasiado pequeño
Ciudad con acentoMontreal con una e acentuadaDaño de codificación en el serializador
Apóstrofo en la calleO Connell Street con un apóstrofoError de escape de SQL o HTML
País sin código postalHong Kong con un código vacíoRegla de campo obligatorio incorrecta
Código postal con cero inicial01067 para AlemaniaAlmacenamiento como entero que pierde el cero
Código postal con guion97205-2515Patrón anclado solo a cinco dígitos
Espacio de no separaciónCódigo postal con U+00A0Recorte 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.

CampoAserciónMotivo
PaísEl código de dos letras va y vuelve sin cambiosLa normalización debe ser sin pérdida
RegiónMiembro de la lista de regiones del paísLos selects dependientes se restablecen correctamente
Código postalCoincide con el patrón del paísEstructura, no existencia
Línea 1No vacía tras el recorte, dentro de la longitud máximaLímite de almacenamiento aplicado
Línea 2Cadena vacía en lugar de null cuando faltaConsistencia 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

¿Es seguro un generador de direcciones aleatorias para pruebas automatizadas?+
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.
¿Cómo reproduzco un fallo de CI?+
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.
¿Deben las pruebas cubrir los 38 países?+
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.
¿Puedo usar filas generadas para pruebas de carga?+
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.
¿Las direcciones generadas pasan la validación postal?+
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.

Los ejemplos son sintéticos. No utilices una dirección generada para verificaciones de identidad, registro de cuentas ni entregas.

Estándares de referencia

Leer a continuación

Todas las guías