Lectura 22 - Introducción A NUnit
Lectura 22 - Introducción A NUnit
Lectura 22 - Introducción A NUnit
3. Pasos a Seguir
Si nunca has escrito un test NUnit puedes conseguir una plantilla para empezar. El
fichero se puede conseguir desde el CVS de mono y es:
mcs/class/doc/TemplateTest.cs
Copia esta plantilla en otro fichero y empieza a modificar, en esa plantilla, tienes
unas marcas "[algo que poner]" que indican que debes poner en cada uno, ve
rellenándolos con el código apropiado, la plantilla esta llena de comentarios para
darte pistas sobre como debes seguir, también es buena idea ver otros tests para ver
ejemplos reales de tests. En
mcs/class/corlib/Test/System.Collections/CollectionBaseTest.cs tienes un test
cortito.
El directorio que contendrá el fichero que depende del "assembly"/espacio de
nombres de la clase dependerá sobre que estés creando el test. En mcs/class hay un
directorio para cada "assemby". En cada "assembly" hay un directorio Test, por
ejemplo dentro de mcs/class/corlib/Test. In el directorio test donde estemos, hay
subdirectorios con cada espacio de nombres en el "assembly", por ejemplo
mcs/class/corlib/Test/Sytem., Pon tu nuevo test en el subdirecorio apropiado.
Una vez que la clase test este completa, debes añadirla al fichero "AllTests.cs" en el
mismo directorio que tu nuevo test, Añade una llamada a "suite.AddTest()" pasando
el nombre de tu nuevo test como parámetro. Allí hay bastantes ejemplos de como
hacerlo.
Una vez todo esto este hecho, puedes hacer un "make test" desde el directorio raíz
de mcs. Tu test de clase será incluido automáticamente en la construcción junto con
el resto de los tests.
Es mejor usar una cadena única para cada Assert(), para que así sea fácil localizar donde
ha fallado el test. De otra forma seria difícil saber donde ha fallado el test
Mal:
AssertEquals("array match", compare[0], i1[0]);
AssertEquals("array match", compare[1], i1[1]);
AssertEquals("array match", compare[2], i1[2]);
AssertEquals("array match", compare[3], i1[3]);
Bien:
AssertEquals("#A01", compare[0], i1[0]);
AssertEquals("#A02", compare[1], i1[1]);
AssertEquals("#A03", compare[2], i1[2]);
AssertEquals("#A04", compare[3], i1[3]);
Una vez hayas usado un numero en un Assert(), no lo cambies luego, la gente puede
usarlos para identificar errores.
4.3. Constructores
Cuando escribas el Test, asegúrate que un constructor no toma ningún argumento.
public class DateTimeTest : TestCase
{
public DateTimeTest() : base ("[MonoTests.System.DateTimeTest]") {}
public DateTimeTest (string name): base(name) {}
}
}
Usando NUnit
Pruebas al Código en .NET
Hoy en día las unidades de prueba (unit testing) se han convertido en una poderosa
herramienta de pruebas al código, ganando popularidad día con día, sobre todo en las
empresas dónde los proyectos de software comúnmente alcanzan varios niveles de
complejidad. Unit Testing, es una de la más importantes prácticas de la metodología
de programación XP (eXtreme Programming).
Un poco más...
Si ponemos como ejemplo una clase llamada Cálculos, dónde uno de los métodos se
encarga de dividir dos números y devolver el resultado. El conjunto de pruebas deberá
consistir en muchas operaciones simulando los casos más excepcionales, como la
división sobre 0.
Estas pruebas de realizarse de forma tradicional, esto es ejecutando la aplicación,
cuando el proyecto es considerablemente extenso podrá tomar bastante tiempo el
realizarlas; o bien, con un solo click, usando las unidades de prueba. Ejecutándose
Sobre Nunit
Inicialmente portada de JUnit (Java Unit, unidad de pruebas para clases en Java), esta
herramienta de pruebas para .NET se encuentra en su segunda revisión mayor, la
versión 2. Enteramente escrita en C#, ha sido rediseñada para tomar ventaja de muchas
de las características de los lenguajes .NET, por ejemplo atributos personalizados y
otras capacidades relacionadas con la reflexión. Hay que resaltar que esta utilidad es de
distribución libre, en la página del proyecto (http://nunit.sourceforge.net) puedes
encontrar el código fuente de esta gran herramienta.
}
public void Transferencia(Cuenta Destino, float Cantidad)
{
}
public float Balance
{
get
{
return balance;
}
}
}
}
El código de la clase CuentaTest:
//Importamos los espacios de nombres
using System;
using NUnit.Framework;
namespace Banco
{
[TestFixture] // Establecemos el atributo que índica la clase que contiene las pruebas.
public class CuentaTest
{
public CuentaTest(){}
[Test] //Especificamos cuál es el método de prueba.
public void Transferencias()
{
//creamos la cuenta origen con un saldo de 200.00
Cuenta origen = new Cuenta();
origen.Deposito(200.00F);
//creamos la cuenta destino con un saldo de 150.00
Cuenta destino = new Cuenta();
destino.Deposito(150.00F);
//transferimos 100.00 de la cuenta origen a la destino
origen.Transferencia(destino, 100.00F);
//sí todo ha salido bien, debemos tener
Antes de continuar hay que mencionar que el atributo [Test] es el que indica a NUnit
qué método está marcado para prueba dentro de la clase que ha sido establecida con
[TestFixture]. Este método debe respetar una cierta signatura.
public void MethodName()
El Método estático AreEqual de la clase Assert, compara dos tipos, si no son iguales
genera una Exception del tipo AssertException. Este método tiene varias sobrecargas
que facilitan este tipo de comparaciones.
Ahora:
Compilamos la librería
Abrimos la interfaz gráfica de NUnit (usualmente ubicada en menú programas).
Cargamos el ensamblado (Menú File > Open) Imagen.
Presionamos el botón Run, para comenzar las pruebas. Imagen.
Obtenemos una barra de color rojo, con varios mensajes de error. Todo normal, ya que
el método de prueba que hemos escrito contiene dos líneas que verifican que los valores
obtenidos dentro de las operaciones sean los que se esperan.
Assert.AreEqual(250.00F, destino.Balance);
Assert.AreEqual(100.00F, origen.Balance);
Y al no contar con código dentro del método de "Transferencia" los valores nunca se
equilibran al realizar las operaciones.
Ahora, sin cerrar la ventana de la GUI de NUnit, modificamos el método de
"Transferecia" con:
public void Transferencia(Cuenta Destino, float Cantidad)
{ Destino.Deposito(Cantidad);
Retiro(Cantidad); }
Recompilamos la librería.
Automáticamente se recarga el ensamblado en el GUI de NUnit.
Volvemos a correr las pruebas.
Ahora, al realizar todas la operaciones correctamente, obtenemos una barra verde
sin ningún mensaje de error. Imagen.