Generación automática de datos con Mockaroo y Podam

1. Mockaroo

Se trata de una herramienta web desarrollada por Mark Brocato, desde la que vamos a poder generar hasta 100.000 líneas de datos realistas para pruebas que podremos exportar en formato CSV, Tab-Delimited, JSON, SQL, Excel y DBUnit XML.

En Mockaroo podemos definir esquemas de datos que van a quedar almacenados para futuras ediciones, para dicha estructura podemos definir tipos de datos desde un punto de vista funcional: nombre, apellido, ciudad, tarjeta de crédito (diferenciando entre visa, mastercard o american express), código de país, color, talla, hora, teléfono, tipo MIME.

Finalmente una característica interesante de Mockaroo es la capacidad de simular por completo un API REST para poder interactuar con los esquemas que hemos definido.

La importancia de la herramienta radica en la posibilidad de probar con miles de datos que simulan ser reales, ahorrando tiempo y cobertura sobre los multiples casos de pruebas que se nos puedan ocurrir.

1.1 Crear Esquema

Antes de iniciar diríjase a la página oficial de Mockaroo y cree una cuenta.

Revise las siguientes configuraciones:

  • Type: Sirve para escoger el tipo de dato del atributo, existen al menos 141 tipos.
  • Rows: La cantidad de registros a generar.
  • Formato: Los múltiples formatos a los cuales puede exportar los datos.

Finalmente guarde este esquema bajo el nombre User para ser usado posteriormente. Cuando lo haya hecho, debe aparecer un badge indicando el numero de esquemas guardados. Puede volver a editar este esquema cuando necesite si se dirige al siguiente enlace.

SU TURNO: Agregue 5 atributos adicionales al esquema User y tome un pantallazo donde se evidencie el estado final, agregue 1 registro de ejemplo.

1.2 Datasets

Los datasets son un conjunto de datos que usted previamente ha podido generar y cargar en la plataforma para ser usado posteriormente. Son muy útiles para generar llaves foráneas para bases de datos por ejemplo. Lo que usted debe hacer es lograr construir los datos de ejemplo que describen la siguiente relación:

Para ello:

  • Descargue un archivo .csv de 100 registros del esquema User.
  • Diríjase a la sección de Datasets (en este enlace) , seleccione upload dataset.
  • Para el nombre escriba users y para el archivo seleccione el .csv que descargo del esquema inicial. Finalice el proceso; usted debe ver un mensaje de éxito y una tabla que muestra los datos cargados.
  • Como hizo en la sección 1.1 cree un esquema para la entidad Transaction, agregue un campo adicional que se llame user_id, debe ser de tipo Dataset Column y seleccionar el dataset llamado users.

Como usted puede notar el atributo user_id es poblado usando los id's del conjunto de datos de users que se definió previamente.

Su turno: Cree una entidad y una nueva relación 1:* con la entidad User.

1.3 Fórmulas y tipos de datos personalizados

Mockaroo cuenta con al menos 141 tipos de datos diferentes que son capaces de generar un dato con un formato particular, pero usted puede crear su propio tipo de dato si usa las fórmulas que la plataforma provee. Por ejemplo el correo electrónico es un string que simula un correo en general, pero ahora vamos a hacer que ese correo sea la concatenación del nombre, apellido y el host de la universidad de los Andes.

  1. Diríjase a la vista de edición del esquema User.
  2. Cambie el tipo de correo electrónico a Fórmula.
  3. En el campo destinado para la fórmula escriba "#{first_name}.#{last_name}@uniandes.edu.co"

Usted puede evidenciar en la previsualización de los datos que la estrategia de generación de correos electrónicos ha cambiado y sigue la regla definida en la fórmula.

Su turno: Para alguno de los 5 atributos que usted adiciono al esquema User en la sección 1.1 cambie el tipo de datos para que sea personalizado respecto a una fórmula que usted esta añadiendo.

1.4 Decorar valores usando fórmulas embebidas

Como ya sabemos, Mockaroo ofrece 141 tipos de datos, pero en muchas ocaciones el formato particular de ese dato no es como lo necesitamos, si, por ejemplo, en nuestra base de datos SQL hemos restringido la columna gender de la tabla User para que solo admita 1 carácter, las palabras female y male van a producir un error; sin embargo una vez más con ayuda de las fórmulas podemos decorar ese resultado:

  1. Diríjase a la vista de edición del esquema User.
  2. Presione el botón de fórmula al lado del atributo gender.
  3. Cuando aparezca el pop-up, escriba la siguiente fórmula en el espacio de texto. lower(this[0])

Usted puede evidenciar en la previsualización de los datos que la forma en la que se presenta el dato del genero ha cambiado y ahora se compone de tan solo 1 letra en minúscula.

