Resumen de la Mesa redonda de TDD con Cartuja .NET

Ayer desde Cartuja .Net hicimos una mesa redonda sobre TDD y la conversación fue muy, pero que muy ilustradora sobre todo para mí.

Aquí mi resumen:

Tras hablar sobre las últimas novedades que habían aparecido en la comunidad .NET tras las presentaciones de #vsconnect y conseguir centrarnos, comenzamos con una explicación sobre qué es TDD muy corta, apenas 30 segundos:

"TDD consiste en que cuando vamos a escribir código, hacer primero un test que falle para el código que queremos escribir, luego el mínimo código que hace que el test se ponga verde, y refactorizar el código que hemos escrito"

Seguimos con la duda que yo tengo sobre ese ciclo, y es que, como ya comenté en otro post, el ciclo es incompleto, falta una primera fase de "pensar" antes incluso de escribir ese primer test.

Es decir, tomar muchas veces papel y lápiz, y dibujar la "arquitectura" que creemos debe ser. Una vez que tenemos separadas las responsabilidades que el sistema debe tener, cogemos una de esas clases y podemos empezar a aplicar TDD sobre esa clase.

Suele ocurrir que al escribir ese test y escribir el código se encuentran dependencias que antes no se habían tenido en cuenta. Es decir, responsabilidades ocultas y suele generar en otra clase que tendremos que mockear para poder seguir avanzando en el ciclo de TDD y avanzando en el nuestro trabajo.

Y aquí llego la primera disputa sobre el concepto de que "la arquitectura emerge". Tras un rato de dialogo sobre eso, saqué la conclusión de que esa arquitectura que emerge no es la arquitectura del sistema completo, sino la arquitectura del contexto en el que está centrado ese test.

Mi conclusión particular sobre este punto, es que aplicando TDD nos obligamos a pensar en responsabilidades, nos obligamos a seguir el principio de una única responsabilidad y esto, paso a paso, test a test, nos ayuda a averiguar si aquella arquitectura que teníamos en la cabeza, que dibujamos con papel y lápiz en un primer momento es adecuada o no. Como corolario podemos decir que si nos resulta difícil seguir avanzando en ciclos cortos de test-code-refactor, hay que replantearse esa arquitectura ya que parece que esa elección no es adecuada, y eso es bueno, ya que al menos hemos encontrado una forma de no hacerlo.

Tras unas cuantas experiencias que compartimos, buenas y malas, continuamos con la conversación sobre las bonanzas del testing, integración continua, TFS, Team City, programación defensiva, y un largo etcétera. Todos estamos de acuerdo sobre las ventajas, sabemos que es bueno hacer test. Hasta que alguien nos hizo caer en la cuenta de que desde hacía un buen rato no estábamos hablando sobre TDD sino de testing. Así que recondujimos la conversación con el tema de la práctica y la maestría.

Obviamente no es lo mismo empezar a aplicar TDD que llevar tiempo aplicándola. La famosa curva de aprendizaje es en realidad así:

Tenemos un nivel de productividad (verde) y cuando empezamos hay una bajada de productividad importante y empezamos el camino de la práctica hasta que volvemos a alcanzar el mismo nivel de productividad que teníamos antes. En realidad esto pasa con todas las tecnologías y técnicas que aprendemos a lo largo de nuestra carrera, y es en esa parte de la curva cuando optamos por abandonar o seguir con el camino que hemos iniciado.

El problema con TDD es que para mentes como yo, ese proceso es duro y es muy fácil desistir y abandonar, el lado oscuro siempre nos tienta, es más fácil, más rápido y más seductor no seguir por el camino de TDD.

Continuamos con la pregunta de ¿hay que hacer TDD siempre? En el camino del aprendizaje, nos vamos dando cuenta de que es descabellado hacer TDD en todo. En ese camino se aprende a ser pragmático y a ajustarse a las necesidades del proyecto y del momento en el que estamos trabajando. Pero sobre todo, se aprende en ese camino a diseñar. TDD no es sólo una herramienta de testing, es mucho más, es una herramienta de diseño. En el camino de maestría de TDD se aprende sobre todo a diseñar, y con el tiempo se consigue empezar a acertar en esa primera "arquitectura" que pintamos en un papel. Normalmente los problemas que resolvemos suelen ser parecidos, y vamos mejorando esa arquitectura que dibujamos al principio.

Como última ventaja que le veo a TDD es que cuando no tenemos claro cómo solucionar un problema, TDD ayuda a encontrar una solución, empezando a escribir ese primer test de aquello que queremos programar pero no tenemos claro cómo hacerlo. Conseguimos tener un diseño desacoplado, abierto a la extensión y cerrado a la modificación, etc.… De esta forma cuando averiguamos qué es lo que hay que hacer nos es más sencillo modificar esa arquitectura.

Después de todas las experiencias que vimos, es curioso que siempre los que suelen ir a este tipo de eventos, y tu que estás leyendo esto, son siempre profesionales que buscan formas de hacer mejor su trabajo.

Quiero dejaros algunos nombres y libros que surgieron en la conversación, se que me falta alguno, así que si te acuerdas déjamelo en los comentarios:

Muchas gracias a Cartuja .NET por reunir a todos los que allí nos juntamos, ha sido una tarde muy agradable y tengo la sensación de que todos nos quedamos con ganas de más.

Estoy deseando ver la visión de cada uno que asistió, bien en los comentarios de este humilde blog o con referencias a los blogs de los que allí nos juntamos. No quiero señalar http://javiersuarezruiz.wordpress.com/, http://www.variablenotfound.com, http://cartujadotnet.es/

Se me olvidó comentar que mañana es el de Global CodeRetreat http://globalday.coderetreat.org/

En Madrid lo tienen preparado: http://madridcoderetreat.wordpress.com/

Si podéis verlo seguro que os gustará.

Nuevas funcionalidades sobre testing en la interfaz Web de TFS

Vamos a ver una nueva funcionalidad que aún no he usado y me ha dejado enamorado.

Se trata de crear casos de test's a partir de un archivo Excel en TFS con la interfaz web.

Primero, tendremos que crear un plan de tests, en la pestaña "Test" y creamos un nuevo "Test plan" haciendo clic en el "+":

1. Los Test Plans y Suites son work items
Sigue leyendo

[ebook] Guías de Visual Studio Version Control [ALMRangers]

ALMRangers

Los Visual Studio ALM Rangers ofrecen una guía profesional, experiencia práctica y proporcionan soluciones a la comunidad ALM. Son un grupo especial compuesto por miembros del grupo de producto de Visual Studio, de Microsoft Services, Microsoft Most Valuable Professionals (MVP) y Visual Studio Community Leads. La información sobre sus miembros está disponible aquí online.

Hace un tiempo me lancé a traducir una guía que escribieron que me pareció muy interesante: Testing Unitario con Microsoft Fakes. (Hace poco lanzaron la segunda revisión y también actualicé la versión que traduje.

En estas últimas semanas he estado trabajando en otras traducciones de otras guías sobre Visual Studio Version Control y todas sus funcionalidades:

EstrategiasDeBranching JoyasTFVCGestionDependenciasNuGet

Espero que os resulten interesantes.

Post en el blog de Willy-Peter Schaub

Juan María Laó Ramos

[Mindcamp 2014] How I met testing

En Mayo me invitaron a la Mindcamp 2014, Un evento que se viene celebrando de año en año.

Quería compartir la charla que di sobre cómo conocí el mundo del testing y cómo desde entonces duermo mejor.

Espero que os guste y no dejéis de ver los videos de las demás charlas de la Mindcamp, hay auténticas joyas

[Cartuja .NET] Sevilla Mobility Day

Hola amigos del bit y el byte.

El próximo Sábado 5 de Julio en Sevilla será un día especial: el Sevilla Mobility Day organizado por el grupo de usuarios Cartuja.NET.

SevillaMovilityDay

En este día veremos multitud de cosillas relacionadas con el desarrollo para dispositivos móviles y no las enseñaran varios grandes personajes de este mundillo:

  • Javier Suárez, nos contará las bondades de las nuevas aplicaciones universales para Windows Phone 8.1 y Windows, que nos permiten compartir código en nuestras aplicaciones.
  • Josué Yeray nos contará los secretos de los behaviors, animaciones y visual states en aplicaciones WP 8.1, Windows Store y universales.
  • servidor os contaré cómo podemos crear videojuegos multiplataforma con Wave Engine.
  • Mis compis, Juan Cano y Marcos Cobeña nos enseñaran algunos de los secretos más ocultos de Xamarin. Estos dos personajes se han pegado bastante con la plataforma, a ver qué nos cuentan.

Cuándo: Sábado 5 de Julio 2014, de 9:30h a 14:00h

Dónde: Microsoft Clouding Point de Sevilla (C/Biología 12, Edificio Vilamar 2, planta 3, Parque Empresarial Nuevo Torneo).

Web oficial del evento: http://cartujadotnet.es/sevilla-mobility-day/

Regístrate aquí.

Enlaces de Interés 4

Aquí va la nueva recopilación de enlaces. Algunos tienen ya algún tiempo, pero desde mi punto de vista merece la pena compartirlos y recomendaros su lectura, espero que os gusten.

- Is TDD Dead? Recopilatorio con todos los videos sobre la reciente discusión sobre la "muerte de TDD".

- Unit testing part 1 – Unit tests by the book y Unit testing part 2 – Unit testing MonoBehaviours. Dos posts que no os podéis perder del blog de Unity3D sobre testing y TDD en videojuegos. LLevo un tiempo pensando en cómo orientar un post sobre testing en Wave Engine y creo que he encontrado la manera para que próximamente haga uno sobre este tema con Wave Engine.

- The Costs and Benefits of a Unit Testing Culture. Martin Fowler cuenta la experiencia de introducir TDD en Google, llegando incluso a la máxima de que no se mete ni una sola linea de código si no está testeada unitariamente. ¿Será verdad realmente?

- Entrevista Kinisoftware y a Carlos Ble. En Aprendiendo TDD le hacen una entrevista a @kinisoftware y a @carlosble

- Basta ya de picar. Increíble colección de podcasts a cada cual más interesante.

- Allow .NET games on Xbox One. Desde Microsoft han oído el user voice que tienen y van a estudiar el permitir desarrollar juegos en c# para XBox One.

- How Does TDD Affect Design?. Una reflexión cortita sobre cómo afecta TDD al diseño de tu código con la que estoy bastante de acuerdo.

Geomotion: integración entre coche y dispositivos inteligentes Made in Spain

En los últimos años hemos ido viendo cómo la tecnología crece a pasos agigantados y cómo se va involucrando en casi cualquier actividad que hacemos en nuestro día a día.

En el caso de los móviles, ya no es sólo que lo usemos como reproductor de mp3 o cámara de fotos, incluso nos los llevamos pegado al brazo cuando salimos a correr o de ruta con la bicicleta. Y además, ahora tenemos tablets, relojes inteligentes o incluso gafas y pulseritas que nos hacen de asistente personal.

Sin embargo, en la industria del automóvil, a pesar de que ya disfrutamos de verdaderos sistemas multimedia, o de que podemos configurar muchísimos parámetros de nuestro vehículo, o de que cada vez es más asequible llevar integrado un navegador GPS en el salpicadero… todavía echamos en falta cierta tecnología que es más que viable desde hace muchos años. Nos referimos al hecho de que un coche registre todo lo que hacemos con el mismo; cosas como destinos alcanzados, viajes realizados, itinerarios seguidos, consumo de combustible y un largo etcétera.

¿Cómo puede ser que un coche de hoy en día, que puede costar 10.000€, 20.000€ o incluso 50.000€, salga de fábrica sin llevar a bordo un localizador/rastreador GPS? Hablamos de un accesorio que podría tener un costo inferior a 100$ para los fabricantes, probablemente mucho menos de lo que cuesta un faro completo. ¿Y lo que ganaríamos en calidad de vida si nuestro coche actuara como nuestra memoria, nuestro consejero, nuestro gestor financiero…? Pero el objetivo no estaría cumplido si tuviéramos que montarnos en el coche para revisar toda esta información, es importante que la información se integre en la nube y la disfrutemos con nuestros smartphones, tablets y ordenadores.

Precisamente en esta línea están trabajando los chicos de Geomotion. Han lanzado un producto todo en uno con el que poder saber todo lo que hacemos con nuestro vehículo, tocando además temas tan interesantes como la seguridad o la posibilidad de enseñarle a alguien por dónde va nuestro vehículo. Se trata de un localizador GPS con una tarjeta SIM incorporada que nos instalan en nuestro coche y nos da acceso a una serie de apps para PC, Tablet y Smartphone.

La aplicación nos permite hacer un seguimiento en tiempo real de nuestro vehículo si, por ejemplo, lo compartimos o lo hemos prestado, mostrando la calle por la que va circulando o, en caso de estar aparcado, el tiempo que lleva estacionado y la ruta óptima para volver a pie desde nuestra posición.

También nos permite revisar por donde hemos circulado en el pasado, de forma gráfica, en un mapa coloreado con trayectos independientes, para poder confirmar si tiene sentido el itinerario seguido, o descubrir rutas alternativas viendo las carreteras colindantes desde otra perspectiva.

Captura de pantalla de Geomotion

Captura de pantalla de Geomotion

Se puede consultar en detalle toda la información asociada a cada trayecto, como direcciones de origen y destino, horas de partida y llegada, velocidades, etc. Además podemos guardar esos trayectos como rutas favoritas o, simplemente para compararlas sobre el mapa cuando hablemos de dos o más itinerarios diferentes que hayamos hecho para alcanzar el mismo destino (ideal cuando cambiamos de trabajo).

Para los que les guste eso de ahorrar, o para los amantes de las matemáticas, hay una sección de estadísticas, en la que se puede consultar, no sólo tiempos y distancias totales o velocidades máximas diarias, sino conceptos tan interesantes como el dinero gastado en combustible; datos que nos pueden ayudar a cambiar nuestros hábitos para mejorar nuestra economía doméstica o, por qué no, permitir que un padre o madre de familia numerosa pueda justificar que le ocupa demasiado tiempo o dinero llevar y recoger a los niños de las actividades extraescolares durante toda la semana.

Además de una pequeña sección de configuración, existe la posibilidad de “dormir” o “despertar” el vehículo. Supongamos que estamos haciendo turismo en una ciudad que no conocemos, ya no sólo nos viene bien no preocuparnos de dónde dejamos el coche y consultar más tarde el camino de vuelta en el móvil, sino que además podemos activar los avisos para que Geomotion nos diga si se lleva el vehículo la grúa, por ejemplo, porque hayamos aparcado en una zona prohibida sin saberlo, o ya no digamos que nos lo roben. Si el vehículo se mueve mientras está “dormido” nos mandan un email con bastante información al respecto y con un enlace a una página web (que podemos compartir con la policía o la aseguradora) en la que se puede monitorizar el vehículo en tiempo real, como en las películas americanas, así será más fácil recuperarlo o incluso tener la seguridad de que se lo han llevado a un depósito de vehículos en concreto de todos los existentes en la ciudad.

Entre toda esta funcionalidad seguro que encontramos un motivo para interesarnos por Geomotion, además, no olvidemos que está disponible para cualquier plataforma (iPhone, Android, Windows Phone, Windows 8/7/Vista) y que además hay versiones para tablets, con lo que la comodidad es máxima.

Para más información, visita www.dondeestamivehiculo.es

Enlaces de interés 3

Aquí tenéis la lista de enlaces de noticias y cosas que he ido recopilando durante la semana:

[¿Truco WPF?] User Control a pantalla completa

No he tenido la oportunidad de realizar muchas aplicaciones con WPF y en un proyecto en el que trabajo nos ha surgido la necesidad de incluir un la funcionalidad de poner un User Control a pantalla completa.

Después de hablar con un compañero que sí tiene más experiencia que yo en estos menesteres me sugirió que siguiera estos pasos:

  1. Crea una nueva ventana ("Window") que contenga sólo un grid con un nombre, por ejemplo "fullScreenGrid".
  2. Define una función pública que reciba como parámetro el user control que tu quieres y añade el user control como hijo de ese grid: fullScreenGrid.Children.Add( tuUserControl )
  3. Y a correr.

Con esto en la cabeza, lo he hecho y lo hemos conseguido. Sólo hay que tener en cuenta que ántes de añadirlo a la ventana nueva, hay que eliminar el user control de la ventana principal para que podamos cambiar el user control de padre, ya que si no lo hacemos, nos saltará la excepción InvalidOperationException con el mensaje "El elemento especificado ya es el elemento secundario lógico de otro elemento. Desconéctelo primero"

También he tenido que añadir un botón en la ventana que está a pantalla completa para poder salir del modo "Full Screen". Además, para que la ventana esté ha pantalla completa, hay que setear las propiedades WindowStyle a None y WindowState a Maximized para no mostrar la barra con los botones de maximizar, minimizar y cerrar y para que esté maximizada.

Para que podáis ver cómo funciona os dejo un ejemplo de código con un proyecto completo con todo lo necesario y comentado para que lo veáis más claramente: WPF Full Screen Sample

El resultado después de compilar y ejecutar el ejemplo debe ser algo parecido a esto:

Ventana principal

Y cuando hagamos click en el botón de "Go to full Screen":

User Contorl a pantalla completa

¿Habéis tenido que hacerlo alguna vez? ¿Cómo lo habéis hecho?

¿Es realmente un truco?

Juan María Laó Ramos.

[Evento] HTML Tour 2014

En Plain Concepts estamos que no paramos.

No ha terminado el Wave Tour y ya hemos empezado un año más el HTML Tour 2014

HTML Tour

En las siete sesiones preparadas veremos cuáles son las ventajas de HTML 5, javascript y en petí comité veremos qué es lo que hemos estado haciendo en Plain Concepts, cómo hemos aprovechado las ventajas de esta tecnología y veremos el resultado de los proyectos reales que están en producción.

Sinceramente, alucino con las cosas que son capaces de hacer los compañeros, con los que he tenido el privilegio de trabajar.

Aquí tenéis la agenda. En Sevilla estarán el día 24 de Abril, podéis registraros aquí.

Y los fieras que nos darán las sesiones:

ALFREDO FERNÁNDEZ

Alfredo ha estado desarrollando durante unos 6 años, utilizando tecnologías Microsoft y en gran medida centrado en tecnologías web y patrones de desarrollo, está muy interesado en Asp.Net MVC y HTML5, pero también tiene una amplia experiencia en WPF. Es uno de los coordinadores de SecondNug, uno de los principales grupos de usuarios. NET de España y colabora con diversas iniciativas para crear eventos de alta calidad en todo el país.

DAVID GARCÍA

David García uno de los especialistas del equipo Web de Plain Concepts. Ha participado en proyectos como La Cura y el Training Center de la web de la película Prometheus (proyecto ganador de un FWA), proyecto para el cual creó, junto a otros compañeros, la librería WaveJS, la cual nos permite pintar 3D en canvas 2D.

LUIS MIGUEL JIMÉNEZ

Luis Miguel Jiménez lleva varios años trabajando como diseñador gráfico y gracias al avance de las tecnologías de desarrollo web (HTML5 y CSS3) su carrera da un giro hacia el diseño y la maquetación web donde descubre un nuevo mundo de posibilidades a las que poder aplicar los conocimientos en diseño.

MANUEL MARTÍNEZ

Manuel Martínez es un apasionado de las tecnologías web, empezó como desarrollador de PHP y actualmente pertenece al equipo web de Plain Concepts, donde trabaja habitualmente con ASP.NET MVC y JavaScript.

QUIQUE MARTÍNEZ

Quique Martínez actualmente trabaja en Plain Concepts como Senior Software Developer Engineer. Es un apasionado de la #ArquitecturaDeSoftware y del #CloudComputing, en concreto #WindowsAzure.En esta última ha sido nombrado #MicrosoftMVP y además pertenece a los #AzureInsiders.

Enlaces de interés 2

Aquí va la segunda entrega de los enlaces que he visto esta semana y quería compartir con todos:

Happy and cool coding!

Enlaces de interés

Bueno, voy a comenzar con una pequeña colección sobre enlaces que voy encontrando por ahí emulando a un amigo.

- Why agile has failed. Scott Bellware

- Scott Hanselman's Complete List of Productivity Tips. Scott Hanselman

- 10 cosas a hacer para securizar tus datos. Scott Hanselman.

- Nueve técnicas para transmitir una imagen positiva que te ayude a conectar con la audiencia. El Arte de Presentar.

- Software Testing with Visual Studio 2012 Jump Start. Microsoft Virtual Academy

- Tests unitarios y dependencias.  Juan María Hernández

- Aprendiendo TDD con C#

 

El enésimo post sobre el Singleton (UPDATE 1)

La cosa es que el Singleton hace dos cosas:

- Se asegura de que sólo haya una instancia del objeto.

- SomeStuff()

El problema de hacer dos cosas es que viola la S de los principios Solid: Single Responisability Principle. Y esto hace que no sea fácilmente testeable.

Cuando quiero hacer que sea testeable quito el Singleton y lo sustituyo por una factoría, una clase estática y una clase que hace la funcionalidad de SomeStuff.

Aquí tenéis un ejemplo simple:

public static class Singletons
 {
     private static Factoria fact = new Factoria();

     public static void HazLoTuyo()
     {
         fact.GetUnicaInstancia().DoStuff();
     }
 }

 public class Factoria
 {
     private Clase unicaInstancia;

     public Factoria()
     {
         unicaInstancia = new Clase();
     }

     public Clase GetUnicaInstancia()
     {
         return this.unicaInstancia;
     }
 }

 public class Clase
 {
     public Clase()
     {
     }

     public void DoStuff() { }
 }

De esta manera puedo testear la clase Clase sin preocuparme de que sólo hay una instancia de ella en el sistema.

Es por esto que me asalta la duda, ¿no será el Singleton un antipatron?

¿Cómo lo veis vosotros?

[Update 1]

Gracias a los comentarios voy a ir actualizando el post con algunas conclusiones y dudas que se me plantean.

Resumiendo un poco los comentarios, cuando sólo queremos una instancia de nuestra clase Clase (definida más arriba) suele ser buena idea usar un inyector de dependencias y registrar nuestra clase para que el inyector nos devuelva siempre la misma instancia.

De esta manera "invertimos el control" de la instanciación de nuestra clase, y podemos testearla de manera aislada.

¿Pero que pasa si no queremos meter un inyector de dependencias por el motivo que sea?

Podríamos meter una clase parecida a esta:

 public class ClaseFachada
 {
     private static Clase clase = new Clase();

     public static void DoStuff()
     {
         clase.DoStuff();
     }
 }

De esta manera podemos usarla en nuestro código de esta forma:

ClaseFachada.DoStuff();

Como si fuese un Singleton, pero evitando el típico Clase.Instance.DoStuff(). La cosa es que si estamos desarrollando una librería y queremos que nuestra librería se use así.

¿Os parece adecuado? ¿Cómo lo mejoraríais?

[Evento] Wave Engine University Tour

Wave Engine University TourA partir del 17 de Marzo comenzaremos un Tour que nos llevará por un montón de universidades españolas para enseñar Wave Engine.

Wave Engine es un motor gráfico multiplataforma y gratuito, en continua evolución añadiendo cada día nuevas funcionalidades. Y además soy miembro del equipo de desarrollo :).

El propio equipo será el encargado de impartir el taller para ayudarte a introducirte en el desarrollo de videojuegos o, si ya estás en el mundillo, para enseñarte todo lo que Wave Engine puede aportar a tus juegos y cómo puede facilitarte la vida.

También habrá premios para los que lleguen a publicar juegos en la Store de Windows 8 y/o Windows Phone. Y muchas sorpresas más.

¡NO TE LO PUEDES PERDER! Busca tu ciudad y regístrate aquí.

P/D: Los que me conocéis, sabréis enseguida quién fue la musa del diseñador del cartel ;).

Difundid y  compartid por las redes sociales. Y gritad por la calle que Wave Engine está de gira.

monos alados

PERO SOBRE TODO PARTICIPAD

TFS, Xamarin y MSTests

Hace un tiempo vimos un pequeño truco para poder ejecutar tests en las builds de TFS para proyectos Windows Phone.

Me ha sido necesario hacer lo mismo con proyectos con Xamarin Android y Xamarin iOS y aquí os pongo mi experiencia y cómo lo he resuelto. Sigue leyendo

Qué es lo que no hay que hacer en ASP.NET, y qué hacer en su lugar

Vamos a ver varios errores que se suelen cometer en proyectos ASP.NET. Veremos algunas recomendaciones de qué deberíamos hacer para no caer en esos errores. Está basado en una presentación de Damian Edwards en el Norwegian Developers Conference. Sigue leyendo

