January 2009 - Artículos

El Bruno Visual Studio Team System

Buenas

estoy un poco pesado con los errores estos días, pero es que estoy limpiando los drafts del Windows Live Writer y veo estos errores que son un poco bizarros. En este caso el escenario es el siguiente:

Dentro del editor de páginas ASP.Net de Visual Studio, seleccionas el panel de la Toolbox e intentas agregar un elemento a la misma con la opción [Choose toolbox Items]. En este momento el IDE de Visual Studio se cierra sin mostrar ningún mensaje de error y tampoco deja ningún rastro en el Event Viewer.

Vamos que pasas de tener esto

a NADA en 1 segundo.

Después de buscar un poco, me encontré con que este error está reportado en Connect (https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363321&wa=wsignin1.0) y que parece que el problema lo ocasionan las Power Commands para Visual Studio 2008.

La solución pasa por desinstalar las mismas y probar nuevamente … :D

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com

Publicado 28/1/2009 15:52 por El Bruno | 2 comment(s)
Archivado en: ,

Buenas,

ahora que todo el mundo se pone a hacer cosas chulas con Silverlight, se me ocurrió que podía escribir de nuevo un Team System Web Access o un OWA completamente en Silverlight. Eso fundamentalmente porque estoy con mucho tiempo libre ahora que el Valentino se agarró un Ratónvirus (o rotavirus).

Asi que me puse manos a la obra, como explican en http://silverlight.net/GetStarted y mientras trataba de instalar Expression Studio 2.0 en un Windows Server 2003 me encontré con el siguiente error:

Estuve buscando un poco en internet y la supuesta solución parecía ser instalar Windows Installer 3.1 Redistributable (v2); pero después de varios intentos fallidos me dí cuenta que el problema viene por otro lado (uno que no entiendo muy bien, por lo que no me animo a explicarlo).

Si te encuentras con este problema y el Windows Installer 3.1 Refistributable (v2) no soluciona tu problema, deberás instalar Update for Windows Server 2003 Service Pack 1 (KB898715); reiniciar el server y listo !!! a seguir con la instalación de Expression Studio 2.0.

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com

El Bruno Visual Studio Team System

Buenas,

hoy después del nuevo e interesante Internet Explorer 8, toca comentar los pasos para solucionar o aunque sea intertarlo algunos problemas que podemos tener durante la creación de Team Projects en Team Foundation Server.

En este caso le toca al clásico y popular

TFS 30177 Project Creation Failed

Si bien la descripción que nos muestra el error nos puede ayudar, lo mejor es ver el log de instalación. En este caso, el asistente nos lo pone más fácil porque nos da el link de acceso al mismo, asi que lo primero que debemos hacer es abrirlo.

Si bien los archivos de Log suelen ser un poco largos e incómodos para leer, en este si buscamos por la frase [—begin exception entry—] veremos que a partir de la misma, podemos ver el detalle del error.

---begin Exception entry---
Time: 2009-01-23 01:39:34Z
Module: Initializer
Event Description: TF30207: Initialization for plugin "Microsoft.ProjectCreationWizard.Portal" failed
Exception Type: Microsoft.TeamFoundation.Client.PcwException
Exception Message: Unable to connect to the Windows SharePoint Services at Server
Exception Details: The Project Creation Wizard was not able to connect to the Windows SharePoint Services
at madavcaptfs01. The reason for the failed connection cannot be determined at this time. 
Because the connection failed, the wizard was not able to complete creating 
the Windows SharePoint Services site.
Stack Trace:
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.CheckPermissions(ProjectCreationContext ctxt)
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.Initialize(ProjectCreationContext context)
   at Microsoft.VisualStudio.TeamFoundation.EngineStarter.InitializePlugins(MsfTemplate template, PcwPluginCollection pluginCollection)
--   Inner Exception   --
Exception Type: System.Net.WebException
Exception Message: Unable to connect to the remote server
WebException: Status : ConnectFailure
Stack Trace:
   at System.Net.HttpWebRequest.GetRequestStream()
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Microsoft.TeamFoundation.Proxy.Portal.Admin.GetLanguages()
   at Microsoft.VisualStudio.TeamFoundation.WssSiteCreator.CheckPermissions(ProjectCreationContext ctxt)
-- end Inner Exception --
--   Inner Exception   --
Exception Type: System.Net.Sockets.SocketException
Exception Message: No connection could be made because the target machine actively refused it 10.33.178.26:17012
Stack Trace:
   at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)

at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address,

ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)

-- end Inner Exception --
--- end Exception entry ---

En mi caso, el problema inicial era que al migrar a Windows Sharepoint Services 3.0 se cambió el puerto del site de administración de Sharepoint, asi que cambiando el puerto por el correspondiente –> problema solucionado.

O eso pensé, en el 2do intento de creación de un Team Project, me encuentro con el mismo error y a navegar para descubrir el error. Después de varios minutos echando un ojo a todo lo que se mueve, me encuentro con que dentro de la configuración de Sharepoint Services existen varios sites que no están correctamente configurados

lo que ocasiona que Sharepoint fallé al momento de iniciarse. Asi que, solucionado el error, esta vez SI pude crear el team project.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

si utilizas Team System Web Access o si estás pensando en implementarlo dentro de tu infraestructura de desarrollo, es muy aconsejable que le des un vistazo al nuevo White Paper

Este documento realiza un análisis sobre las posibilidades de despliegue de Team System Web Access y además describe los límites de escalabilidad que presenta esta herramienta. Por ejemplo, me he quedado asombrado que no se recomiende a más de 100 usuarios concurrentes por instancia de TSWA, pero me ha gustado las sugerencias y recomendaciones para solucionar problemas de performance en los escenarios de error.

Realmente un documento para darle un vistazo.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

