Generando datos de prueba con Faker

IECISA y Conasa Salud organizan una sesión técnica sobre Metavision en Barcelona
11 octubre, 2016
Cómo reparar un archivo PST de Outlook
18 octubre, 2016

Generando datos de prueba con Faker

A menudo, durante el desarrollo de un proyecto, es necesario disponer de datos de prueba (habitualmente en una base de datos) que nos permitan verificar que alguna parte de la misma funciona o se visualiza correctamente, hacer tests de rendimiento etc. Para que esta tarea resulte menos tediosa, podemos utilizar Faker, una librería escrita en PHP (inspirada en las librerías Data:Faker de Perl y Faker de Ruby) que permite generar datos aleatorios de prueba de una manera sencilla y extensible.

Como vamos a ver, esta librería nos proporciona varios seeders (generadores aleatorios) para generar diferentes tipos de datos (nombres, textos, teléfonos y un largo etcétera) que podremos utilizar por ejemplo para rellenar campos de una tabla en la base de datos, generar ficheros XML, etc.

Instalación

La librería puede instalarse de forma sencilla en cualquier proyecto utilizando Composer:

composer require fzaninotto/faker

Una vez instalada, podemos comenzar a utilizarla incluyendo en nuestros scripts el fichero autoload.php:

require_once '/path/to/Faker/src/autoload.php';

o simplemente indicando que vamos a utilizar el espacio de nombres de Faker si el proyecto ya dispone de un autoloader (como en el caso de frameworks como Symfony):

use Faker;

Uso básico

El primer paso es instanciar Faker con la siguiente instrucción:

<?php
 
$faker = Faker\Factory::create('es_ES');

Como se puede ver, simplemente estamos llamando al método create() de Faker\Factory para instanciar el generador aleatorio para el código regional es_ES (español de España). De esta manera, obtendremos por ejemplo nombres españoles, en vez de ingleses (si no se indica el código regional Faker utilizará por defecto en_EN).

Una vez instanciado el generador podemos obtener datos aleatorios de diferentes tipos accediendo simplemente a propiedades del mismo:


Dirección: Plaça Aitor, 07, 2º D, 11802, As Vanegas
Teléfono: +34 900-208029
Email: larias@hotmail.es
Empresa: Llamas-Hidalgo

De esta manera, hemos generado datos que podrían corresponder a una persona, tales como el nombre completo ($faker->name) o la dirección ($faker->address). Cada vez que accedamos a una propiedad de $faker el generador devolverá un nuevo valor aleatorio (llamando al proveedor correspondiente). Podemos reescribir el ejemplo anterior en un bucle para generar datos de 10 personas:

[/responsive]

Book:

[responsive]Libros[/responsive]

Como se puede ver, Faker ha rellenado los campos de la entidad (tabla en la base de datos) y en algunos casos ha acertado correctamente con el proveedor (tipo de dato) a utilizar. Por ejemplo, en la tabla Author ha rellenado correctamente los campos de dirección (address), teléfono (phone), email (email) y fecha de nacimiento (birth_date). Esto se debe a que el “rellenador” (Faker\ORM\Doctrine\Populator) intenta adivinar el proveedor a utilizar en cada caso basándose en el nombre (address, phone y email) o en el tipo de datos del campo (birth_date, fecha). Faker nos permite personalizar qué proveedor se utiliza para cada campo de la siguiente forma:

<?php $generator = Faker\Factory::create('es_ES'); $populator = new Faker\ORM\Doctrine\Populator($generator, $entityManager); $populator->addEntity('Entity\Author', 5, array(
'name' => function() use ($generator) { return $generator->name(); }
));

$populator->addEntity('Entity\Book', 50, array(
'isbn'      => function() use ($generator) { return $generator->isbn13(); },
'publisher' => function() use ($generator) { return $generator->company(); }
));

$inserted = $populator->execute();

En este ejemplo le estamos indicando a Faker que utilice el proveedor name() para rellenar el campo name (nombre completo) de la entidad Author y los proveedores isbn13() (código ISBN) y company() (empresa) para los campos isbn y publisher (editorial) de la entidad Book. En caso de que no especifiquemos qué proveedor utilizar para un campo concreto, Faker tratará de adivinarlo utilizando el nombre y el tipo de campo, tal y como se ha explicado en el ejemplo anterior.

Conclusiones

Faker es una herramienta realmente útil para generar datos aleatorios de prueba que nos pueden ayudar en el proceso de desarrollo y testeo de una aplicación. Como hemos visto, su uso es realmente sencillo, sobre todo en el caso de utilizar algún ORM como Doctrine, ya que nos permite generar y rellenar entidades de forma automatizada. Aunque ha quedado fuera del alcance de este post, Faker, además, es extensible, lo que significa que es posible añadir nuestros propios proveedores para generar nuevos tipos de datos o personalizar los existentes.

En el siguiente post os hablaré de Alice, otra librería de PHP que, haciendo uso de Faker, nos permite generar datos de prueba de forma más legible mediante ficheros de configuración YAML.