Bienvenidos sean a este post, en el post anterior vimos como se genera una clase para hacer pruebas o testeos sobre nuestro codigo para el caso de hoy vamos a modificar el proyecto Listas del post anterior para que trabaje con otros datos.
Para ello primero agregaremos una nueva clase, para ello haremos click con el boton derecho sobre el proyecto Listas y seleccionaremos Agregar -> Nuevo elemento, en la nueva ventana seleccionen Clase y asignen el nombre Calculos.cs, una vez hecho eso procederemos a modificar el codigo generado automaticamente por el siguiente:
Calculos.cs
namespace Listas
{
public class Calculos
{
public Calculos()
{
minEdad = float.MaxValue;
minAltura = float.MaxValue;
}
public float minEdad;
public float maxEdad;
public float minAltura;
public float maxAltura;
}
}
En este post vimos una clase similar a esta que se encargara de almacenar los valores maximos y minimos de altura y edad de las personas que agreguemos, pero para este caso solamente una declaracion de las variables a utilizar y en el constructor definimos que las variables que almacenen el valor minimo de edad y altura comiencen con un valor para no reportar inconvenientes, con esto ya explicamos la clase, nuestra siguiente modificacion sera en la clase Program.cs donde modificaremos el codigo de la siguiente manera:
Program.cs
using System;
namespace Listas
{
class Program
{
static void Main(string[] args)
{
Personas persona = new Personas();
Calculos calcular = new Calculos();
persona.AgregarPersonas("Martin Miranda;1,69;45");
persona.AgregarPersonas("Enzo Tortore;1,80;33");
persona.AgregarPersonas("DarkZero Aleman;1,70;30");
persona.AgregarPersonas("Marta Gargaglione;1,65;40");
persona.AgregarPersonas("Raul Picos;1,72;52");
persona.AgregarPersonas("Ariel Polizzi;1,71;48");
for (int i=0; i<persona.Contar(); i++)
{
string texto = persona.Recuperar(i).ToString();
string[] s = texto.Split(';');
Console.WriteLine(s[0] + "\t" +
s[1] + "\t" + s[2]);
calcular.minAltura = Math.Min(float.Parse(s[1]),
calcular.minAltura);
calcular.minEdad = Math.Min(float.Parse(s[2]),
calcular.minEdad);
calcular.maxAltura = Math.Max(float.Parse(s[1]),
calcular.maxAltura);
calcular.maxEdad = Math.Max(float.Parse(s[2]),
calcular.maxEdad);
}
Console.WriteLine("El mas bajo tiene: " +
calcular.minAltura);
Console.WriteLine("El mas joven tiene: " +
calcular.minEdad);
Console.WriteLine("El mas alto tiene: " +
calcular.maxAltura);
Console.WriteLine("El mas vejete tiene: " +
calcular.maxEdad);
}
}
}
En este codigo primero crearemos un objeto para las personas y despues un objeto para usar la clase Calculos llamada calcular pero luego veremos su uso, para este caso vamos a agregar mas personas pero esta vez no solamente enviamos el nombre de la persona sino tambien la altura y la edad de la misma, en este caso separamos a los valores por punto y coma (;), con esto tenemos nuestras personas agregadas en el objeto persona, en este caso usamos el punto y coma para poder pasar de manera correcta la altura en formato float, veamos una linea:
persona.AgregarPersonas("Martin Miranda;1,69;45");
En realidad aqui tiene un formato string pero luego lo transformaremos, nuestro siguiente paso sera un bloque donde mostraremos todos los datos y obtendremos los valores minimos y maximos de altura y edad, veamos ese bloque:
for (int i=0; i<persona.Contar(); i++)
{
string texto = persona.Recuperar(i).ToString();
string[] s = texto.Split(';');
Console.WriteLine(s[0] + "\t" +
s[1] + "\t" + s[2]);
calcular.minAltura = Math.Min(float.Parse(s[1]),
calcular.minAltura);
calcular.minEdad = Math.Min(float.Parse(s[2]),
calcular.minEdad);
calcular.maxAltura = Math.Max(float.Parse(s[1]),
calcular.maxAltura);
calcular.maxEdad = Math.Max(float.Parse(s[2]),
calcular.maxEdad);
}
En este caso usaremos un bucle for para pasar por todos los elementos de listado en persona, nuestra primer linea sera para recuperar cada uno de los elementos a traves de la posicion informada en i a traves de Recuperar y a este dato lo transformaremos en string con ToString, nuestros siguiente paso sera usar Split para dividir a esta linea en un array, luego mostraremos cada uno de los valores por medio de las posiciones del array generado (s) para nuestro siguiente paso usaremos a calcular para asignar los valores minimos y maximos de altura y edad en las variables de la clase Calculos, para esto usamos el metodo Math.Max y Math.Min para obtener los valores maximos y minimos respectivamente, en este caso primero enviamos el valor a comparar con el almacenado actualmente si es menor (para el caso de Min) al actual reemplazara el valor en la variable y lo cambiara siempre y cuando se cumpla la condicion antes mencionada, lo mismo ocurre con Max pero con numeros grandes al actual, pero como dijimos antes el valor del split es de tipo string y para transformarlo usamos el metodo Parse de float, con esto evitamos tener errores de compatibilidad, el siguiente bloque despues del for solo se encarga de mostrar los datos en pantalla, si lo compilamos y probamos veremos la siguiente salida
C:\Users\tinchicus\Source\Repos\Listas\Listas\bin\Debug>Listas.exe
Martin Miranda 1,69 45
Enzo Tortore 1,80 33
DarkZero Aleman 1,70 30
Marta Gargaglione 1,65 40
Raul Picos 1,72 52
Ariel Polizzi 1,71 48
El mas bajo tiene: 1,65
El mas joven tiene: 30
El mas alto tiene: 1,8
El mas vejete tiene: 52
C:\Users\tinchicus\Source\Repos\Listas\Listas\bin\Debug>
Vamos a hacer las ultimas modificaciones, la primera sera en Personas.cs y agregaremos la siguiente funcion:
public Calculos PublicarValores()
{
Calculos calcular = new Calculos();
foreach(string l in listado)
{
string texto = l.ToString();
string[] s = texto.Split(';');
calcular.minAltura = Math.Min(float.Parse(s[1]),
calcular.minAltura);
calcular.minEdad = Math.Min(float.Parse(s[2]),
calcular.minEdad);
calcular.maxAltura = Math.Max(float.Parse(s[1]),
calcular.maxAltura);
calcular.maxEdad = Math.Max(float.Parse(s[2]),
calcular.maxEdad);
}
return calcular;
}
En esta funcion usaremos a la clase Calculos para dar el tipo de nuestra funcion, nuestro siguiente paso sera crear un objeto de tipo Calculos llamado calcular, nuestro siguiente paso sera crear un for generico para pasar por los elementos de listado, en este caso volvemos a hacer lo que explicamos antes, por medio de ToString convertimos la linea en string, luego usamos el split y despues por medio de Math.Max y Math.Min asignamos los valores minimos y maximos a las variables en Calculos, por ultimo devolvemos el objeto calcular para coinicidencia con el tipo de nuestra funcion, con esto debemos modificar nuestro Main de la siguiente forma:
static void Main(string[] args)
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda;1,69;45");
persona.AgregarPersonas("Enzo Tortore;1,80;33");
persona.AgregarPersonas("DarkZero Aleman;1,70;30");
persona.AgregarPersonas("Marta Gargaglione;1,65;40");
persona.AgregarPersonas("Raul Picos;1,72;52");
persona.AgregarPersonas("Ariel Polizzi;1,71;48");
Calculos publicar = persona.PublicarValores();
for (int i= 0; i < persona.Contar(); i++)
{
string texto = persona.Recuperar(i).ToString();
string[] s = texto.Split(';');
Console.WriteLine(s[0] + "\t" +
s[1] + "\t" + s[2]);
}
Console.WriteLine("El mas bajo tiene: " +
publicar.minAltura);
Console.WriteLine("El mas joven tiene: " +
publicar.minEdad);
Console.WriteLine("El mas alto tiene: " +
publicar.maxAltura);
Console.WriteLine("El mas vejete tiene: " +
publicar.maxEdad);
}
En esta ocasion eliminamos el objeto de Calculos al principio, despues volvemos a agregar a las personas, pero despues tendremos esta linea:
Calculos publicar = persona.PublicarValores();
Este objeto nos permitira instanciar a Calculos, pero no usaremos a un constructor sino que le diremos que ejecute al metodo nuevo para procesar los valores almacenados en listado y enviarlos a las variables de la clase Calculos, despues tenemos un bucle for para mostrar todos los datos de listado pero esta vez no procesara nada y despues sigue el bloque encargado de mostrar los valores de las variables de Calculos, si lo compilan y prueban deberia funcionar de la misma forma, con esto tenemos un proyecto mas funcional, para nuestra siguiente modificacion vamos a ir Listas.Test y modificaremos la clase ListasTest de la siguiente forma:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace Listas.Test
{
[TestClass]
public class ListasTest
{
[TestMethod]
public void Prueba()
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda;1,69;45");
Calculos calcular = persona.PublicarValores();
Assert.AreEqual(45, calcular.maxEdad );
}
}
}
En el caso del atributo TestMethod analizamos un metodo llamado Prueba donde creamos un objeto de la clase Personas y despues un objeto de Calculos, llamamos a PublicarValores y por medio de Assert verificabamos que maxEdad sea igual a 45, en este caso nos devuelve que es cierto pero ahora iremos a PublicarValores de la clase Personas donde haremos la siguiente modificacion en esta linea:
calcular.maxEdad = Math.Max(float.Parse(s[2]),
calcular.maxEdad);
Procedemos a comentarla:
/* calcular.maxEdad = Math.Max(float.Parse(s[2]),
calcular.maxEdad); */
Con esto basicamente lo que estamos haciendo es anular nuestra linea ya que para el lenguaje esta linea no es parte del codigo sino un comentario sobre del mismo, si volvemos a usar Prueba -> Todas las pruebas nos sucedera lo siguiente

