Powered By Blogger

3 jul 2010

¿Cuales son las caracteristicas de una buena Prueba Unitaria?

El tema del testing es de los menos cubiertos por las universidades e institutos en el Peru, por lo que lo
iremos tocando poco a poco hasta cubrir todas sus aristas.

¿Cuales son las caracteristicas de una buena Prueba Unitaria?


1- Debe ser automatizada y repetible.
2- Debe ser fácil ejecutar.
3- Una vez que ha escrito, debe permanecer para el uso futuro.
4- Cualquier persona debe poder ejecutarlo.
5- Debe ejecutarse con el click de un botón.
6- Debe ejecutarse rápidamente.


Mucha gente confunde el acto de probar su software con el concepto de una prueba unitaria

Ejemplo de una simple test unitario:


Es posible escribir una prueba unitaria automatizada sin usar un Framework de prueba (Nunit).

Asumimos que tenemos una clase SimpleParser (mostrada ).
Tiene un método llamado "ParseAndSum" de el cual admita una cadena
de 0 o más números separados por comas. Si no hay números, vuelve 0. Si hay un solo número,
retorna ese número como int. Si hay números múltiples, los agrega todos para arriba y
retorna la suma (aunque, ahora, el código puede manejar solamente 0 o 1 número).


public class SimpleParser
{
public int ParseAndSum(string numbers)
{
if(numbers.Length==0)
{
return 0;
}
if(!numbers.Contains(","))
{
return int.Parse(numbers);
}
else
{
throw new InvalidOperationException(
"I can only handle 0 or 1 numbers for now!");
}
}
}


Podemos crear un proyecto de aplicación simple de consola que tenga una referencia al assembly que contiene esta clase,y podemos escribir un método " SimpleParserTests" según se muestra.
El método de la prueba invoca la clase de la producción (la clase que se probará) y después controla el valor devuelto. Si no es la que se espera, se escribe a la consola.

También coge cualquier anomalía y la escribe a la consola.


class SimpleParserTests
{
public static void TestReturnsZeroWhenEmptyString()
{
try
{
SimpleParser p = new SimpleParser();
int result = p.ParseAndSum(string.Empty);
if(result!=0)
{

Console.WriteLine(
@"***SimpleParserTests.TestReturnsZeroWhenEmptyString:
-------
Parse and sum should have returned 0 on an empty string");
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
}

Después, podemos invocar los test que hemos escrito usando un método Main simple dentro de una aplicación de la consola. El método Main se utiliza aquí como ejecutor de la prueba simple,
que invoca las pruebas uno por uno, dejándolas poner a la consola.

Porque es una ejecutable, esto se puede ejecutar sin la intervención humana.

public static void Main(string[] args)
{
try
{
SimpleParserTests.TestReturnsZeroWhenEmptyString();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}

Es responsabilidad del método de prueba coger cualquier anomalía que ocurra y escribierla a la consola, de modo que ella no interfiera con ningun funcionamiento de métodos subsecuentes.
Podemos entonces agregar más llamadas al método en el método Main como agregamos cada vez más pruebas al proyecto. Cada prueba es responsable de escribir el problema (si hay un problema) en la pantalla de la consola.