Custom Data Generators para Data Generators Plan (VS Database Project)

En la última semana estuve trabajando para realizar una charla en Microsoft sobre TFS 2010 y ALM. Del armado de la presentación y de los laboratorios, entre los cuales incluí una pequeña práctica sobre la creación y desarrollo de bases de datos con proyectos de base de datos sobre Visual Studio 2010, surge la creación de estos Custom Data Generators.
Entre muchas de las funcionalidades interesantes y realmente útiles que ofrece este tipo de proyectos, me llamó en especial la atención, el artefacto “Data Generetion Plan” que permite crear un plan de inserción automática de datos en las tablas que deseemos con el fin de realizar un testing mas real.

El objetivo de los mismos es generar datos para llenar una columna en una tabla de la base de datos. En Visual Studio encontraremos por defecto que existe un generador para cada tipo de dato de SQL. El problema es que a veces estos generadores, no generan datos consistentes con el dominio de la aplicación que estamos testeando. Por ejemplo si tengo una tabla con Clientes o Usuarios, se complica llenar dichas tablas con Nombres reales… Por suerte, es posible extender este comportamiento y crear nuestros propios Generadores, para crear datos significativos para nuestras pruebas.

Paso a Paso, como crear un Generador de Datos customizado

A continuacion se listan los pasos que debemos realizar para crear nuestros propios generadores de datos.

  1. Crear un nuevo proyecto de Visual Studio del Tipo Libreria de Clases.
  2. Agregar las siguientes referencias
    1. Microsoft.Data.Schema
    2. Microsoft.Data.Schema.Sql
    3. Microsoft.Data.Schema.Tasks.Sql
    4. Microsoft.Data.Schema.Tools
  3. Crear nuestra clase Generadora. Como veran en el codigo de ejemplo, la misma debe heredar de la clase base Generators. Tambien se deben agregar ciertos atributos como el DatabaseSchemaProviderCompatibility y el Output en las propiedades de salida. El unico metodo que necesitaremos sobre-escribir para generar valores es el OnGenerateNextValue.
    using System;
    using Microsoft.Data.Schema.Sql;
    using Microsoft.Data.Schema.Extensibility;
    using Microsoft.Data.Schema.Tools.DataGenerator;
    
    [DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))]
    public class CountryGenerator : Generator
    {
        Random _random;
       
        public CountryGenerator()
        {
            _random = new Random(this.Seed);
        }
    
        protected override void OnGenerateNextValues()
        {
            //TODO Algoritmo para generar los datos "Output" utilizando el _random.
        }
    
        protected override void OnInitialize(GeneratorInit initInfo)
        {
            _random = new Random(this.Seed);
            base.OnInitialize(initInfo);
        }
    
        [Output(Name = "Pais", Description = "Devuelve el nombre del pais en ingles.")]
        public string CountryName { get; private set; }
    }

     

  4. Firmar el Assembly: Para firmar el Assembly, deberemos crear una llave (clave publica, clave privada) y agregar los atributos correspondientes en el proyecto.
    1. Para generar la llave debemos abrir la consola de comandos de Visual Studio y ejecutar el siguiente comando “sn.exe -k keyfile.snk”. Este comando generará la llave en el directorio VC dentro del directorio de instalacion de Visual Studio.
    2. Una vez agregada dicha clave en el proyecto, abrimos la clase AssemblyInfo.cs y agregamos la siguiente linea:
      [sourcecode language=”csharp”][assembly:AssemblyKeyFileAttribute(“keyfile.snk”)]

      [/sourcecode]

      Para mas informacion sobre las claves, vea How to: Create a Public/Private Key Pair

    3. Generar el XML con la lista de constructores: Por ultimo debemos generar un XML donde se describan todos los generadores del Assembly. Para ello necesitaremos conocer el nombre completo de nuestro Assembly. Ejecutando el siguiente comando en la ventana de comando de VS podremos obtenerlo:Una vez que tengamos el nombre de nuestro Assembly, debemos generar un  archivo que deberá llamarse “NombreDeAssembly.Extensions.xml”:
      <?xml version="1.0" encoding="utf-8"?>
      <extensions assembly="" version="1" xmlns="urn:Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd">
          <extension type="DataGenerators.NameGenerator" assembly="DataGenerators, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bf9e0786a31e281" enabled="true"/>
          <extension type="DataGenerators.CountryGenerator" assembly="DataGenerators, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3bf9e0786a31e281" enabled="true"/>
      </extensions>

      Como podemos ver en el ejemplo, debe existir un elemento “extension” por cada generador que contenga el assembly y la propiedad “assembly” de dichos elementos debe tener como valor el nombre del assembly que obtuvimos en el paso anterior.

    4. Como ultimo paso, debemos copiar el archivo .dll y el archivo .xml que se generaron en los pasos anteriores a la carpeta “{Path de instalación de VS}\VSTSDB\Extensions\CustomGenerators”. De no existir el directorio “CustomGenerators” deberemos crearlo.