hoy es uno de esos días donde no puedo pensar bien en las comunidades no MS. Tal vez sea percepción mía, pero siempre me parece que los que son anti-microsoft, se creen que su elite es demasiado superior para el resto de los mortales.

Hoy he comprobado esto en una de mis últimas compras de gadget que he realizado, después de ver esta imagen esperaba que esta aplicación no funcione en Internet Explorer porque era demasiado específica,

pero luego me encontré con una muy barata aplicación HTML.

Ya lo dijeron en el 2004, en 1 año Forefox desterraba completamente a Internet Explorer; ¿o fué en el 2005?, ¿o en el 2006?, ¿en el 2007?, ¿en el año pasado …? la verdad que no me acuerdo :D

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

 

Buenas,

el día 3 de febrero Second Nug cumple un año desde su primer evento.

Con motivo del festejo, nuestros amigos de Second NUG habían pensando en hacer un mega evento con invitados de muy alto nivel, futbolistas famosos y gran cantidad de modelos suecas; pero debido a un problema de último momento han tenido que cambiar la agenda y nos han invitado a Eduardo y a mi para que hablemos sobre Enterprise Library.

Afortunadamente, el evento es un webcast por lo que no será necesario que nos soporten vean en vivo; pero también esto nos dará un poco de margen para comentar porqué nos gusta Enterprise Library.

Finalmente quiero comentarles que si bien mostraremos cómo está compuesto EntLib y cómo se utiliza, nuestra idea es comentar y mostrar algunas implementaciones que hemos realizado; y los exitos y fracasos que hemos encontrado en las mismas.

Asi que, con Eduardo y Valentino esperamos “verlos” por allí el próximo 3 de Febrero.

Registro: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032402351&EventCategory=4&culture=es-ES&CountryCode=ES

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

El Bruno Visual Studio Team System

Buenas,

últimamente he abandonado un poco a Team Foundation Server, pero hoy da la casualidad que me he encontrado con uno de esos errores feos de TFS que vale la pena mencionar. En un servidor con TFS 2005, después de ejecutar todos los pasos previos para la actualización a TFS 2008, durante la misma me encontré con el siguiente error:

   1: ---------------------------
   2: Microsoft Visual Studio 2008 Team Foundation Server Setup
   3: ---------------------------
   4: Error 32000.The Commandline 
   5: '"D:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools\TfsDb.exe"  returned non-zero value: 100.
   6: upgrade /server:"Server" 
   7: /property:"TFS_SERVICE_ACCOUNT=NT AUTHORITY\NETWORK SERVICE;
   8: TFS_REPORTING_ACCOUNT=Server\TFSREPORTS;
   9: LCID=1033;VSTF_AS_INSTANCE=Server;VSTF_AS_DATABASE=TFSWarehouse;VSTF_AS_ACCOUNT=" 
  10: /showui:65974'
  11: ---------------------------
  12: Retry   Cancel   
  13: ---------------------------

Lo interesante de este error es que da aproximadamente al final del proceso de actualización de las bases de datos y del cubo de SQL Server a la versión de TFS 2008, y siempre da el Error 32000. Los siguientes pasos pueden ayudar a solventar el error o a comprender un poco más sobre el mismo.

Tutorial

1. Para poder analizar y verificar que sucede, es necesario leer el log de instalación. Este es un archivo de texto plano que se almacena en el directorio temporal del usuario que ejecuta la instalación o upgrade de TFS.

2. Para acceder al directorio temporal, debemos acceder a Start // Run e introducir %temp%. Esto nos abrirá un nuevo Windows Explorer dentro de nuestro directorio temporal.

3. Dentro de este directorio, si ordenamos los archivos por fecha de modificación, podremos ver que el log de instalación es uno de los primeros.

Por lo general el nombre del archivo es VSMsiLog*****.log; donde los **** representan un número con el que se identifica el archivo de log.

4. Abriendo el archivo podemos ver en el mismo, el paso a paso de la instalación y el detalle de la acción que disparó el error. En este caso la ejecución de la sentencia

   1: '"D:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools\TfsDb.exe" upgrade /server:"Server" /property:"TFS_SERVICE_ACCOUNT=NT AUTHORITY\NETWORK SERVICE;TFS_REPORTING_ACCOUNT=Server\TFSREPORTS;LCID=1033;VSTF_AS_INSTANCE=Server;VSTF_AS_DATABASE=TFSWarehouse;VSTF_AS_ACCOUNT="

Dispara un error, pero no tenemos mucha más información sobre el mismo.

5. Para obtener más información, desde una ventana de comandos ejecutaremos la sentencia que nos dió el error y podremos ver en la misma, los pasos que sigue el proceso de actualización, con el detalle del error inclusive.

   1: [05:06:46.166] .
   2: [05:06:46.166] Errors in the metadata manager. An error occurred when instantiating a metadata object from the file, '\\?\D:\Program Files\Microsoft SQL Server\MSSQL.2\OLAP\Data\TFSWarehouse.0.db\Team System.2226.cub.xml'.
   3: [05:06:46.385] 5
   4: [05:06:46.385] D:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools\SetupWarehouse.exe 5 8875
   5: [05:06:46.416] Microsoft.TeamFoundation.DatabaseInstaller.DatabaseException: D:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools\SetupWarehouse.exe 5 8875 
   6:   at Microsoft.TeamFoundation.DatabaseInstaller.ProcessDeployer.ExecuteCommand(
   7: String filePath, String arguments, Boolean continueOnError)
   8: Microsoft.TeamFoundation.DatabaseInstaller.DatabaseException: 
   9: D:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools\SetupWarehouse.exe 5 8875 
  10:  at Microsoft.TeamFoundation.DatabaseInstaller.ProcessDeployer.ExecuteCommand(
  11: String filePath, String arguments, Boolean continueOnError) 
  12:  at Microsoft.TeamFoundation.DatabaseInstaller.Installer.RunDbActions(InstallerMode mode, String server, Boolean preview)
  13:  at Microsoft.TeamFoundation.DatabaseInstaller.Installer.RunSteps(InstallerMode mode, String server, IPropertyCollection properties, Boolean preview)
  14:    at Microsoft.TeamFoundation.DatabaseInstaller.Installer.Upgrade(String server
  15: , IPropertyCollection properties, Boolean preview)
  16:    at Microsoft.TeamFoundation.DatabaseInstaller.CommandLine.Commands.CommandUpgrade.OnRun()
  17:    at Microsoft.TeamFoundation.DatabaseInstaller.CommandLine.Commands.InstallerCommand.Run()
  18:    at Microsoft.TeamFoundation.DatabaseInstaller.CommandLine.CommandLine.RunCommand(String[] args)
  19:  
  20: D:\Program Files\Microsoft Visual Studio 2008 Team Foundation Server\Tools\Setup
  21: Warehouse.exe 5 8875

6. En este caso el error se dispara en la actualización de la base de datos de DataWarehouse ya que en la misma el archivo 

[\\?\D:\Program Files\Microsoft SQL Server\MSSQL.2\OLAP\Data\TFSWarehouse.0.db\Team System.2226.cub.xml] posee un error de formado de xml.

7. Esto lo puedo comprobar abriendo el archivo y verificando el mismo con Internet Explorer o con otra herramienta para validar documentos Xml.

8. No es parte de este pequeño paso a paso explicar como funcionan los catálogos de Análysis Services, pero para este caso he eliminado este archivo ya que el catálogo estaba mal configurado.

9. Desde la línea de comandos he ejecutado nuevamente la sentencia y afortunadamente todo funciona correctamente

10. Pues bien, en este momento ya podemos repetir el proceso de actualización con este error solucionado.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

ya que por unos días estoy abandonando Team System espero que sean pocos días, toca recopilar las noticias que son de interés general, aunque con un aire un poco más friki. Por ejemplo comentar que existe una nueva versión de la librería que creó Brian Peek para interactuar con un WiiMote utilizando código .Net.

Se trata de la versión 1.7.0.0 y pueden leer la noticia completa en http://www.brianpeek.com/blog/archive/2009/01/19/wiimotelib-v1-7-released.aspx

La versión 1.7.0.0 incluye:

  • Los tiempos de espera antes de continuar se han rediseñado para lograr una mejor performance. Esto permite eliminar las clásicas llamadas Thread.Sleep()
  • Soporte para Guitar Hero: World Tour Guitar y Drums ahora se pueden reconocer y utilizar,
  • Guitar whammy bar es ahora un valor de 5-bit en lugar de of 4-bit
  • El proyecto para Microsoft Robotics Developer Studio se ha actualizado a la versión 2008.

Saludos @ La Finca

El Bruno


Quote of the day:
The nice thing about egotists is that they don't talk about other people. - Lucille S. Harper
Crossposting from ElBruno.com

Publicado 21/1/2009 19:33 por El Bruno | con no comments
Archivado en: ,

Buenas,

el próximo día 22 de enero de 19:00 a 21:00 en Microsoft en Madrid, organizaremos las primeras mesas redondas para tocar temas de desarrollo.

El link de inscripción lo pueden encontrar en

http://madriddotnet.spaces.live.com/blog/cns!6453107D41F04C68!199.entry?wa=wsignin1.0&sa=437349760

y espero vernos por allí para compartir un poco de nuestro día a día.

Un detalle, si nuevamente hay previsión de nieve, hay que tener cuidado porque nos podemos encontrar a La Finca como la siguiente foto:

 

Lo mejor es ir preparado para el frio y con las cadenas, como hace Valentino:

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com

Publicado 20/1/2009 13:15 por El Bruno | 6 comment(s)
Archivado en:

Buenas,

hace un par de días se ha liberado una extension para Team System Web Access 2008 que se puede descargar desde

http://www.microsoft.com/downloads/details.aspx?FamilyId=3ECD00BA-972B-4120-A8D5-3D38311893DE 

y en la que podremos encontrar las siguientes características:

Nuevo con Service Pack 1


Características de Team System Web Access

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

desde hace unos meses el equipo de producto de TFS ha estado trabajando con la gente de HP Quality Center para desarrollar un conector entre nuestro querido TFS y la version 9.2 de Quality Center. Este conector permite sincronizar defectos y otros elementos entre ambas plataformas de una manera sencilla ya que aprovecha al no tan sencillo TFS Synchronization Toolkit.

El mismo se puede descargar desde

y permite entre otras cosas:

  • Sincronizar defectos de Quality Center 9.2 Defects con Bugs de TFS 2008
  • Realizar mapeos entre los valores de las enumeraciones de los elementos (por ejemplo, prioridad, severidad)
  • Sincronizar attachments
  • Sincronizar links entre otros bugs / defectos (cool !!!)

Seguramente alguno estará pensando que puse a prueba la cantidad de café que hay que tomar para comenzar a mezclar productos; pero si no lo conocen les aconsejo que le den un vistazo no solo a HP Quality Center; sino a toda la familia de productos para la gestión de incidencias, testing, servidor de compilación, etc. que posee HP porque realmente son productos muy buenos.

Es por eso que, para proyectos en curso, o para entornos realmente grandes saber que existe un conector y no tener que codificarlo a mano es una buena noticia.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

hace unos días escribí un post con una macro para mover las confirmaciones de lectura a un directorio específico, y en un comentario Iker preguntaba como averiguar los valores de las propiedades EntryID y StoreID de los directorios de Outlook.

Pues una vez más una macro para listar todos estos valores.

   1:  Public Function DisplayInformation() As Outlook.Folder
   2:   
   3:      Dim outApp As Outlook.Application
   4:      Set outApp = CreateObject("outlook.application")
   5:      DisplayFolderInformation 0, outApp.GetNamespace("MAPI").Folders
   6:      Set outApp = Nothing
   7:   
   8:  End Function
   9:   
  10:  Sub DisplayFolderInformation(level As Integer, searchFolders As Outlook.Folders)
  11:   
  12:      Dim searchFolder As Outlook.MAPIFolder
  13:      
  14:      ' iterate trough subfolders and display folder information
  15:      For Each searchFolder In searchFolders
  16:          Debug.Print Space(level) & "+" & searchFolder.Name & " - EntryID [" & searchFolder.entryID & "] StoreID [" & searchFolder.StoreID & "]"
  17:          DisplayFolderInformation level + 1, searchFolder.Folders
  18:      Next
  19:   
  20:      Set searchFolder = Nothing
  21:   
  22:  End Sub

Lo único que recomiendo tener en cuenta es que si trabajas con Public Folders de Exchange o tienes sincronizado tu Outlook con servidores como hotmail, el recuperar estos valores puede ser un poco lento.

Este puede ser una muestra del resultado de la macro

+brunocapuano@msn.com - EntryID [000000006D2711B0376D1C48896F97400AA799C00100D9539C2261A6BB45B9DAB62C7081B3C101002000FFFF0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Deleted Items - EntryID [000000006D2711B0376D1C48896F97400AA799C00100D9539C2261A6BB45B9DAB62C7081B3C101002100FFFF0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Inbox - EntryID [000000006D2711B0376D1C48896F97400AA799C00100D9539C2261A6BB45B9DAB62C7081B3C101002200FFFF0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Outbox - EntryID [000000006D2711B0376D1C48896F97400AA799C00100D9539C2261A6BB45B9DAB62C7081B3C101002300FFFF0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Sent Items - EntryID [000000006D2711B0376D1C48896F97400AA799C00100D9539C2261A6BB45B9DAB62C7081B3C101002400FFFF0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Calendario de Bruno - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002000000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Contacts - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002010000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Journal - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002020000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Notes - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002030000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Tasks - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002040000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Drafts - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002050000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Junk E-mail - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002060000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Sync Issues - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002080000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
  +Local Failures - EntryID [000000006D2711B0376D1C48896F97400AA799C001000F8B3034CE3B7B40A71A36B0F97E6C900000000002090000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
 +Días festivos de España - EntryID [000000006D2711B0376D1C48896F97400AA799C0010034AD76187591974DBF6C4F76951C873A0100010000000000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C200006D736E636F6E2E646C6C0000000000000000E92FEB759650448683B87DE522AA494800433A5C55736572735C622E63617075616E6F2E4156414E4144452D434F52505C417070446174615C4C6F63616C5C4D6963726F736F66745C4F75746C6F6F6B5C6272756E6F63617075616E6F5F6D736E2E6F737400]
+Carpetas públicas - EntryID [000000001A447390AA6611CD9BC800AA002FC45A0300C0B86B30DBD611CEB31700AA00574CC60000000000010000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
 +Favorites - EntryID [000000001A447390AA6611CD9BC800AA002FC45A0300C0B86B30DBD611CEB31700AA00574CC60000000000020000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
 +All Public Folders - EntryID [000000001A447390AA6611CD9BC800AA002FC45A0300C0B86B30DBD611CEB31700AA00574CC60000000000030000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
  +Communities - EntryID [000000001A447390AA6611CD9BC800AA002FC45A0300A25FFB490F43E640920CB461A0308372000000804F9C0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
   +DG - .NET - EntryID [000000001A447390AA6611CD9BC800AA002FC45A0300A25FFB490F43E640920CB461A030837200000081B5830000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
   +DG - .Net Beginners - EntryID [000000001A447390AA6611CD9BC800AA002FC45A03000E5D3CFE7FC7504B83CA5893F42B35D0000007D0EC7A0000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
   +DG - .NET CLR Compilers - EntryID [000000001A447390AA6611CD9BC800AA002FC45A03000E5D3CFE7FC7504B83CA5893F42B35D0000001EA0DE30000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]
   +DG - .NET Compact Framework - EntryID [000000001A447390AA6611CD9BC800AA002FC45A03000E5D3CFE7FC7504B83CA5893F42B35D0000001B1DEB90000] StoreID [0000000038A1BB1005E5101AA1BB08002B2A56C20000454D534D44422E444C4C00000000000000001C830210AA6611CD9BC800AA002FC45A060000004D41494C3200]

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Publicado 13/1/2009 17:26 por El Bruno | con no comments

Buenas,

aquellos que trabajan conmigo saben que soy bastante molesto con los correos electrónicos ya que siempre los envío con confirmación de envío y de lectura. Esto que molesta bastante, personalmente me permite (cuando el destinatario lo permite) tener un seguimiento de mis correos.

El problema con este tipo de trabajo es que cuando trabajas con listas grandes de entrega, puedes llegar a tener en un mismo día cerca de 6000 confirmaciones de lectura (caso típico en la comunidades de Avanade, donde hay cerca de 6000 personas inscriptas).

Es por esto que esta pequeña macro me permite mover las confirmaciones de lectura de una forma automática a una carpeta personalizada.

 

   1:  Public Sub MoveReadItemsToFolder()
   2:   
   3:      Dim outApp As Outlook.Application
   4:      Dim inboxFolder As Outlook.MAPIFolder
   5:      Dim readFolder As Outlook.MAPIFolder
   6:      Dim colFolders As Outlook.Folders
   7:      Dim inboxItem As Object
   8:      Dim mailItem As Outlook.mailItem
   9:      Dim entryID As String
  10:      Dim movedCount As Integer
  11:      
  12:      Set outApp = CreateObject("outlook.application")
  13:      Set colFolders = outApp.GetNamespace("MAPI").Folders
  14:      Set inboxFolder = outApp.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
  15:      Set readFolder = outApp.GetNamespace("MAPI").GetFolderFromID("000000003DF78CBAA12BFC409EBC02451E577D88A2830000")
  16:      
  17:      For Each inboxItem In inboxFolder.Items
  18:          Dim messageClass As String
  19:          messageClass = LCase(inboxItem.messageClass)
  20:          If messageClass = "report.ipm.note.dr" Or _
  21:              messageClass = "report.ipm.note.ipnrn" Or _
  22:              messageClass = "report.ipm.schedule.meeting.resp.pos.dr" Or _
  23:              messageClass = "report.ipm.schedule.meeting.resp.tent.dr" Or _
  24:              messageClass = "report.ipm.note.ipnnrn" Or _
  25:              messageClass = "report.ipm.note.expanded.dr" Then
  26:              
  27:              ' move to read folder
  28:              inboxItem.Move readFolder
  29:              movedCount = movedCount + 1
  30:              
  31:          End If
  32:      Next
  33:      
  34:      Set inboxItem = Nothing
  35:      Set inboxFolder = Nothing
  36:      Set readFolder = Nothing
  37:      Set colFolders = Nothing
  38:      Set outApp = Nothing
  39:      
  40:      MsgBox "Se han movido [" & movedCount & "] elementos a la carpeta [Leidos]"
  41:      
  42:  End Sub

Estos son los pasos para agregar esta macro en Outlook

1. Presionar Alt+F11 y dentro del editor de Macros pegar el código de la Macro (con el ID de la carpeta a la que se quieren mover los elementos)

2. Una vez agregada la macro, podemos agregar un boton en Outlook que nos permita invocar a la macro directamente.

3. Dentro de la barra de herramientas de Outlook, desplegamos el menú contextual y seleccionamos la opción [Customize]

4. Dentro del formulario de personalización seleccionamos la pestaña [Commands] y el submenú [Macros].

5. Seleccionamos la macro y la arrastramos el botón correspondiente de nuestra macro a la toolbar.

6. En este punto tenemos el boton configurado; pero sin embargo es un poco incómodo el texto con el que ha quedado. Para modificarlo, sobre el boton desplegamos el menú contextual y modificamos la propiedad [Name] del mismo

 

7. Done !!!

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Publicado 11/1/2009 20:35 por El Bruno | 6 comment(s)
Archivado en:

Buenas,

lo siento, tengo instalado Windows 7 desde hace un par de días y estoy muy contento con él.

Mi Visual Studio 2008, SQL Server 2008, Office, máquinas virtuales y demás van muy bien, pero he visto esta tira y no me resistí a postearla (un poco ácida, pero un humor del bueno)

windows_7[1]

Fuente: http://xkcd.com/528/

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com
Publicado 11/1/2009 0:12 por El Bruno | 4 comment(s)
Archivado en: ,

Buenas

sigo trabajando y probando el nuevo UI Automation en la máquina virtual de Visual Studio Team System 2010, y he querido sacarme una espina que tenia desde hace tiempo cuando he probado otros framework para la automatización de pruebas de UI: la interaccion con Windows Explorer.

Si alguna vez has tratado de interactuar con el Explorer, sabrás que los controles internos que posee (treeview, listview, etc) son un poco particulares y da bastante trabajo trabajar con los mismos.

He pensado la siguiente prueba unitaria donde a partir de un directorio y un nombre de archivo, creo un nuevo archivo de texto en desde Windows Explorer y luego valido si se ha creado este archivo.

Como se puede ver en el siguiente ejemplo, la prueba queda muy simple.

   1:  [TestMethod]
   2:  public void ExplorerTest()
   3:  {
   4:    string folderPath = @"C:\temp";
   5:    string documentName = @"demo.txt";
   6:   
   7:    // delete document if exists
   8:    if(File.Exists(Path.Combine(folderPath, documentName)))
   9:      File.Delete(Path.Combine(folderPath, documentName));
  10:   
  11:    // create document through windows explorer
  12:    RecordedMethods.TestExplorer(folderPath, documentName);
  13:   
  14:    // validate if the document was created
  15:    Assert.IsTrue(File.Exists(Path.Combine(folderPath, documentName)));
  16:  }

 

Pero lo que no es tan simple es el código del UI Automation. En primer lugar hay que identificar una instancia de Windows Explorer y como el caption no es estático, hay que recurrir a algún método alternativo (que todavía no encontré). Luego identificar la barra de direcciones y escribir en la misma la ubicación a la que queremos acceder. Finalmente desplegar el menú contextual y seleccionar la opción de crear un nuevo documento de texto.

   1:      public static void TestExplorer(string folderPath, string documentName)
   2:      {
   3:        // Click 'Computer' title bar
   4:        UITestControl computerWindow = new UITestControl();
   5:        computerWindow.FrameworkName = "MSAA";
   6:        computerWindow.PrimarySearchProperties.Add("Name", "Computer");
   7:        computerWindow.PrimarySearchProperties.Add("ClassName", "CabinetWClass");
   8:        computerWindow.SearchScope = SearchScope.VisibleOnly;
   9:        computerWindow.Find();
  10:   
  11:        // Click 'Address: ' in the tool bar
  12:        UITestControl addressComputerWindow = new UITestControl(computerWindow);
  13:        addressComputerWindow.FrameworkName = "MSAA";
  14:        addressComputerWindow.PrimarySearchProperties.Add("ControlId", "1001");
  15:        addressComputerWindow.SearchScope = SearchScope.VisibleOnly;
  16:        addressComputerWindow.Find();
  17:   
  18:        // Type folderPath in 'Address' text box
  19:        UITestControl addressWindow1 = new UITestControl(computerWindow);
  20:        addressWindow1.FrameworkName = "MSAA";
  21:        addressWindow1.PrimarySearchProperties.Add("ControlId", "41477");
  22:        addressWindow1.PrimarySearchProperties.Add("Instance", "4");
  23:        addressWindow1.Find();
  24:        WinEdit addressEdit = new WinEdit(addressWindow1);
  25:        addressEdit.PrimarySearchProperties.Add("Name", "Address");
  26:        addressEdit.SearchScope = SearchScope.VisibleOnly;
  27:        addressEdit.Find();
  28:        addressEdit.SendKeys(folderPath);
  29:   
  30:        // Type '{Enter}' in 'Address' text box
  31:        addressEdit.SendKeys("{Enter}");
  32:        
  33:   
  34:        // Right-click 'Unknown Name' list box
  35:        UITestControl folderViewWindow = new UITestControl(computerWindow);
  36:  folderViewWindow.FrameworkName = "MSAA";
  37:        folderViewWindow.PrimarySearchProperties.Add("ControlId", "1");
  38:        folderViewWindow.SearchScope = SearchScope.VisibleOnly;
  39:        folderViewWindow.Find();
  40:        
  41:        WinList itemList = new WinList(folderViewWindow);
  42:        itemList.PrimarySearchProperties.Add("ClassName", "SysListView32");
  43:        itemList.SearchScope = SearchScope.VisibleOnly;
  44:        itemList.Find();
  45:        itemList.Click(MouseButtons.Right, ModifierKeys.None, new Point(53, 248));
  46:   
  47:        // Click 'New' -> 'Text Document' menu item
  48:        UITestControl contextPopupMenu = new UITestControl();
  49:        contextPopupMenu.FrameworkName = "MSAA";
  50:        contextPopupMenu.PrimarySearchProperties.Add("AccessibleName", "Context");
  51:        contextPopupMenu.PrimarySearchProperties.Add("Role", "popup menu");
  52:        contextPopupMenu.SearchScope = SearchScope.VisibleOnly;
  53:        contextPopupMenu.ExpandWhileSearching = true;
  54:        contextPopupMenu.Find();
  55:        UITestControl newMenuItem = new UITestControl(contextPopupMenu);
  56:        newMenuItem.FrameworkName = "MSAA";
  57:        newMenuItem.PrimarySearchProperties.Add("Name", "New");
  58:        newMenuItem.PrimarySearchProperties.Add("Role", "menu item");
  59:        newMenuItem.ExpandWhileSearching = true;
  60:        newMenuItem.Find();
  61:        WinMenuItem textDocumentMenuItem = new WinMenuItem(newMenuItem);
  62:        textDocumentMenuItem.PrimarySearchProperties.Add("Name", "Text Document");
  63:        textDocumentMenuItem.ExpandWhileSearching = true;
  64:        textDocumentMenuItem.Find();
  65:        textDocumentMenuItem.Click();
  66:   
  67:        // Type document name in 'New Document' inline text box
  68:        UITestControl folderViewWindow1 = new UITestControl(computerWindow);
  69:        folderViewWindow1.FrameworkName = "MSAA";
  70:        folderViewWindow1.PrimarySearchProperties.Add("Role", "window");
  71:        folderViewWindow1.PrimarySearchProperties.Add("ClassName", "SysListView32");
  72:        folderViewWindow1.SearchScope = SearchScope.VisibleOnly;
  73:        folderViewWindow1.Find();
  74:        WinEdit itemEdit = new WinEdit(folderViewWindow1);
  75:        itemEdit.PrimarySearchProperties.Add("ClassName", "Edit");
  76:        itemEdit.SearchScope = SearchScope.VisibleOnly;
  77:        itemEdit.Find();
  78:        itemEdit.Value = documentName;
  79:   
  80:        // Type '{Enter}' to set the value
  81:        itemEdit.SendKeys("{Enter}");
  82:      }

 

Una vez más el video correspondiente.


Video: VSTS2010 CodedUITest Explorer Code Demo

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

si trabajas en un entorno donde se utilice Microsoft Visual Studio 2008 y Team Foundation Server 2008, seguramente utilizas la última versión de las Power Tools: Visual Studio Team System 2008 Team Foundation Server Power Tools - October 2008 Release.

Si además utilizas Microsoft Office Communicator 2007 o Live Messenger, seguramente has comprobado que la integración que se realiza con el Team Explorer para los grupos de trabajo es muy buena (Jesús lo explica muy bien en español aquí), pero en determinadas ocasiones puede bloquear el IDE de Visual Studio.

En un foro interno de MS, desde hace unos días estamos comentando este tema y la gente de MS nos ha ofrecido un par de opciones para eliminar la integración con alguno de los sistemas de mensajería.

1. Deshabilitar la opción de integración en el IDE de Visual Studio, a través del menú Tools // Options // Team Foundation Server Power Tools // General, cambiando el valor de [Team Members] a [False]. Esta opción no elimina el nodo “Team Members” del Team Explorer, pero el nodo queda deshabilitado y no realiza ninguna acción.

Esta opción es la recomendada, pero sin embargo al momento de inicializar el panel del Team Explorer, algunas validaciones y acciones de integración se realizan en Visual Studio.

2. Si quieres ser más agresivo, existe otra opción que directamente elimina toda la integración modificando el registro de windows. Para esto tienes que navegar hasta HKCU\Software\Microsoft\VisualStudio\9.0\TeamFoundation\PowerTools y agregar una nueva cadena llamada [TeamTrackerHidden] y setear su valor a [True].

Esta opcion define que explicitamente no se cargue el plugin de Team Members. De esta forma este plugin no ejecuta ninguna acción y podremos ver que en el Team Explorer el nodo Team Members aparece con una pequeña X roja.

Muchas gracias a Bill Essary @ Microsoft por la solución a estos problemas.

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com

Buenas,

después de un par de posts sobre las CodedUITests, o pruebas para interfaz de usuario incluidas en Visual Studio Team System 2010, algunos compañeros me han dicho que no entendían nada de nada si podía explicar un poco en detalle una prueba en concreto.

Es por esto que las siguientes 36 líneas sorprenderán por su belleza sintáxica.

  1:     public static void CalculatorProductTest(int firstArgument, int secondArgument)
  2:     {
  3:       // Get Calculator Window
  4:       UITestControl calculatorWindow = new UITestControl();
  5:       calculatorWindow.FrameworkName = "MSAA";
  6:       calculatorWindow.PrimarySearchProperties.Add("Name", "Calculator");
  7:       calculatorWindow.PrimarySearchProperties.Add("ClassName", "SciCalc");
  8:       calculatorWindow.SearchScope = SearchScope.VisibleOnly;
  9:       calculatorWindow.Find();
 10: 
 11:       // get value textbox control
 12:       WinEdit valueTextBox = new WinEdit(calculatorWindow);
 13:       valueTextBox.PrimarySearchProperties.Add("ClassName", "Edit");
 14:       valueTextBox.SearchScope = SearchScope.VisibleOnly;
 15:       valueTextBox.Find();
 16: 
 17:       // Type first argument value in 'Calculator' custom control
 18:       valueTextBox.Value = firstArgument.ToString(); 
 19: 
 20:       // Click '*' button
 21:       WinButton productButton = new WinButton(calculatorWindow);
 22:       productButton.PrimarySearchProperties.Add("Name", "*");
 23:       productButton.SearchScope = SearchScope.VisibleOnly;
 24:       productButton.Find();
 25:       productButton.Click();
 26: 
 27:       // Type second argument value in text box
 28:       valueTextBox.Value = secondArgument.ToString(); 
 29: 
 30:       // Click '=' button
 31:       WinButton equalButton1 = new WinButton(calculatorWindow);
 32:       equalButton1.PrimarySearchProperties.Add("Name", "=");
 33:       equalButton1.SearchScope = SearchScope.VisibleOnly;
 34:       equalButton1.Find();
 35:       equalButton1.Click();
 36:     }

Como se puede apreciar la función estática CalculatorProductTest(), recibe dos parámetros e implementa el siguiente funcionamiento:

  1. Líneas 3 a 9, búsqueda de la calculadora.
    Para esto se busca por el título de la aplicación “Calculator” y por el ClassName que retorna el Handle de la window (este tipo de trabajo, con handles de Windows y cosillas complicadas, nos ponen palotes como dice mi amigo Edu)
    Una vez encontrada la ventana de la calculadora comenzamos a trabajar con un objeto del tipo UITestControl llamado calculatorWindow. Debería agregar una pequeña validación por si no existe, pero como en mi máquina funciona, he pasado de la misma.
  2. Líneas 12 a 15, ubicar la caja de texto de la calculadora.
    Una vez ubicada se asigna la misma a una variable del tipo WinEdit llamada valueTextBox.
  3. Línea 18, asignar el valor del primer argumento.
  4. Líneas 21 a 25, ubicar el botón de multiplicación [*] y presionar el mismo.
    Una vez ubicado se asigna el mismo a una variable del tipo WinButton llamada productButton. y se invoca el Click().
  5. Línea 28, asignar el valor del segundo argumento.
  6. Líneas 31 a 35, ubicar el botón de resultado [=] y presionar el mismo.
    Una vez ubicado se asigna el mismo a una variable del tipo WinButton llamada equalButton. y se invoca el Click().

De esta forma, teniendo la base de una función que interactua con la calculadora, puedo comenzar a crear pequeñas clases con funcionalidades aisladas e ir implementando mis pruebas de una forma ordenada. Por ejemplo:

  1:     [TestMethod]
  2:     public void ProductTestA()
  3:     {
  4:       RecordedMethods.CalculatorProductTest(22, 2);
  5:       Assert.AreEqual(uiMap.CalculatorWindow.ItemWindow.ItemEdit.Value, "44. ");
  6: 
  7:       RecordedMethods.CalculatorProductTest(2, 2);
  8:       Assert.AreNotEqual(uiMap.CalculatorWindow.ItemWindow.ItemEdit.Value, "Valentino");
  9:     }

Además recomiendo echarle un vistazo a los documentos que se pueden descargar desde

y finalmente, ver para creer. En el siguente video se puede ver como cuando se lanza la prueba sin tener la calculadora en ejecución la misma dispara una excepción (tarda un rato). Luego con la calculadora en ejecución se automatizan las acciones de un usuario y se contrasta con el resultado de las mismas.


Video: VSTS2010 CodedUITest Calculator Code Demo

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com

Buenas,

siguiendo el hilo del post que escribí ayer sobre la automatización de pruebas de UI, queda pendiente comentar que además de la capacidad para interceptar y crear manualmente los tests queremos ejecutar como pruebas unitarias, tenemos la posibilidad de utilizar una aplicación que nos “graba una sesión” de ejecución y luego permite invocar a la misma.

Podemos invocar a esta aplicación de grabación de secuencias, desde la selección inicial de tipo de test, o desde el código directamente. En el siguiente tutorial utilizaré la 2da opción y la Calculadora de Windows para invocar a la acción del producto de 2 números.

Tutorial

1. Dentro de un test en una clase de tipo CodedUI, desplegamos el menú contextual y seleccionamos la opción Edit CodedUITest // Record and Generate Code.

2. La acción anterior nos abrirá una nueva aplicación llamada Test Recorder, que podremos ver que por defecto no obtiene foco, pero se encarga de llevar el registro de las acciones que realicemos. En la siguiente imagen la podemos ver junto con la calculadora y además podemos ver como la calculadora está siendo “interceptada” por esta aplicación (el pequeño ícono en la barra de título de la calculadora)

3. He seguido los siguientes pasos para simular un producto

- Click en la calculadora para dar foco a la misma

- Click en la casilla de texto de la calculadora

- Introducir el valor “11”

- Presionar la tecla “*”

- Introducir el valor “3”

- Presionar la tecla “=”

El grabador de pasos ha grabado la siguiente secuencia

4. Una vez generada la secuencia de pasos, podemos generar el código para ejecutar la misma presionando el botón [Generate Code]. En este momento debemos definir el nombre de la función donde se crearán los pasos que hemos ejecutado.

5. Finalmente podemos agregar un punto de validación presionando el boton [Add Validation]. Esta acción nos abrirá la aplicación de intercepción de controles que publiqué en este post y podremos interceptar el valor de uno o más controles.

6. Volviendo a Visual Studio podemos ver que en el proyecto de Test se ha agregado una nueva clase llamada “RecordedMethods” donde se ha creado una nueva función estática que se encarga de ejecutar los pasos del test que hemos grabado.

El código de esta clase, no es muy complejo pero si bastante extenso. Si alguien quiere echarle un vistazo puede descargarse el archivo .cs desde aquí.

7. Finalmente para ejecutar nuestra prueba, dentro del Unit Test uinvocamos a la función RecordedMethods.CalcProductTest() para ejecutar los pasos que hemos grabado, y luego obtenemos el valor de la caja de texto para validar el mismo.

8. Como no todo son ejemplos simples, en este caso si ejecutamos la prueba unitaria la misma nos devuelve un error. Ya que en la calculadora de Windows todos los valores siempre llevan el separador de decimales después del valor introducido (y mi validación en este caso es 11 x 22 = 242)

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com

Buenas

hace unos meses en un número de MSDN Magazine se presentó una biblioteca de clases que permitían crear pruebas unitarias para aplicaciones windows: Microsoft UI Automation Library. El amigo Rodrigo Corral, nos describió un poco el funcionamiento de este set de clases para poder utilizarlas en nuestros proyectos; pero si has intentado hacer algo un poco más complicado que un “Hola Mundo” seguramente has comprendido que este proyecto promete mucho, pero todavía requiere un nivel de madurez un poco mayor para ser práctico.

Por suerte Visual Studio Team System 2010 soluciona este problema integrando este y otros frameworks de prueba dentro del IDE de desarrollo y ejecución de Visual Studio. En particular para afrontar este tipo de escenarios se han creado los llamados Coded UI Tests. Que son un nuevo tipo de elemento que se puede crear en un proyecto de tipo Test.

El siguiente tutorial muestra una serie de pasos para crear un proyecto de Test y agregar una prueba para una aplicación Windows.

Tutorial

1. Para este ejemplo partimos de una aplicación Windows que a partir de 2 cajas de texto, suma los valores de las mismas en una tercera cuando se cambian los valores.

2. Para probar desde un test en Visual Studio la funcionalidad de esta aplicación utilizando una prueba unitaria; dentro de un proyecto de Test agregaremos un nuevo elemento de tipo CodedUITest como muestra la siguiente imagen

3. Lo siguiente que nos llama la atención es que antes de crear la clase de test, se require con que mecanismo crearemos nuestro test. La siguiente imagen muestra las opciones disponibles y para este ejemplo seleccionaremos “Use the UI Control Locator

4. La acción anterior lanza una aplicación que nos permite obtener los controles que posee una aplicación utilizando Drag & Drop y a partir de la misma podemos obtener todos los controles que necesitamos para la prueba. En nuestro ejemplo, obtenemos las 3 cajas de texto.

Además de obtener los controles, podemos organizar los mismos jerárquicamente en el árbol de la izquierda y definir como queremos acceder a los mismos.

5. Una vez obtenidos los controles, es necesario que definamos a que propiedades de los controles queremos acceder en tiempo de ejecución para trabajar con las mismas.

6. Presionamos el boton “Generate Code” y podremos ver como se genera el codigo necesario para acceder a la aplicación y trabajar con la misma.

7. Modificando el código generado, puedo crear rápidamente un test que pruebe si mi aplicación “sabe como sumar 2 números”. El codigo queda como en el siguiente ejemplo:

8. Finalmente podemos ejecutar nuestra prueba unitaria (con la aplicación en ejecución) y veremos como se intercepta la misma y se ejecuta el codigo que hemos definido. En este caso la prueba es correcta :D

 

Si bien el ejemplo es simpre, creo que la mayor virtud de este tipo de pruebas es que aprovechan todo el entorno y funcionalidades ya incluidas en Visual Studio y su integración es 100% fiable (o eso esperamos para el RTM). En los próximos posts mostraré otras formas de formas de crear pruebas de UI desde Visual Studio 2010.

 

Saludos @ Home

El Bruno

Crossposting from ElBruno.com

Buenas,

ahora que ya han pasado las fiestas, toca comenzar a digerir de a poco todo lo que trae este 2009. Es por eso que en MadridDotNet queremos comenzar el año de una forma Light dejando que cada uno elija que evento quiere ver dentro de unos días.

En el siguiente link http://madriddotnet.spaces.live.com/blog/cns!6453107D41F04C68!188 puedes ver las opciones que tenemos para enero y dejar en un comentario con tu preferencia.

Muchas gracias por los aportes y nos vemos en unas semanas.

 

Saludos @ La Finca

El Bruno

Crossposting from ElBruno.com
Publicado 5/1/2009 10:28 por El Bruno | con no comments
Archivado en:
Más artículos Página siguiente >