Introduction à Datafaker — Générer des données à partir d’un modèle

Christophe Vaudry
norsys-octogone
Published in
6 min readSep 25, 2023

Previously on Datafaker…

Dans un billet précédent, j’ai introduit Datafaker une bibliothèque pour générer des données factices réalistes en Java et Kotlin. Il présentait la base de l’utilisation de Datafaker par la création d’une instance de l’objet Faker et l’utilisation des très nombreux fournisseurs de données mis à disposition par la bibliothèque.

Datafaker propose de nombreuses autres fonctionnalités pour générer des données factices. Ce billet traite de ce que Datafaker propose pour générer des données sur la base d’un modèle.

Comme dans le billet précédent, les exemples sont des scripts JShell à exécuter avec JShell ou JBang afin d’avoir du code autoporteur pour illustrer le fonctionnement de Datafaker. Le plus simple est d’utiliser JBang si cela vous est possible.

Suivre la génération à la lettre

Let’s letterify your Data !

Datafaker propose plusieurs manières de créer des chaînes de caractères aléatoires qui se basent sur un modèle.

Si on a besoin de générer une chaîne en faisant varier des caractères correspondants à des lettres, on peut utiliser la méthode letterify sur une instance d’un objet Faker. On précise les lettres à générer de manière aléatoire avec un point d’interrogration ‘?’ dans le modèle de chaîne passé en paramètre de la méthode.

Par défaut, les lettres générées sont des lettres minuscules, mais la méthode letterify a une surcharge avec un paramètre booléen qui permet de préciser que l’on souhaite avoir des lettres majuscules.

Un exemple ci-après pour illustrer tout cela.

Tous les ‘?’ dans la chaîne de caractères passée en paramètre de letterify sont remplacés en sortie par une lettre minuscule ou majuscule selon la valeur du paramètre booléen (son absence correspond à la valeur false)

Exemple de résultat de l’exécution du script précédent utilisant letterify sous JShell
Exemple de résultat de l’exécution du script précédent utilisant letterify avec JBang

Des chiffres en nombre

