Introduction à Datafaker — Fournisseurs de données factices

Christophe Vaudry
norsys-octogone
Published in
7 min readJun 8, 2023

--

Datafaker ?

Datafaker est une bibliothèque pour Java et les langages de la JVM qui permet de générer des données factices mais réalistes. C’est un fork de java-faker et elle nécessite au minimum Java 8. En dehors d‘une meilleure intégration avec Java 8, Datafaker est activement maintenue et développée, et propose des améliorations et évolutions par rapport à java-faker.

Distracted boyfriend Meme with datafaker and java-faker

Pourquoi faire ?

Pour effectuer des tests, vous avez souvent besoin de jeux de données (jdd pour les intimes, à ne pas confondre avec un journal) réalistes et variées.

La plupart du temps vous avez besoin de données réalistes mais vous ne pouvez pas utiliser des données réelles venant de la production pour des questions de sécurité, de protection des données personnelles ou parce que ces données de production n’existent pas encore.

C’est là qu’une bibliothèque comme Datafaker peut vous aider et je vais vous montrer comment dans ce premier billet en posant quelques bases et en présentant quelques exemples.

Comment l’utiliser ?

On peut trouver Datafaker sur Maven Central ou sur mvnrepository. Les coordonnées Maven pour la dernière version, au moment de l’écriture de ce billet, sont :

Dans les exemples ci-après la bibliothèque est utilisée directement avec JShell ou JBang. C’est la version 1.9.0 qui est utilisée dans ce billet (la dernière version au moment de son écriture). Cette version introduit quelques changements dans les imports et quelques dépréciations par rapport aux versions antérieures.

Dans ce billet, JShell/JBang sont utilisés pour les exemples pour avoir des exemples auto-porteurs mais vous pouvez bien sûr utiliser Datafaker comme n’importe quelle autre bibliothèque Java. Un projet Java classique démontrant l’utilisation de Datafaker est également disponible.

Une fois la bibliothèque dans votre classpath d’une manière ou d’une autre, il vous faut créer un objet Faker à partir duquel vous pouvez instancier un fournisseur de données et créer vos jeux de données.

Instanciation d’un objet Faker et utilisation du fournisseur de données Name
Instanciation d’un objet Faker

Mettons tout cela en application dans le script Java ci-après.

Ce qui donne si on lance ce script dans JShell :

Capture d’écran de l’exécution du script précédent dans JShell

Si on le lance avec JBang, cela donne un résultat similaire :

Capture d’écran de l’exécution du script précédent avec JBang

Une fois que vous avez une instance de votre objet Faker vous pouvez appeler dessus un fournisseur de données (ce que la documentation de Datafaker nomme un provider ou data provider).

Ainsi dans l’exemple ci-dessus, les lignes “Name name = faker.name();” et “Address address = faker.address();” permettent respectivement de créer un fournisseur de données pour des noms et pour des adresses.

A partir de ces fournisseurs de données vous pouvez récupérer des valeurs aléatoires grâce à des méthodes spécifiques.

Par exemple pour le fournisseur Name vous pouvez récupérer une valeur aléatoire pour un prénom (méthode firstName()) ou un nom de famille (méthode lastName()). Le reste du code est juste l’exploitation de ces fournisseurs pour obtenir des valeurs aléatoires mais réalistes, spécifiques à ce fournisseur.

Mème de Toys Story : “Providers, providers everywhere”

Datafaker propose vraiment beaucoup de fournisseurs de données des plus sérieux (pour la finance et la banque avec par exemple la possibilité de générer des IBAN ou des numéros de cartes de crédit factices) à des fournisseurs relevant des jeux vidéos, des films ou des séries télévisées.

Une illustration avec les Pokémons, parce que oui, il y a un fournisseur dédié pour eux !

Can you catch all the providers of Datafaker ?

Même principe : à partir d’une instance de Faker, on appelle la méthode dédiée pour obtenir le fournisseur de données que l’on souhaite (ici la méthode pokemon() qui retourne un fournisseur de données de type Pokemon).

Ensuite, on interagit avec l’instance du fournisseur par l’intermédiaire de la ou des méthodes qu’il propose pour générer des valeurs aléatoires.

Pour un fournisseur de type Pokemon, on peut générer une valeur aléatoire correspondant à un nom de pokémon, à un type de pokémon ou à un lieu de cet univers. A noter que les différentes valeurs ainsi générées n’ont a priori pas de liens entre elles. Ainsi la valeur aléatoire du nom et celle du type de pokémon ne sont pas liées, ce sont des valeurs aléatoirement générées de manières indépendantes.

Capture d’écran de l’exécution du script précédent dans JShell

Travaillons local !

Comme cela n’a pas dû vous échapper les exemples précédents produisent des données en anglais.