Windows Azure: Release de Windows Azure SDK 2.2 (y sus chuladas)

Ya está publicada la nueva release de Windows Azure SDK 2.2. En esta release se han incluido un gran número de características:

  • Soporte para Visual Studio 2013.
  • Se ha integrado el Sign-In de Azure en Visual Studio.
  • Debugging remoto de servicios cloud con Visual Studio.
  • Soporte de administración de Firewalls en Visual Studio para bases de datos SQL.
  • Imágenes de máquinas virtuales con Visual Studio 2013 RTM para suscriptores MSDN
  • Windows Azure Managemente Libraries for .NET
  • Se han actualizado los Windows Azure PowerShell Cmdlets y ScriptCenter Sigue leyendo

TFS, Windows Phone y MSTests

¿Quieres que en las builds que tengas configuradas en TFS se ejecuten los test de tu aplicación Windows Phone?

Seguramente habéis probado a incluir un proyecto del tipo "Windows Phone Unit Test App" y os habéis puesto a crear nuestros tan amados tests. Pero a la hora de incluirlo en el repositorio de código, os habréis dado cuenta de que pasa algo raro: Los test no se ejecutan. (Si no te has dado cuenta, deja de leer esto y ve a comprobarlo)

La cosa es que ese proyecto de test lanza un emulador de WP y ejecuta los test y eso TFS no lo soporta todavía. Así que tienes dos opciones:

