Introduction à Datafaker — Fournisseurs de données factices
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.
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.
Mettons tout cela en application dans le script Java ci-après.
Ce qui donne si on lance ce script dans JShell :
Si on le lance avec JBang, cela donne un résultat similaire :
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.
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 !
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.
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.
Un script avec un exemple complet ci-après.
L’exécution de ce script donne un résultat similaire à ce qui suit :
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
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.
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.
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.
Dans un script complet cela peut donner ceci :
Ce qui donne en résultat quelque chose de similaire à ce qui suit :
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.
Cela donne un résultat similaire à ce qui suit quand on exécute ce script avec JShell.
On peut également utiliser la méthode nextElement pour obtenir un élément aléatoirement choisi dans une liste ou un tableau.
Enfin, il est possible d’extraire un sous-ensemble d’éléments aléatoirement choisis dans une liste plus large.
Et une mise en œuvre dans un script :
Ce qui donne un résultat similaire à la copie d’écran suivante.
En synthèse ci-après, un gist reprenant de manière synthétique l’ensemble des exemples de code précédents :
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
- Site officiel de Datafaker
- GitHub de Datafaker
- Une présentation du créateur de la bibliothèque sur DZone : Datafaker: An Alternative to Using Production Data
- Un article sur l’incontournable site Baeldung : Introduction to Datafaker
- Un projet Java compagnon de ce billet
Remerciement
Je remercie mes collègues Baptiste et Damien pour leur relecture attentive et leurs remarques.