C# | Cómo generar datos aleatorios para realizar pruebas

Intermedio

En ocasiones necesitamos un conjunto de datos para generar pruebas pero no siempre tenemos tiempo o infraestructura para obtener esos datos de una base de datos previamente creada.

Utilizando algo de linq e ingenio podemos crear un conjunto de datos aleatorios que nos permitan realizar pruebas de manera rápida.

En este ejemplo crearemos una lista de personas, el objeto personas es este:

 
public class Persona
{
    public string Nombre { get; set; }
    public string Apellido { get; set; }
    public int Cedula { get; set; }
    public string Profesion { get; set; }
}

Ahora crearemos nuestro DataSource, inicialmente bastará con una pequeña lista de apenas 10 personas

 

public class DataSourcePersonas
{
    public List ListaPersonas{ get; set; }
    public DataSourcePersonas()
    {
        var listaPivote = new ObservableCollection()
        {
            new Persona(){ Profesion="Ingeniero",Apellido="Ruiz Pacheco",Nombre="Juan Carlos"},
            new Persona(){ Profesion="Médico",   Apellido="Montoya",     Nombre="Leidy Paola"},
            new Persona(){ Profesion="Analista", Apellido="Gates",       Nombre="Bill"},
            new Persona(){ Profesion="Enfermero",Apellido="Jobs",        Nombre="Steve"},
            new Persona(){ Profesion="Conductor",Apellido="Torvalds",    Nombre="Linus"},
            new Persona(){ Profesion="Piloto",   Apellido="Cruise",      Nombre="Tom"},
            new Persona(){ Profesion="Capitán",  Apellido="Cat",         Nombre="Tom"},
            new Persona(){ Profesion="Biólogo",  Apellido="Master",      Nombre="Osho"},
            new Persona(){ Profesion="Físico",   Apellido="Eye",         Nombre="Golden"},
            new Persona(){ Profesion="Astrónomo",Apellido="Telecom",     Nombre="Telefonica"}
        };
    }
}

Con esto será suficiente, ahora es tiempo para la magia.

Utilizando Linq haremos simplemente un producto cartesiano, consultaremos listaPivote haciendo join consigo misma, para producir una combinatoria de Personas, suena complicado? realmente es muy fácil, mira:

 
public class DataSourcePersonas
{
    public List<Persona> ListaPersonas{ get; set; }

    public DataSourcePersonas()
    {
        var listaPivote = new ObservableCollection<Persona>()
        {
            new Persona(){ Profesion="Ingeniero",Apellido="Ruiz Pacheco",Nombre="Juan Carlos"},
            new Persona(){ Profesion="Médico",   Apellido="Montoya",     Nombre="Leidy Paola"},
            new Persona(){ Profesion="Analista", Apellido="Gates",       Nombre="Bill"},
            new Persona(){ Profesion="Enfermero",Apellido="Jobs",        Nombre="Steve"},
            new Persona(){ Profesion="Conductor",Apellido="Torvalds",    Nombre="Linus"},
            new Persona(){ Profesion="Piloto",   Apellido="Cruise",      Nombre="Tom"},
            new Persona(){ Profesion="Capitán",  Apellido="Cat",         Nombre="Tom"},
            new Persona(){ Profesion="Biólogo",  Apellido="Master",      Nombre="Osho"},
            new Persona(){ Profesion="Físico",   Apellido="Eye",         Nombre="Golden"},
            new Persona(){ Profesion="Astrónomo",Apellido="Telecom",     Nombre="Telefonica"}
        };

        Random genCedula = new Random();

        var listaFull = from persona in listaPivote
                        from persona2 in listaPivote
                        from persona3 in listaPivote
                        select new Persona(){ Cedula = (int)(genCedula.NextDouble() * 999999999),
                                                        Nombre=persona.Nombre,
                                                        Apellido=persona2.Apellido,
                                                        Profesion=persona3.Profesion };

        ListaPersonas = new List<Persona>(listaFull);
    }
}

Esto nos ha generado una lista de 1000 registros partiendo tan solo 10, una parte del truco es hacer join múltiple y la otra es la clausula select, fijate que allí creamos nuevos objetos de tipo Persona pero en su creación replicamos nombre, apellido y profesión cada uno de una lista de personas diferente! (realmente es la misma pero de otra parte del join).

Hasta allí ya esta hecho todo el trabajo, para darle un poco de mayor diversidad a los datos el atributo Cedula lo he inicializado con un valor aleatorio entre 0 y 999999999 .

Gracias a esta combinación podemos generar automáticamente registros como estos:

 Profesion="Enfermero",Apellido="Ruiz Pacheco" Nombre="Tom"
Profesion="Conductor",Apellido="Montoya",     Nombre="Tom"
Profesion="Piloto",   Apellido="Gates",       Nombre="Osho"
Profesion="Capitán",  Apellido="Jobs",        Nombre="Golden"
Profesion="Biólogo",  Apellido="Torvalds",    Nombre="Telefonica"

Eso es todo!