DEV Community

Marcos Belorio
Marcos Belorio

Posted on

Criando dados fake para testes em .Net

Olá, hoje vou apresentar uma biblioteca muito interessante capaz de gerar dados aleatórios muito precisos na nossa língua portuguesa (e outras línguas também) chamada Bogus.

Problema a ser solucionado

Frequentemente nos vemos diante de um teste ou criação de uma POC (proof of concept) onde necessitamos de uma massa de dados para validar nosso código, esses dados necessitam ser o mais parecido possível com o que esperamos para não deixarmos passar nenhum detalhe em nossas validações. Muitas vezes optamos por criar esses dados na mão, mas dependendo da quantidade necessária levamos muito tempo criando, as vezes até duplicando dados.

Nesse contexto a biblioteca Bogus nos auxilia muito, ela é capaz de gerar uma massa de dados do tamanho que você necessita, de forma rápida sem repetir nenhum registro, com suporte a diferentes línguas e muitas opções de dados para que o teste fique o mais real possível.

Demonstração

Para demonstrar o uso da biblioteca, iremos criar um projeto console em .Net e adicionar a biblioteca através do gerenciador de pacotes nuget ou da execução do comando:

dotnet add package Bogus
Enter fullscreen mode Exit fullscreen mode

Vamos também criar nossa classe Pessoa (mais clássico impossível hahahaha), que será utilizada para gerar nossa massa de dados.

public class Pessoa
{
    public int Id { get; set; }
    public string Nome { get; set; }
    public string Email { get; set; }
    public DateTime DataNascimento { get; set; }
    public string Telefone { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

Pronto, vamos agora começar a usar a biblioteca para gerar alguns dados. Dentro da classe Program da nossa aplicação console iremos configurar para ser gerado um objeto Pessoa.

Pessoa pessoa = new Faker<Pessoa>("pt_BR")
    .RuleFor(x => x.Id, f => f.Random.Int(1))
    .RuleFor(x => x.Nome, f => f.Name.FullName())
    .RuleFor(x => x.Email, (f, u) => f.Internet.Email(u.Nome))
    .RuleFor(x => x.DataNascimento, f => f.Date.Past(50))
    .RuleFor(x => x.Telefone, f => f.Phone.PhoneNumberFormat())
    .Generate();

Console.WriteLine(JsonConvert.SerializeObject(pessoa, Formatting.Indented));
Enter fullscreen mode Exit fullscreen mode

Se você já utilizou a biblioteca FluentValidation deve estar reconhecendo a forma de configurar, é praticamente igual.

Olhando o código podemos ver que estamos instanciando a classe Faker passando Pessoa como tipo genérico e setando a língua para português do Brasil, isso ajuda muito a termos dados mais precisos.

A partir dai criamos uma regra para cada propriedade da classe Pessoa.

.RuleFor(x => x.Id, f => f.Random.Int(1))
Enter fullscreen mode Exit fullscreen mode

Setando para a propriedade Id um valor aleatório inteiro sendo o valor mínimo 1.

.RuleFor(x => x.Nome, f => f.Name.FullName())
Enter fullscreen mode Exit fullscreen mode

Setando para a propriedade Nome um nome completo aleatório.

Veja no exemplo abaixo que a biblioteca é tão legal que podemos até especificar se queremos um nome do sexo masculino ou feminino.

.RuleFor(x => x.Nome, f => f.Name.FullName(Bogus.DataSets.Name.Gender.Male))
Enter fullscreen mode Exit fullscreen mode
.RuleFor(x => x.Email, (f, u) => f.Internet.Email(u.Nome))
Enter fullscreen mode Exit fullscreen mode

Setando para a propriedade Email um email aleatório baseado no nome gerado anteriormente.

.RuleFor(x => x.DataNascimento, f => f.Date.Past(50))
Enter fullscreen mode Exit fullscreen mode

Setando para a propriedade DataNascimento uma data baseada nos últimos 50 anos.

.RuleFor(x => x.Telefone, f => f.Phone.PhoneNumberFormat())
Enter fullscreen mode Exit fullscreen mode

Setando para a propriedade Telefone um número já formatado no padrão utilizado aqui no Brasil.

Rodando a aplicação teremos no console o resultado:
Alt Text

Como podemos ver nos exemplos acima são muitas opções de customização para os dados fazendo com que o resultado seja muito próximo de um dado real.

Criando uma grande quantidade de dados

Olhando novamente o exemplo anterior, quem faz de fato o objeto ser criado é o método Generate(), sendo assim se você precisar de 500 registros, basta você setar Generate(500) que ele irá gerar 500 registros sendo nenhum deles repetido, segue um exemplo.

List<Pessoa> pessoaLista = new Faker<Pessoa>("pt_BR")
    .RuleFor(x => x.Id, f => f.Random.Int(1,100))
    .RuleFor(x => x.Nome, f => f.Name.FullName())
    .RuleFor(x => x.Email, (f, u) => f.Internet.Email(u.Nome))
    .RuleFor(x => x.DataNascimento, f => f.Date.Between(Convert.ToDateTime("01/01/1990"), Convert.ToDateTime("01/01/2000")))
    .RuleFor(x => x.Telefone, f => f.Phone.PhoneNumberFormat())
    .Generate(500);
Enter fullscreen mode Exit fullscreen mode

Projeto de exemplo

Caso tenha ficado ainda alguma dúvida no código, você pode ver o exemplo que eu criei nesse repositório do Github.

Se gostou utilize os botões do lado esquerdo para que eu possa saber. Caso tenha alguma dúvida, sugestão ou crítica, deixe um comentário logo abaixo.

Muito obrigado!

Top comments (5)

Collapse
 
leandrorsantos profile image
Leandro Ribeiro dos Santos • Edited

Opa Marcos beleza?
Sabe como posso passar os parâmetros para gerar o cpf sem os caracteres "." e "-"?

Obrigado

Collapse
 
marcosbelorio profile image
Marcos Belorio

E ae Leandro, tudo tranquilo? Você pode gerar o CPF e depois remover os pontos por conta própria, algo assim:

using Bogus.Extensions.Brazil;

Pessoa pessoa = new Faker<Pessoa>("pt_BR")
    .RuleFor(x => x.Cpf, f => new string(f.Person.Cpf().Where(char.IsDigit).ToArray()))
    .Generate();
Enter fullscreen mode Exit fullscreen mode
Collapse
 
joao2391 profile image
João Paulo de C. Lima

Fala, Marcos! Beleza?
Segunda-feira vou precisar gerar algumas massas para teste e seu artigo veio na hora certa.
Parabéns e muito obrigado por compartilhar!

Collapse
 
marcosbelorio profile image
Marcos Belorio

Olá João, que bom que lhe será útil, obrigado por passar por aqui!

Collapse
 
marcosbelorio profile image
Marcos Belorio

Boa Nelson, já li alguns artigos seu no Medium buscando alguns temas no Google, muito bom! 👏

Agradeço por ter passado por aqui!