Su turno: Para alguno de los 5 atributos que usted adiciono al esquema User en la sección 1.1 decore el tipo de dato seleccionado para que cambie de forma completa el formato bajo el que se presenta.

1.5 Generación de objetos JSON y Arrays anidados

Cuando se trabajan con bases de datos no estructuradas como Mongo, lo más común es que los objetos JSON que guardamos en los documentos tengan más objetos anidados e inclusive arreglos JSON completos como parte de esos atributos, con Mockaroo lo podemos hacer de la siguiente manera.

  1. Diríjase a la vista de edición del esquema User.
  2. Adicione un nuevo atributo llamado bank.name de tipo Company Name
  3. Adicione un nuevo atributo llamado bank.number de tipo NHS Number

Usted podrá ver en la previsualización de datos como se conforma el anidamiento de un objeto JSON para el atributo bank.

[{
  "id": 1,
  "first_name": "Erick",
  "last_name": "Athey",
  "email": "[email protected]",
  "gender": "m",
  "ip_address": "53.208.157.243",
  "bank": {
    "name": "Jayo",
    "number": "3076935801"
  }
}]

Para generar un arreglo siga las siguientes instrucciones:

  1. Diríjase a la vista de edición del esquema User.
  2. Adicione un nuevo atributo llamado phones de tipo JSON Array
  3. Adicione un nuevo atributo llamado phones.location de tipo Citu
  4. Adicione un nuevo atributo llamado phones.phone de tipo Phone

Usted podrá ver en la previsualización de datos como se conforma el anidamiento de un arreglo JSON para el atributo phones.

[{
  "id": 1,
  "first_name": "Genevieve",
  "last_name": "Fydo",
  "email": "[email protected]",
  "gender": "f",
  "ip_address": "212.145.185.171",
  "bank": {
    "name": "Jabberbean",
    "number": "8397286543"
  },
  "phones": [
    {
      "location": "Gerakaroú",
      "number": "730-685-3099"
    },
    {
      "location": "Perches",
      "number": "779-593-4575"
    }
  ]
}]

Su turno: Agregue al esquema Transaction dos nuevos atributos, el primero debe ser un objeto JSON con al menos 3 atributos y el segundo un arreglo de por lo menos 5 registros y 4 atributos.

1.6 Simulación de un API REST

Otra de las funcionalidades que ofrece Mockaroo es la posibilidad de crear mocks de API REST usando los esquemas que ya se han creado. Para hacerlo haga click en el botón create API en la vista de edición del esquema.

Los verbos HTTP disponibles son: GET, POST, PUT, PATCH, DELETE, OPTIONS; y la URL se genera concatenando el nombre del esquema y una llave que se genera automáticamente.

Para manipular la respuesta a las peticiones REST usted cuenta con 3 opciones:

  1. Handler API: Una serie de funciones que manejan los datos de la petición.
  2. Generating Errors: La posibilidad de retornar errores dadas ciertas condiciones en la petición para simular validación.
  3. Altering response: La posibilidad de generar una respuesta que simule procesamiento.

Esta característica es una ventaja muy importante ya que logra eliminar la dependencia entre back y front al momento del desarrollo estableciendo un contrato basado en datos.

Su Turno: Clone el proyecto en este repositorio, esta aplicación es un CRUD de películas que funciona con los 4 métodos básicos HTTP (GET, POST, PUT, DELETE). Usted debe:

  • Crear un esquema para las películas que cumpla el siguiente formato
nombre del atributo descripción del atributo
_id id secuencial
title nombre de la película (debe ser real)
director el nombre real del director de la película
releaseYear solamente el año de lanzamiento
genre el genero asignado de la película, debe ser solo 1 y debe ser real
  • Crear 5 API's en Mockaroo para soportar las operaciones básicas del CRUD
Verbo HTTP funcionalidad
GET lista todas las películas
GET id devuelve 1 sola película
POST crea una película
PUT id edita la película especifica
DELETE elimina la película
  • Finalmente edite la URL del servicio REST que usa el componente $resource de AngularJS para que trabaje con el API que usted ha definido. En este enlace puede encontrar más información sobre cómo funciona el componente.
    return $resource('AQUI VA SU URL', { id: '@_id' }, {
        update: {
            method: 'PUT'
        }
    });
    

Para completar este ejercicio usted puede apoyarse en este vídeo de ayuda que ofrece Mockaroo. Adicionalmente se adjunta un GIF que demuestra la funcionalidad esperada de la aplicación cuando se inserta la URL que finge ser el backend de su aplicación.

Podam

Es una herramienta que ayuda a los desarrolladores autocompletar POJOs en JAVA, util al momento de desarrollar pruebas unitarias, entre sus funcionalidades se puede encontrar:

  • Introspección de los POJOs para autocompletar los atributos con datos aleatorios
  • Personalización de la estrategia de generación de datos
  • Soporta anotanciones para proveer o excluir atributos con datos aleatorios
  • soporta constuctores mínimos o completos
  • Soporte para tipos de Java, enumeraciones, matrices, colecciones (listas, mapas)
  • Soporte para tipos genéricos
  • Soporte para sus propias fábricas cuando PODAM no puede introspectar suficiente información para generar un tipo (por ejemplo, XMLGregorianCalendar)

2.1 Contexto

Para este taller vamos a usar un proyecto base en el que se tiene dos entidades: Book y Author, como se ve en la siguiente figura, a estas dos entidades vamos a generarles datos aletaorios y por medio de pruebas unitarias vamos a verificar que la capa de servicios no realiza modificaciones de los datos generados. Para la primera parte del taller veremos como generarlos a partir del tipo, es decir, no nos va importar que se está generando. Finalmente veremos como podemos implementar una estrategia de generación de datos para que la información generada más sentido en las pruebas unitarias de cada entidad

Para poder hacer uso de PODAM es necesario tener la dependencia a dicha herramienta, aqui podrá encontrar la forma de tener esta dependencia en su proyecto Java. Para el caso puntual del proyecto base esta fue declarada como una dependencia maven en el archivo pom.xml como se muestra en la siguiente imágen.

2.2 Generación de datos aleatorios

Para hacer que una prueba use podam solo debe:

  • Crear la fabrica de Podam PodamFactory podamFactory = new PodamFactoryImpl();
  • Solicitar a la fabrica que genere los datos aleatorios para los atributos de cierta entidad. Author newAuthor = podamFactory.manufacturePojo(Author.class); Vea en la sigueiente imagen que la variable newAuthortiene todos sus atributos definidos Si uno de los atributos no tiene definido el método set Podam ignorará este atributo, por ejemplo, en la siguiente figura se ve que el atributo publicationDatese encuentra en nulldebido a que el metodo setdel mismo fue eliminado. Si bien para el ejemplo anterior se está permitiendo que Podam genere como quiera los datos, esta herramienta ofrece algunas anotaciones las cuales permiten tener una pequeña estrategia. Vea como ahora la entidad newAuthortiene un listado de 20 instancias de libros, un nombre de 50 caracteres y un idcon un número más pequeñoEsto se logra gracias a las siguientes anotaciones sobre la entidad Author

    • @PodamIntValue(minValue = 1, maxValue = 1000)Asigna números del 1 al 1000

    • @PodamStringValue(length = 50)Genera strings de 50 caracteres , en caso de no configurarse solo serán 10 caracteres generados porString

    • @PodamCollection(nbrElements = 20)Cantidad de instancias en el listado

.

2.3 Implementación de estrategia para la generación de datos a nivel de atributos

Otra de las funcionalidades que ofrece Podam es permitir definir una estrategia de generación de datos a nivel de atributos. Para esto siga los siguientes pasos:

  1. Cree una clase con del siguiente código

    import uk.co.jemos.podam.common.AttributeStrategy;
    import java.lang.annotation.Annotation;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;
    
    public class TypeBookStratergy implements AttributeStrategy<String> {
    
        private static final List<String> TYPES  =  Arrays.asList("Biographies", "Scientists", "Science fiction");
    
        @Override
        public String getValue(Class<?> aClass, List<Annotation> list) {
            Random r = new Random();     
            int pos =r.nextInt(100000) % 3;
            return TYPES.get(pos);
        }
    }
    
  2. Agregue la anotación @PodamStrategyValue(TypeBookStratergy.class) al atributo typede la clase Book

  3. Al ejecutar la prueba addNewUserTestde la clase AuthorTestobtendrá un resultado como el siguiente, note que el atributo typesolo toma los valores definidos en la clase TypeBookStratergy

2.4 Su turno

  1. Realice una estrategia de generación de datos para el atributo code de la clase Book para que sea una cadena de 6 caracteres, los 3 iniciales una letra y los 3 finales un número.
  2. Modifique la clase Book para que el atributo typesea una enumeración y modifique la estrategia de generación de datos para que trabaje sobre la nueva enumeración.
  3. Modifique la prueba unitaria de ser necesario para dar soporte a la enumeración de tipos de libros.
  4. Remueva el comentario de la linea 51 de la clase AuthorTest, esto hará que la prueba unitaria falle, realice los cambios necesarios para hacer que la prueba vuelva a ejecutarse correctamente.

Entregable

  1. Documento donde se evidencia los resultados de el uso Mockaroo
  2. Repositorio con los ajustes realizados en Podam

results matching ""

    No results matching ""