En este caso podemos observar que el test fallo porque no puede obtener el valor de maxEdad dado que no existe la operacion para hacerlo, es decir que en realidad nuestros codigos ya estan vinculados y listos para ser testeados.
Aunque la forma de testear que vimos hasta ahora no es correcta porque en realidad hemos hecho un objeto nuevo con valores distintos a los del programa y para que nosotros sepamos si realmente esta funcionando nuestro codigo o si esta manejando los valores de forma correcta haremos lo siguiente, primero iremos al codigo que queremos probar, por ejemplo vamos a Program.cs y vamos a copiar el siguiente bloque:
persona.AgregarPersonas("Martin Miranda;1,69;45");
persona.AgregarPersonas("Enzo Tortore;1,80;33");
persona.AgregarPersonas("DarkZero Aleman;1,70;30");
persona.AgregarPersonas("Marta Gargaglione;1,65;40");
persona.AgregarPersonas("Raul Picos;1,72;52");
persona.AgregarPersonas("Ariel Polizzi;1,71;48");
Y esto lo vamos a copiar dentro del bloque de nuestro metodo Prueba quedando nuestro metodo de la siguiente forma:
[TestMethod]
public void Prueba()
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda;1,69;45");
persona.AgregarPersonas("Enzo Tortore;1,80;33");
persona.AgregarPersonas("DarkZero Aleman;1,70;30");
persona.AgregarPersonas("Marta Gargaglione;1,65;40");
persona.AgregarPersonas("Raul Picos;1,72;52");
persona.AgregarPersonas("Ariel Polizzi;1,71;48");
Calculos calcular = persona.PublicarValores();
Assert.AreEqual(45, calcular.maxEdad );
}
Aca lo que hicimos basicamente es copiar ese bloque dentro de nuestro metodo de prueba, pero no modificamos el objeto calcular ni el Assert.
Nota: no se olviden de descomentar la linea que vimos al principio, para ello simplemente eliminen el comentario que pusimos (/* ... */).
Si lo volvemos a probar, este deberia fallar nuevamente porque ahora nuestro valor de maxEdad no es mas 45, modifiquemos la linea de Assert de la siguiente manera:
Assert.AreEqual(52, calcular.maxEdad );
En este caso si lo volvemos a testear funcionara correctamente porque ahora si maxEdad sera igual a 52 pero en realidad nosotros podemos tener todos los metodos que queramos por medio del atributo TestMethod, para ello vamos a hacer otra funcion donde calcularemos el promedio de edad de las personas ingresadas, para ello vamos a agregar el siguiente bloque en la clase ListaTests.cs:
[TestMethod]
public void promedio()
{
Personas persona = new Personas();
persona.AgregarPersonas("Martin Miranda;1,69;45");
persona.AgregarPersonas("Enzo Tortore;1,80;33");
persona.AgregarPersonas("DarkZero Aleman;1,70;30");
persona.AgregarPersonas("Marta Gargaglione;1,65;40");
persona.AgregarPersonas("Raul Picos;1,72;52");
persona.AgregarPersonas("Ariel Polizzi;1,71;48");
float total = 0;
for(int i=0; i < persona.Contar();i++)
{
string[] s = persona.Recuperar(i).ToString().Split(';');
total += float.Parse(s[2]);
}
total = total / persona.Contar();
Assert.AreEqual(41.33333, total);
}
En este caso volvemos a agregar las 6 personas pero esta vez agregamos un variable de tipo float llamada total con el valor de 0, despues usaremos un bucle for donde pasaremos por todas las personas que haya en el objeto persona y este dato lo obtenemos por medio de Contar, lo que haremos en el cuerpo crearemos un objeto de tipo string llamado s donde por medio Recuperar obtenermos el elemento al cual convertiremos en string por medio de ToString y con Split lo dividiremos, nuestro siguiente paso sera agregar a total la conversion en float del valor almacenado en la tercer posicion de s (la edad) al valor anterior, con esto iremos incrementando el valor de total, nuestro siguiente paso sera dividir a total por la cantidad de elementos en persona y lo almacenaremos en total, luego usaremos en Assert para que el valor informado sea comparado con el valor de total, si lo probamos vamos a lograr esto

