Introduction à Datafaker — Générer des collections de données factices

Christophe Vaudry
norsys-octogone
Published in
6 min readDec 13, 2023

Previously on Datafaker…

Dans les 2 billets précédents, j’ai présenté les bases de l’utilisation de Datafaker, et la création de chaînes basée sur un modèle.

Ce billet traite de la manière de générer des collections ou des flux d’éléments factices avec Datafaker.

Datafaker offre le moyen de générer facilement une séquence d’éléments factices, de même type ou pas, sous forme de collection ou de stream. Les streams créées peuvent même être infinies. Dans la suite on parlera de séquence comme terme générique pour une collection ou une stream.

Comme dans les billets précédents, 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.

Générer des séquences de données factices

Avec Datafaker cela démarre par l’utilisation d’une instance de Faker sur laquelle on appelle la méthode appropriée (ici collection() ou stream()) et sur le résultat de laquelle on pourra chaîner des appels pour paramétrer la construction de la séquence.

Par exemple si on souhaite créer une liste de 5 à 10 d’ISBN factices, on aurait un code similaire à ce qui suit

Code pour générer une liste d’ISBN factices

Le code correspondant sous forme d’un script JShell

Résultat de l’exécution du script précédent avec jbang

Pour créer une stream équivalente, le code serait similaire, on remplace juste la méthode collection() par la méthode stream().

Code pour générer une stream d’ISBN factices

Le code correspondant sous forme d’un script JShell

Résultat de l’exécution du script précédent avec jbang

Dans la méthode suppliers() on passe une interface Supplier qui permet de générer les éléments factices de la séquence. Cette instance peut bien sûr être donnée sous forme de lambda comme dans l’exemple ci-dessus.

Avec la méthode len() on définit des bornes inférieures et supérieures sur le nombre d’éléments de la séquence.

Enfin la méthode generate() crée la séquence appropriée.

Paramétrage de la génération

Les méthodes collection() et stream() retourne en fait un objet Builder que l’on peut paramétrer par rapport à :

  • la manière dont les items de la séquence sont créés avec la méthode suppliers().
  • la taille de la séquence souhaitée avec les méthodes len(), minLen() ou maxLen().
  • la présence de valeur null avec la méthode nullRate().

La méthode suppliers() peut prendre un nombre variable d’instances de l’interface Supplier .

En reprenant l’exemple avec les ISBN, on peut vouloir en générer sur 10 ou sur 13 caractères.

Génération d’une liste d’ISBN sur 10 ou 13 caractères

Le code correspondant sous forme d’un script JShell

Résultat de l’exécution du script précédent avec jbang

Ces suppliers peuvent ne pas retourner les mêmes types de données, il faut dans ce cas que la séquence soit déclarée de sorte à pouvoir contenir un type commun. On en vient donc souvent à utiliser Object comme supertype commun dans ces cas-là.

Génération d’une stream contenant des nombres et des chaines de caractères

Le code correspondant sous forme d’un script JShell

Résultat de l’exécution du script précédent avec jbang

Si on a besoin de simuler une séquence d’éléments dont certains peuvent avoir la valeur null, on peut utiliser la méthode nullRate().

En général, ce n’est pas une bonne idée de créer des collections d’éléments dont certains items sont volontairement null. Néanmoins, Datafaker est une bibliothèque dont l’objet est de générer des données similaires à des cas d’utilisation réels : il peut arriver que les sources de données soient imparfaites et qu’avoir des données null puissent être un cas que l’on souhaite tester. D’où l’utilité de la méthode nullRate().

Cette méthode prend un nombre réel entre 0.0 et 1.0 en argument. Cette valeur indique approximativement le taux d’éléments null que l’on souhaite avoir dans la séquence.

En fait, c’est la probabilité que le supplier donne une valeur null pour un nouvel élément. Si la valeur est 1.0, la séquence ne contiendra que des valeurs null.

Résultat de l’exécution du script précédent avec jbang

Vers l’infini et au-delà

Meme Infinite Time

Il est possible de créer une stream avec des données factices en nombre infini. Il suffit de créer une stream factice sans préciser de limite de taille maximum.

Exemple de création d’une séquenc factice infinie

On construit un objet FakeSequence sans générer directement la stream. On peut interroger cette instance pour savoir si elle représente une séquence infinie.

FakeSequence est la super classe de FakeCollection et FakeStream. Ce sont les abstractions que nous fournit Datafaker pour créer respectivement des listes ou des streams avec des données factices. Dans l’exemple, on ne génère pas directement la stream : on construit un objet FakeSequence puis éventuellement on fait un get() dessus pour obtenir la stream sous-jacente.

La méthode isInfinite() est bien au niveau de la classe FakeSequence. Si on crée une collection et qu’on l’interroge avec la méthode isInfinite(), elle retournera systématiquement False.

Une FakeCollection est toujours finie en taille

Ci-après, un script JShell qui reprend ces différents exemples en un seul script.

Résultat de l’exécution du script précédent avec jbang

I’ll be back

Dans ce billet, nous avons vu ce que Datafaker offre pour passer de la génération de données unitaires à des séquences de données. Il est possible de générer tant des collections que des streams avec la possibilité de paramétrer le nombre de données, la manière dont elles sont générées ou encore si on veut faire apparaître dans ces données des valeurs null pour, par exemple, les rendre plus similaires à des flux de données venant du terrain.

A l’issue de ce troisième billet, nous avons vu toutes les fonctionnalités de base de Datafaker, qui permettent déjà de couvrir de très nombreux cas d’utilisation.

Néanmoins, il y a encore d’autres fonctionnalités à traiter que nous verrons dans un prochain billet.

Ressources

Les autres billets sur Datafaker

Remerciement

Je remercie mon collègue Thomas pour sa relecture attentive et ses remarques.

--

--

Christophe Vaudry
norsys-octogone

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