Как стать автором
Обновить

Faker API для .NET — генерация случайных имен и других данных

Время на прочтение4 мин
Количество просмотров11K

Помню, недавно выполнял задание на вакансию масленка после технического собеседования.

Формулировка следующая:

- Необходимо сгенерировать список случайных объектов по предоставленным моделям, сериализовать их в json, после загрузить их из файла в обратно память.

В общем, простое задание на джуна, хоть не аналог авито писать, и на том спасибо.

Оригинальная формулировка задания:

Create a program which will execute the next steps:
1) Create collection of randomly generated objects in memory by provided models, number of ofjects 10000;
2) Serialyze it to JSON format;
3) Write the serialization result to the current user desktop directory, the text file name should be "Persons.json";
4) Clear the in memory collection;
5) Read objects from file;
6) Display in console persons count, persons credit card count, the average value of child age.

Use POSIX format for dates.
Use lowerCamelCase JSON notation in result file.
// Data models
class Person
{
	public Int32 Id { get; set; }
	public Guid TransportId { get; set; }
	public String FirstName { get; set; }
	public String LastName { get; set; }
	public Int32 SequenceId { get; set; }
	public String[] CreditCardNumbers { get; set; }
	public Int32 Age { get; set; }
	public String[] Phones { get; set; }
	public Int64 BirthDate { get; set; }
	public Double Salary { get; set; }
	public Boolean IsMarred { get; set; }
	public Gender Gender { get; set; }
	public Child[] Children { get; set; }	
}
class Child
{
	public Int32 Id { get; set; }
	public String FirstName { get; set; }
	public String LastName { get; set; }
	public Int64 BirthDate { get; set; }
	public Gender Gender { get; set; }
}
enum Gender
{
	Male,
	Female
}

Я если честно не понимаю, почему нельзя просто использовать псевдонимы системных типов, подскажите в комментариях.

Подключаем Faker

Faker можно добавить в проект через менеджер пакетов NuGet.

У данного пространства есть целая куча классов, с помощью которым можно генерировать те или иные данные:

Faker.Address - генерация адресов

Faker.Boolean- генерация логических данных

Faker.Company- генерация компаний

Faker.Identification- генерация идентификационных данных

Faker.Finance- генерация финансовых значений

Faker.Name- генерация имен

Подключаем нужное пространство имен и начинаем пользоваться:

using Faker;
using Collection.Data;

namespace Collection.Generator
{
    internal class PersonsGenerator
    {
        public List<Person> persons = new List<Person>();
        Random random = new Random();


        DateTimeGeneration birthdayDate = new DateTimeGeneration();
        PhonesGenerator phones = new PhonesGenerator();
        ChildGenerator children = new ChildGenerator();
        CreditCardsGeneration creditCards = new CreditCardsGeneration();

        public PersonsGenerator(int count)
        {
            for (int i = 0; i < count; ++i)
            {
                persons.Add(new Person
                {
                    Id = i,
                    TransportId = Guid.NewGuid(),
                    
                    // Случайная генерация имен
                    FirstName = Faker.Name.First(),
                    LastName = Faker.Name.Last(),
                    
                    SequenceId = i,
                    CreditCardNumbers = creditCards.CreateCreditCards(),
                    
                    // Числа тоже можно генерировать
                    Age = Faker.RandomNumber.Next(18, 100),
                    
                    Phones = phones.CreatePhones(),
                    BirthDate = ((DateTimeOffset)birthdayDate.CreateBirthdayDate()).ToUnixTimeSeconds(),
                    Salary = (double)Faker.RandomNumber.Next(10000, 100000),
                    IsMarred = Faker.Boolean.Random(),
                    
                    // Можно рандомизировать константы из перечислений
                    Gender = Faker.Enum.Random<Gender>(),
                    
                    Children = children.CreateChildren(out childrenCount)
                });
            }          
        }
    }
}

Теперь можно попробовать вывести все это в консоль, я написал небольшой класс с рефлексией, который выводит данные в консоль:

    internal class ConsoleWriter<T> where T: class
    {
        public ConsoleWriter(List<T> collection)
        {
            Type type = typeof(T);
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var o in collection)
            {
                for (int i = 0; i < properties.Length; i++)
                {
                    Console.WriteLine($"{properties[i].Name}:\t{properties[i].GetValue(o)}");
                    
                    // Не обращаем внимание, так, для себя сделал
                    if (properties[i].PropertyType.IsArray)
                    {
                        Console.WriteLine("Array!");
                    }
                        
                }
                Console.WriteLine();
            }
            
        }
    }
static void Main(string[] args)
{

	// Здесь генерация объектов
	PersonsGenerator generator = new PersonsGenerator(5);
  JsonWriter<Person> jsonWriter = new JsonWriter<Person>();
  JsonReader<Person> jsonReader = new JsonReader<Person>();

  // Вот здесь вывод данных в консоль после генерации
  ConsoleWriter<Person> debuger = new ConsoleWriter<Person>(generator.persons);
  Console.WriteLine("Reflection is end. Push ENTER to continue...");

  // Запись данных в JSON
  jsonWriter.WriteToFile(generator.persons);
  Console.WriteLine("Serialization is complete!");
 
  // Очистка после подтверждения
  Console.ReadLine();
  generator.persons.Clear();
  generator.Dispose();

  // Чтение из файла
  var persons = jsonReader.ReadFromFile();

  // Вывод данных
  ValueCounter counter = new ValueCounter();
  
  Console.WriteLine($"Persons count is {persons.Count}");
  Console.WriteLine($"Average children age is {counter.AverageChildAge(persons)}");
  Console.WriteLine($"Credit cards count is {counter.CreditCardCount(persons)}");

  Console.ReadKey();
}

Результат в консоли следующий:

Имена конечно иногда странные, но, как мне кажется для тестов вполне сойдет.

Итоги

В конечном итоге, меня не взяли на работу масленком, дав следующий ответ:

HR: Даниил, здравствуйте!
Мы благодарим Вас за проявленный интерес к нашей компании и желание с нами сотрудничать.
На позицию, которую мы Вас рассматривали, мы пока не готовы Вам сделать предложение о работе. С Вашего позволения мы хотели бы Ваше резюме добавить в кадровый резерв, чтобы в случае, если у нас появится подходящая вакансия, связаться с Вами.
Также мы желаем Вам успехов в поисках работы!

Я: Опишите пожалуйста более точно причину отказа.

HR: Уточнила, тимлид обещал ответить сегодня вечером или завтра до обеда

---"Через 3 часа"---

HR: Даниил, по поводу обратной связи: самое основное - недостаточно теоретических знаний и отсутствие опыта работы с asp net.

Как мне сказали люди, скорее всего они нашли кандидата лучше, но ничего страшного, может в другой раз повезет. Зато я познакомился с новым интересным инструментом, надеюсь, что в дальнейшем.

Было бы интересно почитать ваши советы и отзывы по поводу статьи, так как пишу первый раз что-то подобное. Спасибо!

Теги:
Хабы:
Всего голосов 5: ↑4 и ↓1+3
Комментарии10

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань