67 votes

Bibliothèque C# pour remplir un objet avec des données aléatoires

Je veux remplir mon objet avec des données aléatoires (à des fins de test), existe-t-il une bibliothèque pour le faire ?

Une sorte de méthode de réflexion qui traverse le graphe d'objets et initialise les propriétés primitives comme (string, int, DateTime, etc.) (mais qui le fait de manière approfondie, en incluant les collections, les objets enfants, etc.)

0 votes

Jetez aussi un coup d'œil à cette question. Ce n'est peut-être pas une bonne chose d'utiliser uniquement des données aléatoires : stackoverflow.com/questions/4317747/

67voto

Brian Chavez Points 2507

Bogus

Bogus est un générateur de fausses données simple et sain pour C# et .NET. Un portage C# de faker.js et inspiré par le sucre syntaxique de FluentValidation. Supports .NET Core .

Configuration

public enum Gender
{
   Male,
   Female
}

var userIds = 0;

var testUsers = new Faker<User>()
    //Optional: Call for objects that have complex initialization
    .CustomInstantiator(f => new User(userIds++, f.Random.Replace("###-##-####")))

    //Basic rules using built-in generators
    .RuleFor(u => u.FirstName, f => f.Name.FirstName())
    .RuleFor(u => u.LastName, f => f.Name.LastName())
    .RuleFor(u => u.Avatar, f => f.Internet.Avatar())
    .RuleFor(u => u.UserName, (f, u) => f.Internet.UserName(u.FirstName, u.LastName))
    .RuleFor(u => u.Email, (f, u) => f.Internet.Email(u.FirstName, u.LastName))
    //Use an enum outside scope.
    .RuleFor(u => u.Gender, f => f.PickRandom<Gender>())
    //Use a method outside scope.
    .RuleFor(u => u.CartId, f => Guid.NewGuid());

Générer

var user = testUsers.Generate();
Console.WriteLine(user.DumpAsJson());

/* OUTPUT:
{
  "Id": 0,
  "FirstName": "Audrey",
  "LastName": "Spencer",
  "FullName": "Audrey Spencer",
  "UserName": "Audrey_Spencer72",
  "Email": "Audrey82@gmail.com",
  "Avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/itstotallyamy/128.jpg",
  "Gender": 0,
  "CartId": "863f9462-5b88-471f-b833-991d68db8c93", ....

Sans syntaxe fluide

  public void Without_Fluent_Syntax()
  {
      var random = new Bogus.Randomizer();
      var lorem = new Bogus.DataSets.Lorem();
      var o = new Order()
          {
              OrderId = random.Number(1, 100),
              Item = lorem.Sentence(),
              Quantity = random.Number(1, 10)
          };
      o.Dump();
  }
  /* OUTPUT:
  {
    "OrderId": 61,
    "Item": "vel est ipsa",
    "Quantity": 7
  } */

29voto

Yuck Points 23174

NBuilder est une très bonne bibliothèque fluent-API pour la génération de données. Elle utilise des règles que vous définissez et n'est pas "aléatoire" en soi. Cependant, vous pouvez être en mesure de rendre aléatoires les entrées de l'API pour répondre à vos besoins.

Puisque ce sujet fait encore l'objet d'une certaine attention, je pense qu'il est utile de mentionner que le projet est maintenant disponible via NuGet ( https://www.nuget.org/packages/NBuilder/ ) également, bien qu'il n'ait pas été modifié depuis 2011.

28voto

Maxim Eliseev Points 431

J'ai essayé AutoFixture ( https://github.com/AutoFixture/AutoFixture ) et cela a très bien fonctionné pour moi. Il peut facilement générer un objet avec une hiérarchie profonde d'enfants en une seule ligne de code.

0 votes

C'est vraiment bon !

9voto

JCisar Points 726

J'ai récemment travaillé sur un projet qui ressemble exactement à ce que vous avez décrit (cela a peut-être déjà été fait, mais cela semblait être un projet amusant à essayer). C'est encore un travail en cours mais je pense qu'il capture toutes les fonctionnalités que vous avez mentionnées. Vous pouvez trouver le paquet Nuget ici :

https://www.nuget.org/packages/randomtestvalues

Et le dépôt ici : https://github.com/RasicN/random-test-values

J'espère que vous l'apprécierez.

Exemple de code :

var randomMyClass = RandomValue.Object<MyClass>();

4voto

taylonr Points 7195

AutoPoco possède une partie de cette fonctionnalité, mais ne le fait pas par réflexion, vous lui dites quel type de données remplir. Donc, si vous écrivez des tests unitaires, vous pouvez le faire dans vos [Setup] o [TestInitialize] méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X