En el desarrollo de software, los datos de prueba son fundamentales para realizar pruebas de calidad en entornos controlados, sin poner en riesgo la privacidad de los usuarios ni comprometer la seguridad de la información. Especialmente cuando se manejan datos sensibles, como en entornos de pruebas de bases de datos, es crucial asegurar que los datos utilizados no revelen información personal identificable (PII) o confidencial.



Este artículo ofrece un enfoque técnico para generar datos de prueba realistas y seguros en MySQL, sin necesidad de herramientas externas. A través de SQL y procedimientos almacenados, podemos generar grandes volúmenes de datos realistas para simular escenarios de prueba en bases de datos de QA. También explicamos cómo integrar técnicas de anonimización y asegurar la confidencialidad de los datos en el proceso.




¿Por qué es importante generar datos de prueba realistas en MySQL?



Los entornos de QA y testing requieren bases de datos que simulen las condiciones de producción, pero sin comprometer la privacidad de los usuarios. Los datos reales, si no se gestionan adecuadamente, pueden poner en riesgo la seguridad de los sistemas y las personas involucradas. Además, las normativas como el GDPR (Reglamento General de Protección de Datos) requieren que los datos personales sean manejados con sumo cuidado, especialmente en procesos de testing.



La creación de datos de prueba realistas en MySQL permite a los equipos de QA, DBAs y CIOs realizar pruebas sin comprometer la privacidad de la información sensible, asegurando que las pruebas sean lo más realistas posible sin infringir la ley.




Generación de datos realistas con MySQL



A continuación, presentamos scripts de MySQL para crear datos de prueba realistas para un entorno de pruebas de QA. Utilizaremos funciones nativas de MySQL y técnicas de anonimización para garantizar que los datos sean útiles para las pruebas, pero sin contener información sensible.



Paso 1: Crear la base de datos y la tabla en MySQL



Primero, necesitamos crear una base de datos de prueba en MySQL y la tabla que contendrá los datos de prueba. En este caso, vamos a simular una base de datos de usuarios para un sistema de registro.



CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;

-- Crear la tabla de usuarios de prueba
CREATE TABLE test_users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    phone VARCHAR(15),
    address VARCHAR(255),
    city VARCHAR(100),
    birthdate DATE
);

Esta tabla simula una base de datos de usuarios con información personal como nombre, correo electrónico, teléfono, dirección, ciudad y fecha de nacimiento. Este será el modelo de datos para nuestras pruebas.




Paso 2: Generar datos de prueba realistas



A continuación, usaremos un procedimiento almacenado en MySQL para generar datos aleatorios y realistas. Este script generará datos con funciones integradas de MySQL, como


RAND(), CONCAT(), FLOOR()

, entre otras.


DELIMITER $$

-- Crear procedimiento para generar datos de prueba
CREATE PROCEDURE generate_test_data(IN num_rows INT)
BEGIN
  DECLARE i INT DEFAULT 0;

  WHILE i < num_rows DO
      -- Insertar datos aleatorios en la tabla
      INSERT INTO test_users (name, email, phone, address, city, birthdate)
      VALUES (
          CONCAT('User_', FLOOR(1 + (RAND() * 9999))), -- Nombre aleatorio
          CONCAT('user', FLOOR(1 + (RAND() * 9999)), '@example.com'), -- Email ficticio
          CONCAT('+34 ', FLOOR(600000000 + (RAND() * 100000000))), -- Teléfono aleatorio
          CONCAT(FLOOR(1 + (RAND() * 999)), ' Fake Street'), -- Dirección ficticia
          CONCAT('City_', FLOOR(1 + (RAND() * 100))), -- Ciudad aleatoria
          DATE_SUB(CURDATE(), INTERVAL FLOOR(18 + (RAND() * 62)) YEAR) -- Fecha de nacimiento aleatoria
      );
      SET i = i + 1;
  END WHILE;
END$$

-- Restaurar delimitador
DELIMITER ;


Paso 3: Ejecutar el procedimiento para generar datos



Una vez que el procedimiento esté creado, podemos generar la cantidad de datos que necesitamos. Por ejemplo, si queremos generar 1,000 filas de datos de prueba, simplemente ejecutamos el siguiente comando:


CALL generate_test_data(1000);


Esto insertará 1,000 registros de datos ficticios en la tabla


test_users

, lo que permitirá a los equipos de QA realizar pruebas sin comprometer la seguridad de los datos reales.



Paso 4: Verificar los datos generados



Para verificar que los datos se han insertado correctamente, podemos realizar una simple consulta SQL:


SELECT * FROM test_users LIMIT 10;

Esto nos mostrará los primeros 10 registros generados, los cuales tendrán nombres, correos electrónicos, teléfonos y otros detalles realistas pero no sensibles.




Enmascaramiento y anonimización de datos en MySQL



Aunque la generación de datos sintéticos es una estrategia eficaz, en muchos casos los equipos de QA también trabajan con subconjuntos de datos reales extraídos de producción. En estos escenarios, aplicar técnicas de enmascaramiento de datos y anonimización es fundamental para proteger la privacidad, reducir riesgos y cumplir con normativas como el RGPD (GDPR) y la directiva NIS2.



El enmascaramiento de datos consiste en transformar elementos sensibles (como nombres, emails o teléfonos) en valores ficticios pero coherentes, que mantienen la estructura y formato original, pero impiden la identificación de las personas.



La anonimización busca eliminar de forma irreversible cualquier vínculo entre los datos y la persona a la que pertenecen, garantizando que no sea posible reconstruir la identidad a partir de los datos anonimizados.



A continuación se muestran algunos ejemplos básicos que pueden aplicarse directamente en MySQL:



Generalización



Reducir el nivel de detalle de ciertos datos es una técnica sencilla para disminuir su sensibilidad. Por ejemplo, almacenar solo el año de nacimiento:


UPDATE test_users
SET birthdate = DATE_FORMAT(birthdate, '%Y-01-01');


Supresión



En algunos casos, conviene eliminar directamente los campos que no sean necesarios para las pruebas:


UPDATE test_users
SET address = NULL;


Pseudonimización



Otra opción es sustituir identificadores directos, como nombres, por seudónimos aleatorios:


UPDATE test_users
SET name = CONCAT('User_', FLOOR(1 + (RAND() * 9999)));


Próximos pasos: técnicas avanzadas de enmascaramiento de datos



Para escenarios más complejos —como enmascarar dominios de correo electrónico, mantener la integridad referencial entre tablas o automatizar procesos de enmascaramiento— es recomendable aplicar técnicas de enmascaramiento de datos más avanzadas.


👉 Si quieres profundizar en este tema, te recomendamos leer nuestra guía: Cómo enmascarar datos en MySQL.