Pero como? porque fallo si el valor es el mismo? Esto es un error entre Visual Studio y C# porque en realidad el segundo valor lo toma como double y tambien tiene un tema con las precisiones, para solucionar esto se pueden hacer varias cosas pero la mas practica es utilizar otro constructor de AreEqual y modificarlo de la siguiente manera:
Assert.AreEqual(41.33f, total,0.01);
Este constructor nos permite por medio del ultimo modifcador decir cuantos digitos queremos despues de la coma, si ponen mas valores mas ceros tendran disponibles, para nuestro caso tambien modifique el valor inicial para que encaje con la cantidad de digitos que pase, si lo probamos nuevamente se vera esto

Como podemos ver en la imagen funciono correctamente y no nos devolvio ningun error, recuerden que pueden agregar cuantos metodos necesiten, por ultimo vamos verlo en accion en el siguiente video
Nota: El video puede variar con el ejemplo aca descripto pero el concepto es el mismo y funciona de la misma forma.
En este caso vimos primero como crear el metodo de test, luego le pegamos el codigo que queremos probar, para despues sacar el promedio de la edad, con esto hecho vimos que no lo paso, lo resolvimos, luego agregamos otra persona, vimos el error que nos genero, lo modificamos en todo lo necesario y vimos como quedo resuelto.
En resumen, hoy hemos visto como podemos integrar una clase que nos sirva para probar partes parciales o totales de ser necesarios de nuestro codigo, hemos visto como quedaron referenciadas y vinculadas desde un principio, como podemos pegarlo y probarlo, 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 $