IMEI en lote: Luhn, datos de prueba y automatización QA
Genera lotes de hasta 50 valores válidos por Luhn con RandomIMEI.com o crea un generador local sin duplicados para conjuntos QA mayores.
Un IMEI de prueba puede validar un campo, mientras que las pruebas de carga o migración pueden necesitar conjuntos mucho mayores. RandomIMEI.com crea entre 1 y 50 valores por lote web; para cientos o miles, usa un generador local con deduplicación explícita y conserva los resultados en un entorno de pruebas aislado.
Esta guía define un contrato reproducible de datos de prueba: 15 dígitos, suma Luhn correcta, entradas TAC documentadas, gestión explícita de colisiones y respuestas de estado simuladas.
Por Qué No Puedes Usar Simplemente Números de 15 Dígitos Aleatorios
Las cadenas aleatorias de 15 dígitos suelen incumplir uno o más contratos de prueba:
-
Fallo de Luhn: Un IMEI estándar de 15 dígitos incluye un dígito de control Luhn. Un último dígito uniforme al azar tiene una probabilidad entre diez de coincidir, así que cerca del 90% de las cadenas arbitrarias fallan ante un validador que solo aplica Luhn.
-
No cubre ramas basadas en prefijo: Algunos sistemas mapean los ocho primeros dígitos mediante un conjunto TAC. Un prefijo arbitrario no ejercita un mapeo conocido y puede tratarse como desconocido si el software consulta una fuente autorizada.
-
Duplicados no controlados: Cuando el esquema o escenario exige unicidad, los seriales aleatorios pueden colisionar y activar la restricción por el motivo equivocado.
-
Sin distribución declarada: Una mezcla arbitraria de prefijos no explica qué ramas del producto debe cubrir. Deriva categorías y pesos de tus requisitos, no de una cuota de mercado sin fuente.
Un generador de datos de prueba útil calcula Luhn, usa prefijos documentados para la prueba, elimina duplicados del conjunto actual y permite definir una distribución basada en los requisitos del producto.
Casos de Uso para la Generación Masiva de IMEI
1. Carga inicial de bases de datos y pruebas de esquemas
Al construir o migrar una base de datos, elige una cantidad que ejercite el plan de consulta y las restricciones que quieres medir. Las bases vacías y las pruebas de un registro no revelan:
- Rendimiento de índices con la cardinalidad planificada
- Comportamiento del plan de consulta al filtrar por prefijo TAC de fabricante
- Poda de particiones cuando el esquema particiona por TAC
- Temporización de validación de restricciones bajo carga de inserción
Registra con la medición de rendimiento la versión de la base de datos, la cantidad de filas, las categorías TAC y las consultas. El resultado sintético solo predice producción en la medida en que esas entradas se parezcan a su carga.
2. Pruebas de carga y medición de rendimiento
Repetir un identificador puede medir la caché en vez de la ruta de consulta. Crea un conjunto acorde al comportamiento de caché, la mezcla de peticiones y la concurrencia de tu propio plan.
Proporciona el conjunto controlado a k6, JMeter, Locust o Gatling y conserva las respuestas de estado tras un servicio local simulado. Una cadena IMEI distinta no crea un registro real de dispositivo.
3. Desarrollo de Plataformas MDM
Un plan MDM puede cubrir inscripción, asignación de políticas, inventario e informes con varios tamaños. Usa las cantidades de tu objetivo de capacidad, no un rango genérico del sector.
Los valores masivos sirven para poblar un inventario simulado o de preproducción sin copiar identificadores de clientes. Las respuestas de inscripción y elegibilidad deben seguir simuladas o usar un entorno de prueba aprobado por el proveedor.
4. Flujos de automatización QA
Las suites automatizadas que validan funciones relacionadas con IMEI necesitan datos únicos en cada ejecución. Incrustar unos pocos IMEI de prueba en el código contamina las pruebas: los casos empiezan a interferirse porque comparten el estado de los mismos identificadores.
Un patrón mejor es generar IMEI nuevos al inicio de cada ejecución, o mantener una reserva grande y pregenerada para extraer valores con un contador o desplazamiento aleatorio. La generación masiva admite ambos enfoques.
5. Simulación de Red de Telecomunicaciones
Quienes prueban integraciones HLR, VLR o EIR pueden modelar campos IMSI e IMEI en registros sintéticos. Define la relación y el estado esperado en los datos de prueba; la generación no aporta identidad de abonado ni estado de equipo.
6. Pruebas de mercados de dispositivos de segunda mano
Las plataformas que verifican el estado IMEI (comprobaciones de lista negra, bloqueo de operador o garantía) necesitan probar su flujo de consulta con entradas variadas. Debes cubrir:
- Respuesta controlada: el servicio simulado devuelve estado limpio o bloqueado
- Tiempo de espera agotado o error: el servicio simulado devuelve el formato de fallo del contrato
- Formato inválido: entrada malformada
- Mapeo extremo: Luhn correcto con TAC desconocido para el catálogo de prueba
Un valor generado no tiene estado conocido de lista negra, bloqueo de operador o garantía. Prueba esas ramas con respuestas simuladas bajo tu control y no deduzcas un estado «limpio» a partir de la generación.
Requisitos Técnicos para la Generación Masiva de IMEI Válidos
Generar IMEI válidos a escala requiere resolver varios problemas simultáneamente:
Algoritmo de Luhn a Escala
Cada IMEI generado necesita un dígito de verificación Luhn válido. Aquí está el algoritmo implementado en Python, adecuado para generación masiva:
import random
def luhn_check_digit(digits_14: str) -> int:
"""Calcula el dígito de verificación Luhn para una cadena de 14 dígitos."""
digits = [int(d) for d in digits_14]
# En una base de 14 dígitos, duplica las posiciones 2, 4, ... 14.
for i in range(13, -1, -2):
digits[i] *= 2
if digits[i] > 9:
digits[i] -= 9
total = sum(digits)
return (10 - (total % 10)) % 10
def generar_imei(tac: str) -> str:
"""Genera un IMEI válido con el TAC de 8 dígitos dado."""
if len(tac) != 8 or any(ch not in "0123456789" for ch in tac):
raise ValueError("tac debe contener exactamente 8 dígitos")
serial = str(random.randint(0, 999999)).zfill(6)
base = tac + serial
check = luhn_check_digit(base)
return base + str(check)
def generar_masivo(tac: str, cantidad: int) -> list[str]:
"""Genera una lista de IMEI únicos válidos para un TAC dado."""
if not 1 <= cantidad <= 1_000_000:
raise ValueError("cantidad debe estar entre 1 y 1.000.000")
vistos = set()
resultados = []
while len(resultados) < cantidad:
imei = generar_imei(tac)
if imei not in vistos:
vistos.add(imei)
resultados.append(imei)
return resultados
# Ejemplo: genera 1000 datos de prueba con un prefijo explícitamente no oficial
# elegido para esta prueba aislada. Usa tu propia entrada documentada.
imeis = generar_masivo("12345678", 1000)
print(f"Generados {len(imeis)} IMEI únicos")
print(f"Muestra: {imeis[:5]}")
Define la Distribución desde tu Plan de Pruebas
No copies en los datos de prueba una tabla de cuota de mercado sin fuente. Define las categorías y pesos que admite tu producto, documenta de dónde sale cada requisito e incluye una alternativa explícita para un TAC desconocido.
| Categoría de prueba | Propósito de ejemplo |
|---|---|
| Mapeo local conocido | Ejercitar una rama de etiqueta de dispositivo |
| Prefijo desconocido | Comprobar una alternativa segura |
| Varias familias configuradas | Probar filtros y agregaciones |
| Entradas repetidas o malformadas | Probar restricciones y errores |
Garantizar la Unicidad
Si el esquema o escenario exige unicidad, usa uno de estos enfoques:
- Deduplicación basada en conjuntos (mostrada en el ejemplo Python anterior): Rastrea los IMEI generados en un conjunto y regenera en caso de colisión.
- Seriales secuenciales: incrementa el campo de los dígitos 9–14. Garantiza valores distintos dentro del conjunto de prueba para un TAC. Hay 1.000.000 de combinaciones de entrada, pero Random IMEI no sabe cuáles pueden estar asignadas en el mundo real.
Matemática de Colisiones y Alternativas Deterministas
Un TAC tiene 1.000.000 de entradas seriales de seis dígitos. Con muestreo aleatorio, el número esperado de pares duplicados es aproximadamente n(n-1) / (2 x 1.000.000). Con 1.000 extracciones de un TAC, el valor ronda 0,5, equivalente a cerca de un 39% de probabilidad de al menos una colisión si el generador es uniforme.
Rechazar duplicados con un conjunto limpia la salida, pero pierde eficiencia al llenar el espacio. Los seriales secuenciales hacen reproducible el conjunto de prueba y evitan colisiones internas. Usa más de un TAC solo si el plan necesita distintas categorías de mapeo o más de un millón de entradas distintas.
Matriz de vectores QA
| Entrada | Resultado esperado | Propósito |
|---|---|---|
490154203237518 |
Luhn correcto | Control positivo de la suma |
490154203237519 |
Luhn incorrecto | Dígito de control modificado |
000000000000000 |
Luhn correcto, identidad desconocida | Demuestra que Luhn no es asignación |
49015420323751 |
Longitud incorrecta | Falta el dígito de control |
| Dos filas idénticas | Duplicado según la regla de los datos de prueba | Rama de restricción |
Integración de IMEI Masivos con Herramientas QA
Con k6 (pruebas de carga JavaScript)
import http from 'k6/http';
import { check } from 'k6';
import { SharedArray } from 'k6/data';
// Pre-carga 50.000 IMEI generados desde un archivo
const imeis = new SharedArray('imeis', function () {
return open('./test_imeis.txt').split('\n').filter(l => l.length === 15);
});
export default function () {
// Elige un IMEI aleatorio del conjunto
const imei = imeis[Math.floor(Math.random() * imeis.length)];
// Usa un servicio local simulado cuya respuesta controle la prueba.
const res = http.post('http://localhost:8080/mock/dispositivos/buscar', {
imei: imei,
});
check(res, {
'estado es 200': (r) => r.status === 200,
'devuelve info del dispositivo': (r) => r.json('fabricante') !== undefined,
});
}
Con pytest (suite de pruebas Python)
import pytest
import random
@pytest.fixture
def imei_unico(pool_imeis):
"""Proporciona un IMEI único del conjunto pregenerado."""
return pool_imeis.pop()
@pytest.fixture(scope="session")
def pool_imeis():
"""Carga el conjunto de IMEI pregenerado al inicio de la sesión."""
with open("test_data/imeis_masivos.txt") as f:
imeis = [linea.strip() for linea in f if len(linea.strip()) == 15]
random.shuffle(imeis)
return imeis
def test_busqueda_dispositivo(imei_unico, cliente_api):
respuesta = cliente_api.buscar_dispositivo(imei_unico)
assert respuesta.status_code == 200
assert respuesta.json()["formato_valido"] is True
Con SQL (siembra de base de datos)
-- PostgreSQL: inserción masiva desde CSV
CREATE TEMP TABLE temp_imeis (imei CHAR(15));
COPY temp_imeis FROM '/ruta/a/imeis_masivos.csv' CSV;
-- Insertar en la tabla de dispositivos con metadatos adicionales
INSERT INTO dispositivos_prueba (imei, creado_en, estado)
SELECT
imei,
NOW() - (random() * INTERVAL '365 days'),
CASE WHEN random() < 0.95 THEN 'activo' ELSE 'inactivo' END
FROM temp_imeis
ON CONFLICT (imei) DO NOTHING;
SELECT COUNT(*) FROM dispositivos_prueba; -- Verificar conteo
Uso de RandomIMEI.com para Generación Masiva
RandomIMEI.com admite lotes web pequeños. Puedes:
- Generar entre 1 y 50 valores por solicitud
- Seleccionar fabricante y perfil de la copia local fechada
- Copiar los resultados o descargar un archivo CSV
El sitio no ofrece una API pública de generación. Para automatización o conjuntos mayores, adapta el ejemplo local de Luhn de esta guía y añade entradas deterministas, deduplicación y controles exclusivos para pruebas.
Cada IMEI generado:
- Tiene un dígito de verificación Luhn válido
- Usa un prefijo de la copia local versionada y no oficial de Random IMEI
- Se deduplica dentro del lote web actual
Random IMEI no consulta GSMA, operadores, activación, garantía ni listas negras. Por ello no puede determinar si un resultado está asignado, registrado, bloqueado o será aceptado por otro sistema. Trátalo siempre como dato sintético y no lo envíes a sistemas de identidad reales.
Formatos de Salida para IMEI Masivos
RandomIMEI.com ofrece portapapeles y CSV. Un generador local bajo tu control puede emitir además los formatos que necesite tu entorno de pruebas:
| Formato | Caso de Uso | Ejemplo |
|---|---|---|
| Texto plano | Scripting shell, importaciones simples | Un IMEI por línea |
| CSV | Hojas de cálculo, importaciones portal MDM | imei,fabricante,modelo |
| Lista JSON | Integraciones API, herramientas JavaScript | ["490154203237518", ...] |
| Objetos JSON | Metadatos ricos para cada IMEI | [{"imei": "...", "tac": "35299906", "marca": "Apple"}] |
| INSERT SQL | Siembra directa de base de datos | INSERT INTO dispositivos VALUES (...) |
Para Qué NO Son los IMEI Generados en Masa
En algunas jurisdicciones y organizaciones, la generación masiva de IMEI puede ser apropiada para datos de prueba aislados cuando la política interna y la ley aplicable lo permitan. No es una herramienta para:
- Suplantación de IMEI: Reprogramar o falsear el identificador de un dispositivo real puede ser ilegal y queda fuera del propósito del sitio. Mantén los valores generados como datos en pruebas controladas.
- Eludir listas: Un valor generado no tiene un estado de registro verificado. Nunca lo envíes a un operador, lista negra, activación u otro servicio de identidad en producción.
- Fraude: Fraude de seguros, fraude de financiación de dispositivos, o cualquier otro esquema que implique falsificar la identidad de un dispositivo. Los datos de prueba generados existen para entornos de desarrollo, no para enviarlos a sistemas del mundo real.
Las leyes varían según la jurisdicción. Usar un identificador falso para acceder a servicios, suplantar un dispositivo o cometer fraude puede ser ilegal; mantén los datos de prueba en entornos controlados y solicita asesoramiento jurídico en flujos regulados.
Preguntas Frecuentes
¿Cuántos IMEI únicos puedo generar de un único código TAC?
El campo serial de seis dígitos tiene 1.000.000 de entradas posibles por TAC. Enumerarlas crea otros tantos valores de prueba distintos, pero Random IMEI no sabe si alguno coincide con un dispositivo asignado. Usa varios TAC cuando el contrato requiera más valores o categorías de mapeo.
¿Cuál es la forma más rápida de generar 1 millón de IMEI de prueba?
Un enfoque determinista consiste en enumerar el rango serial de un prefijo de prueba documentado y calcular Luhn para cada fila. Evita colisiones aleatorias; mide el tiempo y el tamaño del conjunto en tu propio entorno.
¿Puedo usar IMEI generados masivamente en un flujo CI/CD?
Sí. Genera valores mediante un script local previo a las pruebas o conserva un conjunto claramente etiquetado como dato de prueba. RandomIMEI.com no tiene una API pública de generación, por lo que CI debe usar código propio, revisable y reproducible.
¿Funcionan los IMEI generados masivamente con herramientas reales de comprobación IMEI?
Superan las comprobaciones que solo exigen 15 dígitos y una suma Luhn correcta. Otros servicios pueden consultar datos privados de TAC, operador, lista negra o garantía. Random IMEI no conoce ni predice esos resultados, así que no envíes valores generados a servicios de consulta reales.
¿Cómo evito duplicados en un conjunto generado masivamente?
Rechaza colisiones con un conjunto cuando uses seriales aleatorios, o enumera el campo serial de forma determinista. El segundo método evita duplicados internos y hace reproducibles las ejecuciones. Exige unicidad solo cuando forme parte del contrato del esquema o escenario.
¿Existe el riesgo de que un IMEI generado coincida con el IMEI de un dispositivo real?
Sí. Un serial aleatorio dentro de un TAC puede coincidir con un identificador asignado, y Random IMEI no dispone de una base oficial de asignaciones para excluirlo. Mantén los resultados aislados de operadores, activación, garantía, financiación, seguros y listas negras.
Fuentes y lecturas adicionales
- TS.06 v28.1 IMEI Allocation and Approval Process — GSMA
- 3GPP TS 23.003 Release 14: Numbering, addressing and identification — ETSI
- SharedArray — Grafana k6
- PostgreSQL COPY — PostgreSQL Global Development Group
Prueba nuestras herramientas
Crea fixtures válidos por Luhn o comprueba el formato de 15 dígitos y checksum de un valor.
Artículos relacionados
Cómo validar un IMEI: algoritmo de Luhn explicado
Comprueba el formato y la suma Luhn de un IMEI de 15 dígitos con un ejemplo y vectores QA. No verifica asignación, propiedad ni listas negras.
¿Qué es un TAC? Los primeros 8 dígitos del IMEI
El TAC corresponde a los primeros 8 dígitos del IMEI y puede asociarse a un tipo mediante datos autorizados. Distingue asignación y consulta.
Guía de pruebas de IMEI Samsung: TAC, Luhn y Knox
Guía sobre IMEI de prueba etiquetados como Samsung y simulaciones Knox. El generador usa una copia local, no identidades Galaxy verificadas.