Finalmente, podremos crear nuestro Data Generation Plan y ver nuestros generadores habilitados para ser seleccionados en las columnas de las tablas que intervengan en el plan, como muestran las siguientes imagenes!
Ventana del Data Generation Plan
Configuracion de los Generadores de datos para las columnas de cada tabla
Resultados de la generacion de datos customizados

Proyecto DataGenerators

Por ultimo, les dejo un link de un proyecto de Generadores que desarrolle. El mismo posee por el momento dos Generadores que necesitaba para realizar algunas pruebas en proyectos en los que estoy trabajando actualmente.

El proyecto posee un generador de Nombres personales. El mismo genera de forma aleatoria nombres de hombre y mujeres. Los mismos son generados utilizando una lista de los 100 nombres más comunes y los 100 apellidos más comunes en Argentina. El otro, genera nombre de países y provincias (todos reales, obtenidos de GeoNames.

La URL del proyecto es http://datagenerators.codeplex.com. En la pagina podrán encontrar la documentación, el código fuente (es un proyecto open source) y los binarios del ultimo release del proyecto.

Como verán, tanto en este blog, como en la página del proyecto, se agregan algunas herramientas nuevas como NuGet y CodePlex. En el próximo blog estaré profundizando sobre las mismas.

Formando parte de Stack Overflow

Hace rato que vengo leyendo el blog de Joel Spolsky y me parece muy groso. Lo descubri gracias a mi amigo Pablo Russo (iterando) otro groso.

Entre los proyectos de Joel se encuentra Stack Overflow, una comunidad que se hizo muy respetable en lo que es preguntas/respuestas hacerca de programacion. (para la gente de IT se abrio recientemente el sitio http://serverfault.com/)

En general las respuestas en Stack Overflow son bastante buenas y ayudan a resolver problemas complicados. Lo bueno del sitio es que se vota las respuestas y por lo general el que postea cierra el thread marcando la respuesta que le ayudo a resolver el problema.

Stack Overflow agrego últimamente a su funcionalidad Stack Overflow Carreers en donde uno puede subir su curriculum y a el mismo se le añade nuestro puntaje del foro (que se va ganando respondiendo preguntas).

Otra cosa que me parecio muuuy buena, es que no hace falta crearse un usuario, sino que si uno ya tiene gmail, yahoo, AOL, myOpenId, wordpress, blogger, verisign, etc, solamente debo presionar el icono correspondiente y el usuario se crea automaticamente (despues uno puede completar su perfil si lo desea…)

Ayer cree el usuario (gracias al proceso anterior no tarde mas de 5 segundos) y hoy ya estoy intentando ganar algunos puntos contestando preguntas que estén a mi alcance técnico (ej: como sumar dos enteros en c# y eso).

mmm queria dejarles mi flair, pero por los estandares de wordpress.org, no se permiten tags iframe y como uso wordpress.com tampoco puedo subir plugins… sorry. Si quieren verlo pueden aca o haciendo click sobre la imagen del flair.

Stack Overflow Flair

CardioPod un producto de Telehealth Solutions

Hace unos meses Telehealth Solutions una empresa Inglesa ubicada en Watford, lanzo CardioPod, un producto en el que venimos trabajando hace ya unos cuantos meses. El mismo permite calcular el riesgo cardio-vascular de un paciente mediante la realización de una serie de test y cuestionarios.

Por ahora el producto los están usando las tres principales servicios de medicina de inglaterra, pero esperamos que en el proximo año se sumen muchas mas.

Les dejo algunos links con articulos sobre el producto:

http://www.news-medical.net/news/20090624/Telehealth-Solutions-launches-CardioPod-for-NHS-Health-Check.aspx

http://www.european-hospital.com/en/article/6058.html

http://www.ehiprimarycare.com/news/4990/cardiopod_launched_at_nhs_camden

http://scottishhealthcare.co.uk/78/edinburgh-pharmacist-cardiopod/