Meme “Using numerify be like… ‘The Numbers Mason, What Do they Mean ?`”

De manière similaire, si on a besoin de générer une chaîne en faisant varier des caractères correspondants à des chiffres, on peut utiliser la méthode numerify sur une instance d’un objet Faker. On précise les chiffres à générer de manière aléatoire avec un caractère dièse ‘#’ dans le modèle de chaîne passé en paramètre de la méthode.

Un exemple sera probablement plus clair.

Copie d’écran du résultat de l’exécution du script précédent
Exemple de résultat de l’exécution du script précédent avec JShell

Des chiffres et des lettres

Bien sûr, vous pouvez légitimement avoir le besoin de créer une chaîne dont les caractères générés aléatoirement doivent correspondre tant à des lettres ou que des chiffres.

Il serait toujours possible de combiner letterify et numerify avec la concaténation de chaînes, mais vous pouvez le faire directement avec la méthode bothify de la classe Faker.

Dans le modèle de chaîne passé en paramètre de la méthode, on précise que le caractère à générer est une lettre avec le caractère ‘?’ et que c’est un chiffre avec un caractère ‘#’.

Tout comme la méthode letterify, il y a une surcharge à bothify avec un paramètre booléen pour indiquer que l’on souhaite que les lettres aléatoirement produites soient des majuscules.

Résultat de l’exécution du script précédent présentant l’utilisation de la méthode bothify
Exemple de résultat de l’exécution du script précédent utilisant la méthode bothify exécuté depuis JShell

Le caractère ‘?’ est spécial pour letterify mais pas pour numerify. Inversement le caractère ‘#’ est spécial pour numerify mais pas pour letterify. Par contre ces 2 caractères sont spéciaux pour bothify.

Résultat de l’exécution du script précédent montrant la différence de caractères spéciaux dans les méthodes letterify, numerify et bothify
Exemple de résultat de l’exécution du script précédent

Un remplacement qui a du caractère

La méthode templatify permet de préciser un caractère spécifique qui sera remplacé par une chaîne de caractères aléatoirement choisie parmi un ensemble de valeurs possibles.

Dans l’exemple qui suit, on spécifie que le caractère ‘x’ dans la chaine ‘xday’ doit être remplacé par une valeur aléatoire choisie parmi les valeurs ‘Mon’, ‘Tues’, ‘Wednes’, ‘Thurs’, ‘Fri’, ‘Satur’ et ‘Sun’.

Résultat de l’exécution du script précédent utilisant templatify
Exemple de résultat de l’exécution du script précédent sous JShell

Il faut être attentif au fait que si vous utilisez plusieurs fois le caractère à remplacer par une valeur aléatoire dans la chaîne modèle, chaque occurrence sera remplacée par une valeur nouvellement choisie dans la liste de valeurs possibles.

Ainsi dans l’exemple suivant, pour chaque occurrence de ‘x’, une nouvelle valeur pourra être choisie.

Résultat de l’exécution du script précédent avec la méthode templatifiy
Exemple de résultat de l’exécution du script précédent

Un remplacement exemplaire

Si vous avez par exemple besoin de générer une chaîne de caractères qui doit être constituée de 3 lettres minuscules, d’un blanc souligné, de 3 lettres majuscules, d’un tiret et de 3 chiffres, vous allez pouvoir spécifier simplement la génération aléatoire d’une telle chaine avec la méthode examplify et un exemple de ce qui est attendu comme modèle.

Ici le modèle de chaine pourrait être simplement “abc_ABC-123”. Ce qui compte c’est de spécifier le type de caractères : majuscule, minuscule ou chiffre. Les autres caractères ne correspondant ni à des chiffres ni à des lettres ne sont pas remplacés.

Exemple de résultat de l’exécution du script précédent avec la méthode examplify
Exemple de résultat de l’exécution du script précédent

Un remplacement régulier

Image de la BD XKCD illustrant l’utilisation des expressions régulières : https://xkcd.com/1031/
https://xkcd.com/1031/

Enfin, avec la méthode regexify il est possible d’utiliser une expression régulière pour spécifier le modèle auquel doit se conformer la chaîne à générer aléatoirement.

Dans les 2 exemples du script ci-après, on souhaite dans le premier cas générer des chaînes ayant 4 à 10 caractères alphabétiques (aussi bien minuscule que majuscule) et dans le second générer une chaîne composée de 2 à 5 lettres (ici également, aussi bien minuscule que majuscule), 2 caractères parmi ‘_’, ‘?’, ‘!’, ‘*’ et ‘-’, et enfin 3 chiffres.

A noter que Datafaker a besoin de 2 bibliothèques dans le classpath afin de pouvoir exécuter correctement le script sous JShell (vous n’aurez bien sûr pas à vous en souciez si vous l’utilisez dans une application dont le build est géré par Maven ou Gradle ou bien si vous utilisez JBang).

Résultat de l’exécution du script précédent depuis JShell
Résultat de l’exécution du script précédent avec JBang

Until we meet again …

Comme nous venons de le voir dans ce billet, Datafaker offre de nombreuses manières de générer une chaîne de caractères devant correspondre à un certain modèle : quelque soit la spécification de votre chaîne normalement vous devriez avoir la possibilité d’en générer des versions aléatoires avec ce que Datafaker vous propose.

A l’issue de ce deuxième billet, il reste néanmoins encore beaucoup d’autres fonctionnalités de Datafaker à traiter.

Après avoir vu les bases et le moyen de générer des chaînes en spécifiant des modèles de différentes formes, dans le prochain billet nous aborderons comment créer des données factices sous formes de collection d’éléments.

Ressources

Les autres billets sur Datafaker

Remerciement

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

--

--

Christophe Vaudry
norsys-octogone

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