Practica_04.Desarrollo Dirigido por los Test (TDD) INTRODUCCION EJERCICIO 1
Tarea 1 Creacin de un nuevo projecto Tarea 2 Definicin del contexto de los Tests. Tarea 3 Inlcuyendo ms funcionalidad Ejercicio propuesto Implementacin correcta de las operaciones de una PILA mediante TDD
Introduccin
Desarrollo/Diseo dirigido por los Test - Test Driven Development/Design (TDD), es una metodologa de
diseo/desarrollo donde los desarrolladores crean software a partir de la escritura de las pruebas de
unidad. Las pruebas de unidad se pueden ver como un pequeo conjunto de especificaciones que el
sistema debera cumplir. La escritura de los test como parte inicial del proceso de desarrollo ayuda al
desarrollador en centrarse exclusivamente en escribir el cdigo necesario para pasar dichos tests y por
tanto a ir asegurando que el sistema va cumpliendo con los requerimientos documentados.
El ciclo de TDD sigue la secuencia Rojo, Verde, Refactorizacin. El Rojo se refiere a la etapa inicial de la
escritura de los test, una apariencia visual de color rojo del icono del test en el entorno de ejecucin de
Tests indica que el test no cumple con los requerimientos. El verde se refiere a la etapa de
comprobacin de los requerimientos, el entorno de ejecucin de Test se encarga de mostrar con un
icono de color verde aquellos que los cumplen. La refactorizacin consiste en ir depurando el cdigo,
reorganizarlo y adaptarlo para que sea ms claro, entendible y flexible. El ciclo de TDD se repite
constantemente a lo largo del proceso de desarrollo.
Un aspecto importante para llevar a cabo con xito TDD es contar con las herramientas software
adecuadas, en este sentido Visual Studio ofrece un entorno integrado que permite llevar a cabo TDD de
forma eficiente.
Como ejemplo, vamos a construir la implementacin de una PILA mediante TDD, mostrando como los
test dirigen el diseo y la implementacin de la clase.
Tarea 1 Creacin de un nuevo Proyecto
En esta tarea crearemos un proyecto C# de Librera de Clase que utilizaremos para explorar las
caractersticas de TDD de Visual Studio.
1. Abrir Microsoft Visual Studio desde el Explorador de Windows: Start | All Programs |
Microsoft Visual Studio | Microsoft Visual Studio.
2. Desde Menu principal de Visual Studio: ARCHIVO |Nuevo | Proyecto, aparecer el cuadro
de dialogo Nuevo Proyecto.
Figura 1. Creacin de un proyecto
3. En el cuadro de dilogo Nuevo Proyecto seleccionar en el panel de la izquierda Visual C# .
En el panel central, compruebe que la opcin .NET Framework 4.5 del est seleccionada y
seleccione a continuacin la plantilla Biblioteca de Clases como tipo de proyecto.
4. Cambiamos el nombre de la solucin a Practica_Pila, y el nombre del proyecto a
EstructurasDatos, comprobar que la casilla Crear directorio para la solucin est
seleccionada y pulse Aceptar.
5. En el Explorador de soluciones renombrar el archivo Class1.cs que se ha creado por defecto
a Pila.cs
6. En el panel Explorador de soluciones, hacer click con el botn derecho sobre la solucin
Practica_Pila y seleccionar Aadir | Nuevo Proyecto Visual C# | Prueba | Proyecto de
prueba unitaria como tipo de proyecto (comprobar que .NET Framework 4.5 est
seleccionado).
7. Cambiar el nombre del proyecto a EstructurasDatos.Tests y pulsar OK.
8. Elimine el archivo UnitTest1.cs creado por defecto.
Tarea 2 Definicin de un contexto para los test.
Vamos a comenzar creando un nuevo archivo de cdigo fuente que contendrn los tests que
escribiremos para nuestra clase Pila.
9. En el panel Explorer de soluciones, hacer click con el botn derecho sobre el proyecto
EstucturasDatos.Tests y seleccione la opcin Agregar Prueba Unitaria.
10. Cambie desde el explorador de soluciones el nombre del archivo creado por defecto
UnitTest1.cs a PilaUnitTest.cs. Para que Visual Studio reconozca a PilaUnitTest como una
clase de Test tiene que tener el atributo [TestClass], tal y como se muestra a continuacin:
11. Si Visual Studio no reconoce el atributo TestClass (porque necesita usar el espacio de
nombres donde est declarado dicho atributo), se puede usar una nueva caracterstica de
Visual Studio que aade automticamente la correspondiente instruccin using. Presione
simultneamente las tres teclas CTRL + . para lanzar el men contextual o pulse botn
derecho sobre el atributo [TestClass] seleccione Resolver y la opcin deseada:
12. Una vez establecido adecuadamente el atributo TestClass para la clase de tests
PilaUnitTest, es el momento de describir el estado y las condiciones que dicha clase tiene
que cumplir como.
13. Comencemos asumiendo que la pila cuando es creada, el constructor por defecto devuelve
una instancia a un objeto pila que no es nula. Comencemos cambiando el nombre del
mtodo Test creado por defecto a uno que especifique este hecho, el cual llamaremos
NuevaPilaEsNoNula. (Los mtodos de las pruebas unitarias tienen el atributo
[TestMethod]).
14. Ahora tenemos que declarar y crear una nueva instancia de Pila, y verificar que su valor es
no nulo.
Se observa que la clase Pila no la reconoce el compilador, ya que la clase Pila no est
declarada en el mismo proyecto que el de las pruebas de unidad. Para que sea accesible el
ensamblado generado por proyecto EstructurasDatos (y por tanto la clase Pila), al proyecto
EstructurasDatos.Test, hay que incluirlo en las referencias: pulsar botn derecho en la
carpeta References de EstructurasDatos.Test , y seleccionar Agregar referencia.
En la ventana de administracin de referencias del proyecto EstructurasDatos.Test,
seleccionar la opcin Proyectos dentro del elemento jerrquico Solucin y marcar la casilla
que corresponde al proyecto EstructurasDatos (en el que est la clase Pila), tal y como se
muestra en la siguiente pantalla:
Cuando acepte la ventana comprobar que la indicacin de error an no ha desaparecido. Es
necesario incluir la clausula using.
Al igual que se hizo anteriormente, en este caso, sobre el nombre de la clase Pila, pulsar el
botn derecho, seleccionar Resolver y la opcin de incluir el using TDD.EstructurasDatos.
Una vez hecho esto comprobar que las indicaciones de error han desaparecido. Es el
momento de aadir la correspondiente instruccin de comprobacin, y el Test quedara:
[TestMethod] public void NuevaPilaEsNoNula() { Pila pila = new Pila(); Assert.IsNotNull(pila); }
15. Para comprobar el comportamiento de la clase Pila con respecto a la prueba, hay que
ejecutar el Explorador de Pruebas (por defecto se encuentra en una pestaa plegada en el
panel de la izquierda de la ventana principal).
Pulsar el enlace, Ejecutar todas, si todo ha ido bien ver que la prueba NuevaPilaEsNoVacia
est marcada en verde, lo que significa prueba superada!!!
Ahora tenemos que declarar e inicializar una nueva instancia de Pila, y verificar que su propidad EsVacia (que indica que la pila est vacia) es verdadera, y por tanto devuelve el valor booleano true. Dicha prueba la vamos a denominar NuevaPilaEsVacia:
Visual Studio no reconoce la propiedad EsVacia de la pila an. Para crearla, pulsamos el botn derecho sobre ella, y seleccionamos la opcin Generar | Propiedad.
Visual Studio crear dicha propiedad en el archivo Pila.cs del proyecto EstructurasDatos, tal y como se muestra a continuacin:
Si ejecutramos de nuevo todas las pruebas veramos que la prueba NuevaPilaEsVacia no es superada.
En el mbito del Desarrollo Dirigido por los Test ( TDD), la filosofa es hacer que los test sean lo ms simple posibles, con el mnimo de funcionalidad, y as decrementar nuestra exposicin a los errores. Por tanto, lo mnimo necesario para pasar el test es hacer que la propiedad EsVacia sea de solo lectura y devuelva true. public class Pila { public bool EsVacia { get { return true; } } }
Despues de las anteriores modificaciones, si volvemos a ejecutar los Test, veremos cmo esta vez los pasa.
Tarea 3 Incluyendo mas funcionalidad dirigida por los Tests
En este momento, lo que tenemos es una implementacin casi vacia de la clase Pila, hay una nica propiedad de solo-lectura EsVacia. Vamos a aadirle la funcionalidad de poder meter y sacar elementos de la pila. Aadamos otra Prueba MeterElementoNuevaPilaEsNoVacia que especifique el comportamiento del nuevo mtodo Meter para la clase Pila, el cual se le pasa un entero como parmetro de entrada. La primera condicin que debe cumplir es que cuando se introduzca un elemento en la pila, sta tiene que dejar de estar vaca, adicionalmente el ltimo elemento que se meta es el que tiene que salir. [TestMethod] public void MeterElementoNuevaPilaEsNoVacia() { Pila pila = new Pila(); int elemento; pila.Meter(elemento); bool esVacia = pila.EsVacia; Assert.IsFalse(esVacia); }
Hacer click con el botn derecho sobre el mtodo Meter:
El cdigo generado por Visual Studio es el siguiente: namespace TDD.EstructurasDatos { public class Pila { public bool EsVacia { get { return true; } } public void Meter(int elemento) { throw new NotImplementedException(); } } } Ejecute el test para comprobar que realmente falla. Es importante comprobar esto, para evitar que surjan errores posteriores debidos a fatdicas casualidades o situaciones impredecibles. Ahora nuestro objetivo es hacer que se pase este test . Atendiendo a la filosofa de TDD, lo ms simple que se puede hacer es comprobar que realmente hay algo metido en la pila cuando se llama al mtodo Meter (dejando para posteriores test la comprobacin de la correspondencia entre lo que entra y lo que sale de la pila). Cuando ejecutemos el test, veremos que falla de nuevo. que ocurre?. Recuerde, que para cumplir con la norma de hacer las cosas lo ms simple posibles, la propiedad EsVacia se implement como de solo-lectura y siempre devolviendo un valor true. Ahora tenemos que hacer nuevas decisiones de diseo acerca de como la propiedad EsVacia debera comportarse y su relacin con el mtodo Meter. Parece claro que la clase Pila necesita algn mecanismo para almacenar su estado. Una posibilidad es ir almacenando los tems en una lista, esto nos permitira, por un lado determinar el valor de la propiedad EsVacia en funcin del tamao de la lista; y adems la posibilidad de almacenar los elementos introducidos. using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace TDD.EstructurasDatos { public class Pila { private ArrayList _elementos; public bool EsVacia { get { return (_elementos.Count == 0);
} } public void Meter(int elemento) { _elementos.Add(elemento); } } }
Si la clase ArrayList no es reconocida por el compilador. Presione las teclas CTRL+. y seleccione la opcin de importar el espacio de nombres System.Collections. Ejecute de nuevo el test. Volver a fallar porque nuestro ArrayList no ha sido inicializado. Mire con atencin el cdigo fuente de la declaracin de ArrayList y observar cmo Visual Studio le advierte, con una rayita verde ondulada subrayando el problema de la inicializacin de dicha variable. Inicialice dicha variable en la propia declaracin (aunque tambin se podra hacer en la llamada del constructor). Si ejecutamos los tests comprobaremos que ahora si se pasan. Siguiendo con la filosofa TDD aqu mostrada, se le propone al alumno que contine desarrollando el proyecto para conseguir una correcta implementacin de todas las operaciones asociadas a una pila. GRUPO DE TRABAJO.
- Implementacin de la pila mediante colecciones genricas Pila utilizando TDD. Documente el ms completo conjunto de pruebas para garantizar que la implementacin de los mtodos de la clase Pila es correcta.
TRABAJO AUTNOMO.
- Basada en la anterior implementacin construya un proyecto librera que permita resolver expresiones aritmticas (totalmente patentizadas) de operandos reales.
Top Related