1) Dejar de hacer tests de tu aplicación WP.

2) Continuar leyendo.

Bien, si estás aquí, te cuento la solución en unos cuantos pasos:

1) Añade un proyecto de test típico de Visual Studio: Visual Studio Unit Test Project.

2) A este proyecto de test, añade una referencia del proyecto Windows Phone 8 que estés desarrollando.

3) Añade una copia local de los assemblies de Windows Phone que necesites, por ejemplo:

- System.Windows

- Microsoft.Phone

Los encontrarás en el directorio C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Tools\MDILXAPCompile\Framework

4) Copialos a un directorio local, que también tendrás que subir al TFS, llámalo por ejemplo /lib/ y ahora edita el XML del proyecto de test (el .csproj) y reemplaza:

<Reference Include="System.Windows" />
<Reference Include="Microsoft.Phone" />

por:

  <Reference Include="System.Windows, Version=2.0.6.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e, processorArchitecture=MSIL">
  <HintPath>lib\System.Windows.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Phone, Version=8.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e, processorArchitecture=MSIL">
  <HintPath>lib\Microsoft.Phone.dll</HintPath>
</Reference>

Además, para evitar los warnings cada vez que compiles añade este elemento al primer grupo de <PropertyGroup> del .csproj:

<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>

A partir de este momento, cuando incluyáis vuestro proyecto en vuestro TFS vuestros tests se ejecutarán como si lo hiciesen en el emulador, pero sin tener que lanzarlos.

Espero que pronto den solución a este "problema" y lo incluyan en la próxima versión.

Este post ha sido gracias a una respuesta en stackoverflow http://stackoverflow.com/a/13035195 que me ha salvado el día.

¿Se os ocurre otra forma de conseguir el mismo resultado?

Espero que sirva.

Juan María Laó Ramos.

[ebook] Testing Unitario con Microsoft Fakes

Hace un tiempo encontré un recurso que me pareció bastante interesante de compartir con la comunidad hispano-hablante.

Me lié la manta a la cabeza y fui traduciéndolo poco a poco. Y gracias a Jose Bonnin (@wasat) y a los Visual Studio ALM Technical Rangers aquí tenéis el resultado:

MicrosoftFakes

Post en el blog de los Visual Studio ALM Technical Rangers: http://blogs.msdn.com/b/willy-peter_schaub/archive/2013/08/22/191-habla-espa-241-ol-testing-unitario-con-microsoft-174-fakes.aspx

Espero que sirva.