Bienvenidos sean a este post, en el post anterior hemos visto que son los ensamblados y las referencias y en este post hablamos del debug o depuracion y como usar los breakpoints pero hoy veremos como podemos realizar tests sobre nuestras soluciones.
Los «testeos» se realizan por medio de un proyecto, de la misma forma que nuestro programa, y como dijimos anteriormente lo mejor de las soluciones es que pueden acumular varios proyectos, en este post veremos los proyectos que se llaman Test unitario, el nombre es porque nos permite probar ya sea un metodo o una propiedad de forma solitaria, tambien un bloque determinado del codigo y mejor aun podemos chequear sin necesidad de terminar la solucion en si porque en codigos cortos como estamos viendo hasta ahora no tenemos problema en terminarlo y ver en que puede fallar pero en proyectos o soluciones mas extensas puede llevar mucho tiempo desarrollar algo y descubrir que puede fallar o por lo menos no trabajar como esperabamos, errores logicos, para seguir con esta leccion vamos a utilizar la solucion del post anterior o pueden crearlo con los siguientes datos:
- Lenguaje: C#
- Plataforma: Windows
- Tipo de Proyecto: Consola (Net Framework)
- Nombre Proyecto: Listas
- Nombre Solucion: Listas
- Version Framework: La ultima disponible.
Program.cs
using System;
namespace Listas
{
class Program
{
static void Main(string[] args)
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda");
persona.AgregarPersonas("Enzo Tortore");
persona.AgregarPersonas("DarkZero Aleman");
for(int i=0; i<persona.Contar(); i++)
{
Console.WriteLine(persona.Recuperar(i));
}
}
}
}
Personas.cs
using System;
using System.Collections.Generic;
namespace Listas
{
class Personas
{
List<string> listado;
public Personas()
{
listado = new List<string>();
}
public void AgregarPersonas(string nombre)
{
listado.Add(nombre);
}
public string Recuperar(int i)
{
return listado[i];
}
public int Contar()
{
return listado.Count;
}
}
}
Nota: Si vas a usar el post anterior evita la parte del Speech asi no perdes tiempo al ejecutarlo
Ahora vamos a crear el modelo base para un Test unitario, para ello debemos ir al Explorador de soluciones y crear un nuevo proyecto en la solucion, hacemos click con el boton derecho sobre la misma y elegimos Agregar->Nuevo Proyecto

Una vez seleccionado nos aparecera el siguiente cuadro

En ese cuadro deberan seleccionar:
- Lenguaje: C#
- Plataforma: Windows
- Proyectos: Prueba
Con esos seleccionados debera quedar como se ve en la imagen, seran varios pero deberan elegir Proyecto de prueba unitaria (Net Framework), una vez seleccionado presionen Siguiente para pasar al siguiente cuadro

En nombre pondremos Listas.Test y la version de Framework se recomienda que sea la misma que la de la solucion, una vez hecho presionen Crear para proceder con la creacion del proyecto en la solucion, una vez hecho nos quedara de la siguiente manera

Ahora poseemos dos proyectos en nuestra solucion, en el de testeo tendremos el siguiente codigo generado automaticamente:
UnitTest1.cs
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Lista.Test
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
}
}
}
Como pueden ver es muy similar a todos los codigos con la diferencia de una nueva nomenclatura de C#, en este caso tendremos un nombre entre corchetes, [TestMethod], al cual se lo denomina atributos y siempre van a ir delante de las clases y metodos que vamos a testear, con todo esto ahora en nuestra solucion vamos a tener dos assemblies, uno que es Listas y otro que es Listas.Test para el primer caso seguiremos teniendo el .exe que nos permite ejecutar nuestra solucion, en el segundo caso generara un .dll para poder trabajar con ella, para comenzar con nuestro ejemplo vamos nuevamente al Explorador de soluciones, abrimos a Listas.Test y vamos a eliminar la clase generada automaticamente llamada InitTest1.cs de la siguiente manera

Una vez eliminado procederemos a crear una nueva clase, en este caso de vuelta haremos click con el boton derecho sobre el proyecto Listas.Test y seleccionaremos Agregar->Nuevo elemento

Nos aparecera el siguiente cuadro

Si investigamos un poco tendremos la opcion de crear una clase de test unitario pero para este caso elegiremos Class y lo llamaremos ListasTests.cs, una vez hecho presionen Aceptar para crear la nueva clase, si nosotros intentaramos trabajar ahora con nuestro otro proyecto no podriamos porque no esta referenciado, para solucionar esto debemos hacer click con el boton derecho sobre las referencias del proyecto Listas.Test y usar Agregar referencia donde aparecera el siguiente cuadro

