30/7/2010 9:07 El Bruno

[VS2010] HowTo: Crear un DataCollector para adjuntar información extra al proceso de testing

image47dd1de4

Buenas,

para cerrar una semana un tanto especial, hoy toca mostrar como crear un DataCollector personalizado, para agregar información extra al resultado de un set de pruebas de Visual Studio 2010. El gran Shai (ojo con la foto del header de su blog) explica un paso a paso detallado aquí. En el ejemplo de este post, crearé un DataCollector que agrega información muy importante al resultado de un proceso de test: el estado de mi página de Twitter @elbruno.

Para esto, me he basado en el siguiente código, que me permite descargar el contenido de una URI a un archivo temporal local, donde la función GetElBrunoTwitterInformation(), retorna la ubicación de un archivo temporal con el contenido de http://twitter.com/elbruno.

   public class TwitterInfo
    {
        public string GetElBrunoTwitterInformation()
        {
            // generate temp file
            var fileName = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + ".htm");
            if (File.Exists(fileName))
                File.Delete(fileName);

            // save local file
            GetUrl(new Uri(@"http://twitter.com/elbruno"), fileName);
            return fileName;
        }


        private bool GetUrl(Uri uri, string localFileName)
        {
            var ret = false;
            var request = WebRequest.Create(uri) as HttpWebRequest;
            var response = request.GetResponse() as HttpWebResponse;
            try
            {
                // Hope GetEncoding() knows how to parse the CharacterSet
                var encoding = Encoding.GetEncoding(response.CharacterSet);
                var reader = new StreamReader(response.GetResponseStream(), encoding);
                using (var sw = new StreamWriter(localFileName, false, encoding))
                {
                    sw.Write(reader.ReadToEnd());
                    sw.Flush();
                    sw.Close();
                    ret = true;
                }
            }
            catch
            {
                ret = false;
            }
            finally
            {
                response.Close();
            }
            return ret;
        }
    }

Ahora a crear el DataCollector, para esto agregamos las siguientes referencias:

  • Microsoft.VisualStudio.QualityTools.Common
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.VisualStudio.QualityTools.Common.dll
  • Microsoft.VisualStudio.QualityTools.ExecutionCommon
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.VisualStudio.QualityTools.ExecutionCommon.dll

y heredamos de DataCollector. En mi caso particular, además he decorado la clase para indicar la URI y descripción del DataCollector.

    [DataCollectorTypeUri("datacollector://ElBruno/TwitterCollector/1.0")]
    [DataCollectorFriendlyName("El Bruno Twitter Collector")]
    public class TwitterCollector : DataCollector
    {
        private DataCollectionSink _sink;

        public override void Initialize(XmlElement configurationElement, DataCollectionEvents events, DataCollectionSink sink, DataCollectionLogger logger, DataCollectionEnvironmentContext environmentContext)
        {
            _sink = sink;
            // suscribe to test run session end
            events.SessionEnd += EventsSessionEnd;
        }

        private void EventsSessionEnd(object sender, SessionEndEventArgs e)
        {
            // add file
            var file = new TwitterInfo().GetElBrunoTwitterInformation();
            _sink.SendFileAsync(e.Context, file, string.Format(@"ElBruno Twitter Homepage -> {0}", DateTime.Now), false);
        }
    }

El punto de entrada es DataCollector.Initialize(), ya que en este punto podemos:

  • acceder a la configuración del test
  • trabajar con la colección de eventos propios de la ejecución de un test
  • trabajar con la colección de archivos relacionados con la ejecución de un test
  • acceder al contexto de ejecución del test

En este ejemplo, he creado una suscripción al evento SessionEnd(), y en el mismo agrego como un archivo adjunto al test un htm con el contenido de http://twitter.com/elbruno.

Aclaración: ya lo sé, solo en muy pocas ocasiones esto será necesario, pero bueno, es un ejemplo.

Una vez compilado el ensamblado, debemos copiar el mismo al directorio de DataCollectors de Visual Studio 2010, por lo general es:

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors\

A partir de este momento, en la configuración de la ejecución de tests, en la sección [Data and Diagnostics]; podremos ver un nuevo adaptador llamado [El Bruno Twitter Collector]

image

Si activamos el mismo, y lanzamos la ejecución de uno o más tests, podremos ver que una vez que han pasado los mismos, en el link [Test run completed] hay información adicional agregada:

image

 

En la ventana de resultados de tests, en la sección [Collected Files], hay adjunto un archivo (con nombre de GUID) que posee el contenido de http://twitter.com/elbruno, con su descripción correspondiente:

image

 

 

 

 

Para finalizar, si accedemos a la ubicación de resultados de tests en el disco local (tengo un post pendiente al respecto), podremos ver el archivo htm generado al final de la sessión de ejecución de test:

image

 

Y claro, que placer más grande que nos da, poder abrir el htm :D

image

 

Descarga el código de ejemplo si puedes que hoy skydrive está como está en: http://cid-bef06dffdb192125.office.live.com/self.aspx/Code%20Samples/2010%2007%2030%20Custom%20DataCollector.zip

 

Saludos @ Here

El Bruno

Referencias:

Archivado en: ,
Comparte este post:

# re: [VS2010] HowTo: Crear un DataCollector para adjuntar información extra al proceso de testing

Friday, July 30, 2010 1:36 PM by Julio Trujillo Leon

Sí, la verdad es que la foto es muy "galáctica" :DDDD

# re: [VS2010] HowTo: Crear un DataCollector para adjuntar información extra al proceso de testing

Friday, July 30, 2010 2:06 PM by El Bruno

@Julio, si pero no olvidemos que lo importante es "lo que podemos hacer con los tests" ... jeje

Salu2