Blog

Datafaker, pour générer des données factices

Il est fréquent d’avoir besoin de générer des données factices (fake data), notamment pour les tests automatisés : pour des mocks ou des données d’une classe à tester, remplir une base de données, anonymiser des données dans une base de données, un fichier, … Il existe plusieurs bibliothèques pour satisfaire ce besoin.

Cet article présente Datafaker qui est une bibliothèque récente pour Java 8+ et Kotlin permettant de générer de données factices.

Avec Datafaker, il est facile de générer des données factices mais réalistes dans leurs formats et leurs valeurs. La génération de données factices, comme alternative à l’anonymisation des données de production, présente le grand avantage que les données ne donneront jamais lieu à des problèmes d’identification personnelle à partir d’informations puisque les données sont fausses. Datafaker peut générer un volume important de données factices.

Datafaker est un portage en Java 8 de la bibliothèque historique java-faker dont la dernière version 1.1.0 a été publiée début février 2022.
Le site web est à l’url https://www.datafaker.net/
Datafaker est diffusée sous licence Apache License 2.0

 

L’ajout de la dépendance

Datafaker est disponible dans Maven central.
Il suffit d’ajouter la dépendance dans le pom.xml du projet Maven.

<dependency>
  <groupId>net.datafaker</groupId>
  <artifactId>datafaker</artifactId>
  <version>1.1.0</version>
</dependency>

 

La mise en œuvre

Le plus simple est de créer une instance de type net.datafaker.Faker en invoquant le constructeur par défaut.
Pour générer des valeurs, il faut invoquer la méthode correspondant à un fournisseur pour générer des valeurs qu’il propose.

package com.oxiane.testdatafaker;

import net.datafaker.Faker;

public class MainDatafaker {

  public static void main(String[] args) {
    Faker faker = new Faker();

    String nomPrenom = faker.name().fullName();
    String prenom = faker.name().firstName();
    String nom = faker.name().lastName();

    String adresse = faker.address().streetAddress();
    String codePostal = faker.address().zipCode();
    String ville = faker.address().city();
    String pays = faker.address().country();

    System.out.println("Nom complet : "+nomPrenom);
    System.out.println("Prenom : "+prenom);
    System.out.println("Nom : "+nom);
    System.out.println("Adresse : "+adresse);
    System.out.println("Code postal : "+codePostal);
    System.out.println("Ville : "+ville);
    System.out.println("Pays : "+pays);
  }
}

Exemple du résultat de l’exécution :

Nom complet : Valrie Rohan
Prenom : Na
Nom : Abshire
Adresse : 76645 Sanjuana Fields
Code postal : 31689
Ville : Port Ivetteton
Pays : Portugal

 

L’utilisation d’une Locale

Une fonctionnalité intéressante est que les données générées peuvent être localisées et donc être formatées en conséquence. Par exemple, il est possible de générer des numéros de téléphone français (Sur 10 chiffres sans le préfixe ou 9 chiffres avec le préfixe).
Par défaut, la Locale anglaise est utilisée.

Pour utiliser une autre Locale (code langue et éventuellement code pays), il suffit d’en passer une instance en paramètre du constructeur de la classe net.datafaker.Faker.

package com.oxiane.testdatafaker;

import java.util.Locale;

import net.datafaker.Faker;

public class MainDatafaker {

  public static void main(String[] args) {
    Faker faker = new Faker(new Locale("fr"));

    String nomComplet = faker.name().fullName();
    String prenom = faker.name().firstName();
    String nom = faker.name().lastName();
    String adresse = faker.address().streetAddress();
    String codePostal = faker.address().zipCode();
    String ville = faker.address().city();
    String pays = faker.address().country();

    System.out.println("Nom complet : "+nomComplet);
    System.out.println("Prenom : "+prenom);
    System.out.println("Nom : "+nom);
    System.out.println("Adresse : "+adresse);
    System.out.println("Code postal : "+codePostal);
    System.out.println("Ville : "+ville);
    System.out.println("Pays : "+pays);
  }
}

Exemple du résultat de l’exécution :

Nom complet : Pierre Gérard
Prenom : Julien
Nom : Fournier
Adresse : 2 Avenue du Faubourg Saint-Honoré
Code postal : 74090
Ville : Saint-Denis
Pays : Romania

Comme on peut le constater dans cet exemple, toutes les données ne sont pas traduites dans la Locale.

 

Les fournisseurs de données

DataFaker propose un certain nombre de fournisseurs de valeurs dans différents domaines fonctionnels.

Plusieurs fournisseurs proposent des valeurs utilisables dans des applications de gestion, notamment : Address, Barcode, Business, Code, Coin, Color, Commerce, Company, Crypto, DateAndTime, Durations, File, Finance, Gender, IdNumber, Internet, Job, Name, Nation, Number, PhoneNumber, …

package com.oxiane.testdatafaker;

import java.util.Locale;

import net.datafaker.CreditCardType;
import net.datafaker.Faker;

public class MainDatafaker {

  public static void main(String[] args) {
    Faker faker = new Faker(new Locale("fr"));

    String numeroCB = faker.business().creditCardNumber();
    String typeCB = faker.business().creditCardType();
    String expirationCB = faker.business().creditCardExpiry();
    String nomProduit = faker.commerce().productName();
    String prixProduit = faker.commerce().price(10, 1000);
    
    System.out.println("Type CB : "+typeCB);    
    System.out.println("Numero CB : "+numeroCB);
    System.out.println("Expiration CB : "+expirationCB);
    
    System.out.println();
    
    String bic = faker.finance().bic();
    String iban = faker.finance().iban("FR");
    String numCB = faker.finance().creditCard(CreditCardType.MASTERCARD);

    System.out.println("Bic : "+bic);    
    System.out.println("IBAN : "+iban);
    System.out.println("Numero CB : "+numCB);
        
    System.out.println();

    String numTel = faker.phoneNumber().phoneNumber();
    String numPort  = faker.phoneNumber().cellPhone();
    String email = faker.internet().emailAddress();

    String capitale = faker.nation().capitalCity();
    String langue = faker.nation().language();
    String nationalite = faker.nation().nationality();
    
    String titre = faker.job().title();
    String anciennete  =faker.job().seniority();
    String poste = faker.job().position();

    String asin = faker.code().asin();
    String isbn10 = faker.code().isbn10(true);
    String isbn13 = faker.code().isbn13(true);
    String imei = faker.code().imei();

    System.out.println("Email : "+email);    
    System.out.println("Num tél : "+numTel);    
    System.out.println("Num tél portable : "+numPort);    

    System.out.println();
    System.out.println("Capitale : "+capitale);    
    System.out.println("Langue : "+langue);    
    System.out.println("Nationalité : "+nationalite);    

    System.out.println();
    System.out.println("Titre : "+titre);    
    System.out.println("Ancienneté : "+anciennete);
    System.out.println("Poste : "+poste);
    
    System.out.println();
    System.out.println("Asin : "+asin);
    System.out.println("Isbn10 : "+isbn10);
    System.out.println("Isbn13 : "+isbn13);
    System.out.println("Imei : "+imei);
  }
}

Exemple du résultat de l’exécution :

Type CB : maestro
Numero CB : 1234-2121-1221-1211
Expiration CB : 2015-11-11

Bic : OXPEFP2Q
IBAN : FR850273312522fnaGvo24hlN60
Numero CB : 6771-8918-8472-7971

Email : manon.nicolas@yahoo.fr
Num tél : 02 55 42 17 64
Num tél portable : +33 7 62 86 56 38

Capitale : Reykjavik
Langue : Javanese
Nationalité : Norwegians

Titre : Manufacturing Engineer
Ancienneté : International
Poste : Facilitator

Asin : B000O332KS
Isbn10 : 1-937544-96-6
Isbn13 : 979-1-87217-067-0
Imei : 861645427072277

De nouveau, certaines valeurs ne sont pas traduites mais elles sont localisées notamment les dates et les numéros de téléphone.

Certains fournisseurs concernent des domaines fonctionnels spécifiques, notamment : Animal, Appliance, Artist, Aviation, Basketball, Beer, Book, Cat, Dessert, Disease, Dog, EnglandFootBall, Food, Mountains, Music, Twitter, University, Vehicle, Weather, …

Certains fournisseurs sont mêmes à destination des geeks notamment : ChuckNorris, DragonBall, Starcraft, Yoda, …

package com.oxiane.testdatafaker;

import java.util.Locale;

import net.datafaker.Faker;

public class MainDatafaker {

  public static void main(String[] args) {
    Faker faker = new Faker(new Locale("fr"));

    System.out.println("Faits à propos de Chuck Norris");
    for (int i = 0; i < 5; i++) {
      String fact = faker.chuckNorris().fact();
      System.out.println(fact);
    }

    System.out.println();
    System.out.println("Personnages de Dragon Ball");
    for (int i = 0; i < 5; i++) {
      String personnageDB = faker.dragonBall().character();
      System.out.println("  "+personnageDB);
    }

    System.out.println();
    System.out.println("Personnages de Starcraft");
    for (int i = 0; i < 5; i++) {
      String personnage = faker.starCraft().character();
      System.out.println("  "+personnage);
    }
  }
}

Exemple du résultat de l’exécution :

Faits à propos de Chuck Norris
Chuck Norris can unit test an entire application with a single assert.
Chuck Norris compresses his files by doing a flying round house kick to the hard drive.
Chuck Norris went out of an infinite loop.
When Chuck Norris presses Ctrl+Alt+Delete, worldwide computer restart is initiated.
Chuck Norris hosting is 101% uptime guaranteed.

Personnages de Dragon Ball
  Super Saiyan 2 Gohan
  Jaco
  Super Saiyan Blue Goku
  Champa
  Chaozu

Personnages de Starcraft
  Arcturus Mengsk
  Abathur
  Jim Raynor
  Fenix
  Nova Terra

La liste intégrale des fournisseurs est consultable à l’url https://www.datafaker.net/providers/

 

Conclusion

Datafaker est une bibliothèque facile à utiliser et pratique pour générer des données factices. A ajouter dans sa boîte à outils.
 

Jean-Michel Doudoux

Written by

CTO OXiane