En realidad es el mismo cuadro cuando vimos en el post anterior pero ahora en lugar de usar Framework, usaremos la opcion de Proyectos -> Solucion, como pueden ver aparece una sola opcion que es Listas pero si hubiera mas proyectos aparecerian tambien, tildamos al proyecto y le damos Aceptar, con esto ya deberiamos poder crear objetos de tipo Personas, probemos de crear un objeto en nuestra nueva clase:

Esto es debido a que no tenemos los permisos concedidos, se acuerdan cuando hablamos de los modificadores de acceso o encapsulacion, bueno pasemos a ver de nuevo a la clase Personas:
namespace Lista
{
class Personas
{
List<string> listado;
public Personas()
{
listado = new List<string>();
}
public void AgregarPersonas(string nombre)
{
listado.Add(nombre);
}
public string Recuperar(int i)
{
return listado[i];
}
public int Contar()
{
return listado.Count;
}
}
}
En esta clase no definimos ningun modificador por lo tanto el lenguaje que esta clase es de tipo internal, si lo agregamos no modifica en nada porque es el acceso original, si es internal le dice al programa que esta clase es solamente para todos los miembros de este proyecto pero si nosotros queremos accederlo desde otro no podremos, para solucionar esto solamente debemos conceder los permisos de tipo public a la clase Personas, es decir modificamos el codigo de Personas.cs de la siguiente manera:
namespace Lista
{
public class Personas
{
List<string> listado;
.... el resto del namespace sigue igual ....
Simplemente informando que nuestra clase Personas desde ahora sera publica nos permitira trabajar sin inconvenientes, si pasamos a nuestro codigo anterior quedara libre de errores, pasemos a nuestro codigo de testeo y vamos a prepararlo para ver como funciona:
ListaTests.cs
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Listas.Test
{
[TestClass]
class ListasTest
{
[TestMethod]
public void Prueba()
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda");
Assert.AreEqual("Martin", persona.Recuperar(0));
}
}
}
En este caso mantenemos a System pero agregamos la siguiente linea de using:
using Microsoft.VisualStudio.TestTools.UnitTesting;
Esta es la que hace la verdadera magia porque es la que permite utilizar todas las opciones de Testing, por ultimo agregaremos los dos atributos necesarios para realizar el test, como son [TestClass] para testear la clase y [TestMethod] para chequear el metodo que asignemos, para nuestra prueba usaremos el siguiente metodo:
public void Prueba()
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda");
Assert.AreEqual("Martin", persona.Recuperar(0));
}
En este caso lo llamaremos Prueba, crearemos un objeto de tipo Personas llamado persona, usamos el metodo AgregarPersonas para adicionar una nueva persona, el verdadero testing lo hace la ultima linea que por medio de Assert (Afirmar en ingles) chequea con el metodo AreEqual (son iguales) dos valores, uno sera el nombre de la persona y el otro la variable a utilizar para la comparacion, si lo queremos probar debemos hacer Prueba -> Todas las pruebas y obtendremos este resultado

Eh? pero no nos mostro el resultado del test, esto es debido a que la clase tambien debe ser publica, para ello debemos modificar la linea de la clase de esta forma:
public class ListasTests
Si volvemos a realizar el test obtendremos esta salida

Como pueden ver fallo el test porque en realidad solo agregaste una persona y el parametro de comparacion no es el del contenido en la variable, hagamos esta modificacion:
Assert.AreEqual("Martin Miranda", persona.Recuperar(0));
Vuelvan a correr la prueba->todas las pruebas y veamos que suceda

Aca podemos ver como funciono correctamente nuestro test, con esto tenemos las bases para nuestros futuros experimentos y como testear las distintas partes de nuestros programas en sus distintos estados, una opcion muy interesante de esta forma de trabajo es la posibilidad de poder copiar porciones de nuestro codigo debajo del atributo [TestMethod] para verificarlo como hicimos en este ejemplo ya sea por medio de Assert u otras formas.
En resumen, hoy hemos hablado sobre el test unitario, como se crea, para que sirve, como se vincula con los otros proyectos, que debemos modificar para que los otros proyectos permitan acceso a este, como trabaja, como podemos usarlo, y sus dos posibles salidas, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
1.00 $