En este momento estás viendo Harnessing Randomness: Datafaker and Instacio in Test Data Generation

Harnessing Randomness: Datafaker and Instacio in Test Data Generation

  • Autor de la entrada:
  • Categoría de la entrada:testing

Esta charla de Andrés Sacco, desarrollador experimentado, en Testing Chile aborda el desafío recurrente en el desarrollo de software de generar datos de prueba para aplicaciones complejas. Sacco explica que crear manualmente estos datos es tedioso, propenso a errores y consume mucho tiempo, especialmente cuando se deben considerar validaciones específicas o se necesita una gran cantidad de escenarios únicos. Para mitigar estos problemas, propone el uso de librerías de generación de datos de prueba, destacando Datafaker e Instancio como las opciones más robustas. Ambas herramientas permiten automatizar la creación de objetos y valores aleatorios o basados en patrones definidos, lo que optimiza significativamente el proceso de testing al asegurar pruebas más completas y consistentes.


Introducción y Contexto

La charla aborda un problema recurrente en el desarrollo de software: la complejidad y el tiempo invertido en la generación de datos de prueba para aplicaciones con cierta complejidad. Se destaca la necesidad de crear pruebas unitarias o de integración antes de un despliegue.

Problemas clave identificados en la generación manual de datos de prueba:

  • Alto costo de setup: Se requiere poblar mucha información (nombre, apellido, edad, dirección, etc.) para cada escenario de prueba, lo que consume mucho tiempo.
  • Conocimiento de constraints: Es necesario conocer reglas específicas para cada atributo (longitud máxima del nombre, formato de fecha, tipos de documento válidos), lo cual es inmanejable en plataformas grandes.
  • Falsos positivos: Ingresar datos incorrectos o no acordes a las reglas puede llevar a que los tests parezcan exitosos, ocultando problemas reales en la lógica de negocio.
  • Reducción de calidad de código: Omitir el testeo de ciertos campos por falta de tiempo o interés puede llevar a una menor calidad de las pruebas.
  • Duplicidad y falta de consistencia: Múltiples desarrolladores o testers generando sus propios sets de datos pueden crear información inconsistente o duplicada.
  • Sobrecarga (overhead): Crear numerosos casos de prueba con datos únicos o manejar cambios en las reglas de negocio implica un esfuerzo significativo.
  • Pérdida de tiempo en «qué valores pasar»: Los desarrolladores pierden tiempo definiendo valores en lugar de centrarse en «qué quiero probar».

Ejemplos de escenarios:

  • Escenario laxo: Generar una reserva de aerolínea donde los valores pueden ser arbitrarios (ID, lista de pasajeros, itinerario).
  • Escenario con restricción numérica: Valores numéricos sin restricciones específicas más allá del tipo de dato (BigDecimal para precios).
  • Escenario con datos reales: Necesidad de datos reales y válidos para campos como nombre, apellido, tipo y número de documento, y fecha de nacimiento, debido a validaciones internas.

Soluciones y Alternativas

El ponente presenta tres alternativas para abordar estos problemas:

  1. Cada test declara su propio conjunto de datos: Genera mucho código duplicado y reintroduce los problemas iniciales.
  2. Almacenar datos en un archivo: Puede ser útil, pero carece de la flexibilidad y dinamismo necesarios para muchos escenarios.
  3. Uso de librerías especializadas: La opción más recomendada para delegar la responsabilidad de la generación de datos.

Librerías para la generación de datos de prueba (en el ecosistema JVM):

  • Data Faker: Destaca por su popularidad, documentación, gran variedad de generadores y la capacidad de crear generadores personalizados. Existe en otros lenguajes (.NET, Python).
  • Instancio: Popularidad similar a Data Faker, buena documentación, reduce la complejidad al generar objetos y poblar información.
  • Easy Random: Menos popular que Data Faker e Instancio.
  • Dolwich: Menos popular que Data Faker e Instancio.

Ventajas de Instancio:

  • Generación simple de valores aleatorios para objetos.
  • Posibilidad de definir patrones (regex, rangos de fechas).
  • Detección y poblamiento recursivo de objetos anidados.
  • Fácil integración con librerías de test.
  • Open source y con actualizaciones frecuentes.

Ejemplos de uso:

  • Generación básica: Instancio.create(Passenger.class)
  • Con reglas específicas:Instancio.of(Passenger.class)
  • .set(field(«documentNumber»), «88888888») // Define valor exacto
  • .generate(field(«birthday»), Gen.temporal().localDate().past().years(18, 99)) // Rango de edad
  • .create();
  • Setear atributos específicos: Se puede crear una instancia y luego setear valores específicos, similar a la generación manual pero partiendo de un objeto ya poblado automáticamente.

Cuándo usar Instancio: Cuando la necesidad principal es poblar objetos de forma aleatoria, sin un interés excesivo en el formato o la «realidad» de los valores, solo que no sean nulos o vacíos y cumplan un formato básico.

Data Faker: Características y Ejemplos

