Introducción
Desde hace un tiempo eXtreme Programming ha comenzado a cambiar los hábitos clásicos de los equipos de desarrollo. Uno de los pilares de esta metodología se centra sobre el aumento de la productividad de los equipos de desarrollo. Este aumento se puede lograr (en gran parte) si los equipos trabajan utilizando una nueva técnica de trabajo denominada Test Development Driven (TDD).
Hace unos meses, configurar un entorno TDD, era una tarea complicada; pero desde la llegada de Visual Studio 2005 y Team Foundation Server (TFS), esta tarea se simplifica muchísimo.
Luego de estar probando durante mucho tiempos las versiones Beta de estos productos, finalmente pude participar en un proyecto donde aplicásemos una metodología ágil, integrados con TFS.
El objetivo de este artículo es demostrar paso a paso como se puede utilizar Visual Studio Team System, en un proceso de desarrollo ágil, que contemple la creación de un componente, sus pruebas y los sucesivos pasos de integración hasta el proceso de Continuous Integration.
Creación de un componente de ejemplo
Lo primero que haremos es crear un nuevo proyecto Visual Basic Net (imagen 1), para esto abrimos Visual Studio y seleccionamos las siguientes opciones:
1. Menú File -> New -> Project
2. Seleccionamos Visual Basic, y dentro la opción Windows; el tipo de proyecto seráClass Library
3. Definimos el nombre del proyecto; a modo de ejemplo lo hemos llamadoTDDEjemplo
Dentro de nuestro proyecto renombramos la clase con el nombre “Labs” y agregamos el siguiente código de ejemplo:
Public Class Labs
”
” Obtiene un mensaje de informacion
”
” Obtiene un mensaje de informacion
Public Function ObtenerInformacion() As String
Return “Hola Mundo”
End Function
”
” Retorna el nombre completo a partir de un Nombre y un Apellido
”
” Nombre
” Apellido
” Retorna el nombre completo a partir de un Nombre y un Apellido
Public Function CrearNombreCompleto(ByVal Nombre As String, ByVal Apellido As String) As String
Return Nombre & “, ” & Apellido
End Function
End Class
Hemos agregado 2 funciones ObtenerInformacion y CrearNombreCompleto, que utilizaremos para integrar nuestro proyecto de pruebas en un proceso TDD.
Creación de un proyecto de pruebas unitarias
El siguiente paso es crear un proyecto que nos permita probar la funcionalidad del proyecto TDDEjemplo. Para eso crearemos una serie de pruebas unitarias (Unit Tests), que servirán como base para evaluar el funcionamiento correcto de las funciones que creamos en el paso anterior. Para esto posicionamos el cursor en la línea de definición de una de las funciones y desplegamos el menú contextual, y seleccionamos la opción Create Unit Tests
Nota: otra de las opciones que poseemos es la opción Rename, esta opción nos permite renombrar el nombre de la función y reemplazar este nombre en todos los lugares donde se utilice la función. Esta acción es un caso de Refactoring.
El siguiente formulario nos permite seleccionar las funciones sobre las cuales queremos crear los Tests unitarios. En este caso seleccionamos ambas funciones

Selección de funciones para las pruebas unitarias
Las funciones con los Tests unitarios se crearan en un nuevo proyecto, en la opción para definir el nombre ingresamos TDDEjemploTest
.
Esta opción nos agrega un nuevo proyecto a la solución y le agrega como referencia el proyecto TDDEjemplo, además agrega dentro de la solución una serie de nuevos elementos.

Solución con el nuevo proyecto de pruebas
En el nuevo proyecto de pruebas, se ha creado una clase LabsTest.vb que posee las siguientes pruebas unitarias;
Clase Labs.vb&nbps;&nbps;&nbps;Clase LabsTests.vb
ObtenerInformacion&nbps;&nbps;&nbps;&nbps;&nbps;ObtenerInformacionTest
CrearNombreCompleto&nbps;&nbps;&nbps;&nbps;&nbps;CrearNombreCompletoTest
Las nuevas funciones utilizan la libreríaMicrosoft.VisualStudio.QualityTools.UnitTestFramework, que ha sido incluida dentro de la suite de Visual Studio 2005, para la ejecución de pruebas unitarias. El asistente crea las nuevas funciones implementando una llamada a la función que se quiere probar y generando el código necesario para el mismo.
Por ejemplo la función CrearNombreCompletoTest; incluye la definición de las variables Nombre y Apellido, adicionalmente se agrega como tarea inicializar los valores de estas variables.
”
”A test for CrearNombreCompleto(ByVal String, ByVal String)
”
_
Public Sub CrearNombreCompletoTest()
Dim target As Labs = New Labs
Dim Nombre As String = Nothing ‘TODO: Initialize to an appropriate value
Dim Apellido As String = Nothing ‘TODO: Initialize to an appropriate value
Dim expected As String = Nothing
Dim actual As String
actual = target.CrearNombreCompleto(Nombre, Apellido)
Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.CrearNombreCompleto did not return the expected value.”)
Assert.Inconclusive(“Verify the correctness of this test method.”)
End Sub
Para poder probar esta función completaremos los valores de estas variables y también la variable expected, que es la que almacena el valor esperado para luego comparar con el resultado de la ejecución de la prueba.
El código final quedaría como en el siguiente ejemplo:
”
”A test for CrearNombreCompleto(ByVal String, ByVal String)
”
_
Public Sub CrearNombreCompletoTest()
Dim target As Labs = New Labs
Dim Nombre As String = “Bruno”
Dim Apellido As String = “Capuano”
Dim expected As String = “Bruno, Capuano”
Dim actual As String
actual = target.CrearNombreCompleto(Nombre, Apellido)
Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.CrearNombreCompleto did not return the expected value.”)
End Sub
”
”A test for ObtenerInformacion()
”
_
Public Sub ObtenerInformacionTest()
Dim target As Labs = New Labs
Dim expected As String = “Hola Mundo”
Dim actual As String
actual = target.ObtenerInformacion
Assert.AreEqual(expected, actual, “TDDEjemplo.Labs.ObtenerInformacion did not return the expected value.”)
End Sub
Nota: el generador de pruebas unitarias agrega además de la prueba de la función la siguiente sentencia Assert.Inconclusive(…), para verificar que se complete el código de la prueba unitaria; esta línea debe ser eliminada luego de implementada la prueba unitaria ya que la misma no retornará un resultado exitoso si se deja esta llamada.
Una vez que hemos completado la definición de las prueba unitarias podemos ejecutar las mismas para evaluar si nuestro componente TDDEjemplo.Labsfunciona correctamente. Para lanzar el proceso de ejecución de pruebas unitarias debemos seleccionar:
Menú Test -> Start Selected Test Project with Debugger
Si no hemos cometido ningún error y las pruebas validan esta definición, el resultado debe ser exitoso y lo podremos visualizar en la ventana de Test Results;

Ejecución exitosa de las pruebas unitarias.
Si en cambio hemos tenido algún error o hemos dejado la llamadaAssert.Inconclusive(…), podremos ver alguno de los siguientes resultados:
Fuente: