Améliorer les tests avec des données réalistes

Niveau :

9 minutes de lecture

Dans cet article, vous allez apprendre à utiliser Bogus pour générer des données réalistes pour vos tests ou bien pour alimenter des données de développements ainsi :

  • Pourquoi des données toujours plus réalistes ?
  • Prérequis
  • Configuration de Bogus
  • Utilisation de Bogus
  • Gestion des langues avec Bogus

Pourquoi des données toujours plus réalistes ?

Lors de la phase de développement et surtout les tests, il est souvent compliqué d’avoir des données réalistes pour plusieurs raisons : confidentialité, données de production sensibles, RGPD, ect…

On se retrouve donc souvent a manipuler des classes complexes qui contiennent malheureusement des données de ce style :

Pourquoi ? Certainement pour plusieurs raisons comme la productivité, la pénibilité de créer des données cohérentes et/ou pleins d’autres raisons. Heureusement, Bogus est là pour nous sauver la vie.

Prérequis

  • Un projet Console ou autre

Configuration de Bogus

Dans le projet ci-dessus, créons deux classes User.cs et Vehicule.cs comme ci-dessous :

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Region { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }
        public string Phone { get; set; }
        public Vehicule Vehicule { get; set; }
    }
    public class Vehicule
    {
        public string Vin { get; set; }
        public string Constructor { get; set; }
        public string Model { get; set; }
        public string Type { get; set; }
        public string Motor { get; set; }
    }

Installez le package Bogus et configurez la class Program.cs comme ci-dessous :

Vous constatez qu’a chaque exécution, des données aléatoires sont générées.

Utilisation de Bogus

Complétons toutes les propriétés des classes comme ci-dessous :

var newVehicule = new Faker<Vehicule>()
    .RuleFor(vehicule => vehicule.Vin, faker => faker.Vehicle.Vin())
    .RuleFor(vehicule => vehicule.Model, faker => faker.Vehicle.Model())
    .RuleFor(vehicule => vehicule.Motor, faker => faker.Vehicle.Fuel())
    .RuleFor(vehicule => vehicule.Constructor, faker => faker.Vehicle.Manufacturer())
    .RuleFor(vehicule => vehicule.Type, faker => faker.Vehicle.Type());

var newCustomer = new Faker<Customer>()
    .RuleFor(user => user.FirstName, faker => faker.Person.FirstName)
    .RuleFor(user => user.LastName, faker => faker.Person.LastName)
    .RuleFor(user => user.Address, faker => faker.Person.Address.Street)
    .RuleFor(user => user.PostalCode, faker => faker.Person.Address.ZipCode)
    .RuleFor(user => user.City, faker => faker.Person.Address.City)
    .RuleFor(user => user.Country, faker => faker.Person.Address.State)
    .RuleFor(user => user.Phone, faker => faker.Person.Phone)
    .RuleFor(user => user.Region, faker => faker.Person.Address.State)
    .RuleFor(user => user.Vehicule, faker => newVehicule.Generate());    

Console.WriteLine(JsonSerializer.Serialize(newCustomer.Generate()));

Imaginons que notre class User.cs accepte une liste de véhicules, alors il est possible de générer plusieurs véhicules comme ainsi :

.RuleFor(user => user.Vehicule, faker => newVehicule.Generate(3));

Gestion des langues avec Bogus

La grande puissance de Bogus est sa gestion des contraintes de globalizations et localizations. Dans les exemples ci-dessus, les utilisateurs sont par défaut issus du système de globalisation US. Si nous voulons changer la localisation, il suffit d’utiliser les constantes ci-dessous :

Bogus supports the following locales:

Locale CodeLanguageLocale CodeLanguage
af_ZAAfrikaansfr_CHFrench (Switzerland)
arArabicgeGeorgian
azAzerbaijanihrHrvatski
czCzechid_IDIndonesia
deGermanitItalian
de_ATGerman (Austria)jaJapanese
de_CHGerman (Switzerland)koKorean
elGreeklvLatvian
enEnglishnb_NONorwegian
en_AUEnglish (Australia)neNepalese
en_AU_ockerEnglish (Australia Ocker)nlDutch
en_BORKEnglish (Bork)nl_BEDutch (Belgium)
en_CAEnglish (Canada)plPolish
en_GBEnglish (Great Britain)pt_BRPortuguese (Brazil)
en_IEEnglish (Ireland)pt_PTPortuguese (Portugal)
en_INDEnglish (India)roRomanian
en_NGNigeria (English)ruRussian
en_USEnglish (United States)skSlovakian
en_ZAEnglish (South Africa)svSwedish
esSpanishtrTurkish
es_MXSpanish (Mexico)ukUkrainian
faFarsiviVietnamese
fiFinnishzh_CNChinese
frFrenchzh_TWChinese (Taiwan)
fr_CAFrench (Canada)zu_ZAZulu (South Africa)

Rajoutons donc la constante fr pour la génération des données :

var newVehicule = new Faker<Vehicule>("fr")
    .RuleFor(vehicule => vehicule.Vin, faker => faker.Vehicle.Vin())
    .RuleFor(vehicule => vehicule.Model, faker => faker.Vehicle.Model())
    .RuleFor(vehicule => vehicule.Motor, faker => faker.Vehicle.Fuel())
    .RuleFor(vehicule => vehicule.Constructor, faker => faker.Vehicle.Manufacturer())
    .RuleFor(vehicule => vehicule.Type, faker => faker.Vehicle.Type());

var newCustomer = new Faker<Customer>("fr")
    .RuleFor(user => user.FirstName, faker => faker.Person.FirstName)
    .RuleFor(user => user.LastName, faker => faker.Person.LastName)
    .RuleFor(user => user.Address, faker => faker.Person.Address.Street)
    .RuleFor(user => user.PostalCode, faker => faker.Person.Address.ZipCode)
    .RuleFor(user => user.City, faker => faker.Person.Address.City)
    .RuleFor(user => user.Country, faker => faker.Person.Address.State)
    .RuleFor(user => user.Phone, faker => faker.Person.Phone)
    .RuleFor(user => user.Region, faker => faker.Person.Address.State)
    .RuleFor(user => user.Vehicule, faker => newVehicule.Generate(3));    

Console.WriteLine(JsonSerializer.Serialize(newCustomer.Generate(4)));

Bogus gère énormément de domaine de données comme les adresses, le commerce, les véhicules, les dates, la finance, … Vous trouverez plus d’information dans ce lien.

Laisser un commentaire