Ventajas de Data Faker:

  • 200 proveedores (generadores) de valores aleatorios: Desde direcciones, compañías aéreas, aeropuertos, ciudades, países, hasta personajes de El Señor de los Anillos, Friends, Back to the Future, Chuck Norris, libros, colores, etc.
  • Creación de generadores propios: Permite manejar atributos con valores específicos del negocio.
  • Transformación de formatos: Permite convertir entre tipos de datos (string a fecha) o aplicar formatos específicos (zonas horarias).
  • Manipulación simple de colecciones/listas.
  • Definición de patrones para campos.
  • Open source y actualizaciones frecuentes.

Ejemplos de uso:

  • Generación de pasajeros con datos realistas:Faker faker = new Faker();
  • Passenger passenger = new Passenger();
  • passenger.setFirstName(faker.name().firstName());
  • passenger.setLastName(faker.name().lastName());
  • passenger.setDocumentType(«DNI»);
  • passenger.setDocumentNumber(faker.number().digits(8));
  • passenger.setBirthday(faker.date().birthday(18, 99)); // Rango de edad
  • Generación de JSONs o CSVs con esquemas definidos: Es posible definir el esquema de un JSON y Data Faker lo poblará con valores aleatorios (ej: dirección, nombre, código postal, ciudad, país).
  • Valores numéricos aleatorios: faker.number().randomDouble(2, 10, 100) para precios entre 10 y 100 con 2 decimales.
  • Generadores condicionales: Para combos o choices (ej. DNI, Pasaporte, ID de Tarjeta), se puede seleccionar un valor aleatoriamente de una lista predefinida.
  • Datos variados: Permite generar direcciones, emails, URLs, nombres de compañías, industrias, fechas futuras/pasadas, números de teléfono, etc.

Cuándo usar Data Faker: Cuando se necesitan datos más «reales», con formato específico, que sigan reglas complejas, o se requiera una gran diversidad de valores predefinidos (nombres de ciudades, personajes, etc.). Es ideal para pruebas donde las validaciones de negocio son estrictas.

Demostración Práctica (Código Java)

  • Dependencias: Se agregan instancio-core y datafaker al proyecto Maven/Gradle.
  • JSON/CSV Generation: Demostración de cómo generar un JSON estructurado con datos aleatorios usando Faker, incluyendo direcciones completas (aunque no necesariamente consistentes en la relación ciudad-estado-país en el ejemplo).
  • Combinación de librerías: Se propone crear una clase «Utility» (ej. ReservationUtil) que encapsule la lógica de generación de objetos usando Data Faker. Esto permite la reutilización en múltiples tests, asegurando que cada ejecución genere un set de datos distinto y reduciendo el código duplicado.
  • Generadores de ejemplo: Se muestran métodos para generar datos de personas, direcciones, empresas, fechas, emails, URLs, teléfonos y datos más específicos como aerolíneas o libros.

Buenas Prácticas y Reflexiones

  • Usar la herramienta correcta: Instancio para generación aleatoria básica, Data Faker para datos más realistas y complejos.
  • Optimizar llamadas repetitivas: Centralizar la lógica de generación de objetos en un solo lugar (ej. una clase utilitaria) para reutilización y fácil mantenimiento.
  • Considerar locales: Algunos proveedores de Data Faker permiten especificar idiomas o regiones (ej. es, en-US), pero no todos. Consultar la documentación.
  • No todo debe ser aleatorio: Es crucial saber cuándo definir valores explícitamente en lugar de delegar todo a la herramienta, especialmente para escenarios de prueba específicos que dependen de un valor concreto.
  • Usar el generador más adecuado: Elegir el generador específico que mejor resuelva la necesidad (nombres, fechas, números) o crear uno si no existe.
  • Documentar las decisiones: Es fundamental documentar por qué se eligió una herramienta sobre otra. Esto evita discusiones futuras y retrabajos cuando nuevos miembros se unan al equipo o haya propuestas de cambio. La tabla comparativa presentada es un buen ejemplo de esta documentación.
  • Capacidad de elementos: La cantidad de elementos o registros que se pueden generar está limitada únicamente por la capacidad de la máquina donde se ejecuta (memoria, procesamiento).

Preguntas y Respuestas Clave

  • IA (LLMs) para generación de datos: Es recomendable, especialmente en contextos sin generadores automáticos. Sin embargo, requiere interacción repetitiva para distintos escenarios. Las librerías como Data Faker permiten definir la lógica una vez y delegar el problema, siendo más eficiente para volúmenes altos y escenarios recurrentes.
  • Beneficio de tiempo: Estas herramientas liberan al desarrollador de la tarea repetitiva de generar datos, permitiéndole enfocarse en el qué probar y en la lógica de negocio, en lugar de en los valores específicos de los atributos.
  • Limitaciones en cantidad de datos: No hay limitaciones impuestas por las librerías; el límite es la capacidad de hardware del entorno de ejecución.

Recursos Adicionales

  • Libros sobre Testing:«Testing para Developers»
  • «Writing Testable Code»
  • Libros sobre AI en testing.
  • Blogs y comunidades sobre testing.
  • Repositorio de código de la charla (GitHub).
  • Página oficial de Data Faker.

Charla (Canal en YouTube)

Gus Terrera

Apasionado por el agile testing y la ia.