Генерация тестовых данных на C#

02.10.2017 at 22:20

Для генерации данных я использую библиотеку Bogus. Начнем с примеров:

using Bogus;
using Bogus.DataSets;
...
var faker = new Faker();
Console.WriteLine(faker.Company.CompanyName()); //Keebler LLC
Console.WriteLine(faker.Name.FullName(Name.Gender.Male)); //Werner Rath
Console.WriteLine(faker.Image.Animals()); //http://lorempixel.com/640/480
Console.WriteLine(faker.Internet.Avatar()); //https://s3.amazonaws.com/uifaces/faces/twitter/rehatkathuria/128.jpg

Методы генерации сгруппированы по датасетам. Bogus умеет генерировать следующие данные:
Address — почтовый индекс, улица, страна, штат, широта и долгота и т.д.
Commerce — название продукта, материал, цвет, цена и т.д.
Company — название компании, девиз и т.д.
Database — имя колонки, тип колонки, движок таблицы и т.д.
Date — множество методов для генерации дат по различным условиям
Finance — генерация валидных номеров счетов, карт, кошельков криптовалют и т.д.
Hacker — генерация существительных, прилагательных, глаголов и т.д.
Images — генерация ссылок на картинки с различными тематиками
Internet — генерация урлов, емейлов, IP адресов
Lorem — куски текста, предложения, абзацы
Name — части имени и должности
PhoneNumbers — номера телефонов
Rant — отзывы на товар
System — имена файлов, пути к директориям

Локализация тестовых данных

При создании генератора ему можно указать локаль

var faker = new Faker("ru");
Console.WriteLine(faker.Name.FullName(Name.Gender.Male)); //Игнатий Савельев

Поддерживается большое количество локалей, но для некоторых локалей некоторые датасеты недоступны.

Заполнение свойств объектов

Для заполнения свойств моделей можно использовать генераторы.
Создаем класс тестовой модели

public class TestUser
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Login { get; set; }
}

Теперь создаем соответствующий генератор и генерируем экземпляр нашего класса

var generator = new Faker<TestUser>()
    .StrictMode(true)
    .RuleFor(x => x.Name, f => f.Name.FirstName())
    .RuleFor(x => x.Age, f => f.Random.Int(25, 50))
    .RuleFor(x => x.Login, f => f.Person.UserName);

var testUser = generator.Generate();

Console.WriteLine(testUser.Name); //Jamar
Console.WriteLine(testUser.Age); //30
Console.WriteLine(testUser.Login); //Mabel.Luettgen13

Вызов .StrictMode(true) означает, что для всех свойств класса обязательно наличие правила.