Est-il possible d’avoir des données factices localisées par rapport à un pays ou une langue ?

Dans une certaine mesure oui…

Pour utiliser une locale, il suffit de l’indiquer au moment de l’instanciation de l’objet Faker, et d’utiliser cet objet pour avoir une version localisée des données.

Code pour utiliser une version localisée de l’objet Faker
Utilisation d’une instance de Faker localisée

Un script avec un exemple complet ci-après.

Exemple d’utilisation d’une locale avec Datafaker

L’exécution de ce script donne un résultat similaire à ce qui suit :

Capture d’écran de l’exécution du script précédent dans JShell

On notera au passage que tout n’est pas nécessairement traduit et localisé. Ainsi, pour la version française du fournisseur de nom dans l’exemple, le titre généré n’est pas un titre entièrement en français (Product Implementation Directeur) et le suffixe au nom (PhD) correspond au suffixe anglais pour indiquer qu’on est titulaire d’un doctorat.

Il faut donc faire attention, la localisation n’est pas nécessairement complète et ce qui est traduit peut varier d’une langue à une autre.

En même temps, c’est un projet Open Source, il est toujours possible de contribuer pour améliorer ce point ! Et les contributions, petites ou grandes, sont accueillies les bras ouverts, alors il ne faut pas hésiter même si c’est juste pour proposer de nouvelles traductions.

Fournisseur en option

Meme “Les Pinguoins de Madagascar” — With Datafaker I make my own options

Il y a un fournisseur de données un peu particulier qui permet de sélectionner aléatoirement une valeur ou un ensemble de valeurs dans un ensemble.

Ce fournisseur se nomme assez logiquement Options et on appelle dessus la méthode option qui prend en argument un tableau ou un nombre variable de paramètres. Ces paramètres peuvent être n’importe quel type d’objets mêmes si on recourt souvent surtout à des chaînes de caractères ou à des énumérations. Voyons différents exemples dans la suite.

Exemple de code pour créer et utiliser le fournisseur de service options
Exemple de code pour créer et utiliser le fournisseur de service options

Un exemple d’utilisation plus complet dans un script :

Le script précédent affiche une valeur aléatoire parmi les valeurs passées en paramètre de la méthode option.

Copie d’écran du script précédent lancé avec JBang

On peut également passer une énumération en paramètre de la méthode option pour obtenir aléatoirement un des éléments de cette dernière.

Exemple de code pour créer et utiliser une énumération avec Option
Exemple de code pour créer et utiliser une énumération avec Option

Dans un script complet cela peut donner ceci :

Ce qui donne en résultat quelque chose de similaire à ce qui suit :

Capture d’écran de l’exécution du script précédent avec JBang

Comme indiqué plus haut, les paramètres de la méthode option() peuvent être n’importe quel type d’objet, pas juste des chaînes de caractères ou des énumérations. Par exemple ci-après, avec des objets représentant des dates.

Copie d’écran du code pour une sélection aléatoire parmi plusieurs dates avec la méthode option()
Copie d’écran du code pour une sélection aléatoire parmi plusieurs dates avec la méthode option()

Cela donne un résultat similaire à ce qui suit quand on exécute ce script avec JShell.

Capture d’écran de l’exécution du script précédent dans JShell

On peut également utiliser la méthode nextElement pour obtenir un élément aléatoirement choisi dans une liste ou un tableau.

Capture d’écran de l’exécution du script précédent dans JShell

Enfin, il est possible d’extraire un sous-ensemble d’éléments aléatoirement choisis dans une liste plus large.

Exemple de code extrayant les valeurs aléatoires d’un sous-ensemble d’éléments aléatoirement choisis dans une liste.
Exemple de code avec des valeurs aléatoires prises dans un sous-ensemble d’éléments d’une liste

Et une mise en œuvre dans un script :

Ce qui donne un résultat similaire à la copie d’écran suivante.

Capture d’écran de l’exécution du script précédent dans JShell

En synthèse ci-après, un gist reprenant de manière synthétique l’ensemble des exemples de code précédents :

Capture d’écran de l’exécution du script précédent dans JShell

Ce n’est que le début …

Datafaker propose beaucoup d’autres fonctionnalités que ce qui vient d’être décrit. Fonctionnalités qui méritent qu’on s’attarde sur elles avec l’attention appropriée dans des billets dédiés.

Ce billet est donc normalement le premier d’une série sur Datafaker. Dans le prochain billet nous regardons ainsi comment générer des chaines de caractères aléatoires sur la base d’un modèle.

Ressources

Remerciement

Je remercie mes collègues Baptiste et Damien pour leur relecture attentive et leurs remarques.

--

--

Christophe Vaudry
norsys-octogone

Developer working for Norsys. Programming languages explorer. Know nothing.