sábado, 4 de julio de 2009

JUnit y Assert en Java

Que es Junit ?

Es un framework o conjunto de librerias, que se utilizan en las aplicaciones escritas en lenguaje

java las cuales puden ser testeadas apartir de pruebas unitarias con la ayuda de este framework

la cual proporciona clases de las cuales se pueden heredar para formar las nuevas clases que

seran las que realizen las pruebas unitarias ha cada una de las clases que conformen nuestra

aplicacion o proyecto, una prueba puede estar conformada por una serie de datos, utilizacion y

resultados, este ultimo se compara con los datos que en realidad deberia de mostrar el software

para tener un conocimiento si nuestra aplicacion esta cumpliendo con hacer lo solicitado.

Para iniciar con la construccion del testeo habra que creear una clase que herede de TestCase

del paquete junit.framewok para cada una de las clases de nuestra aplicacion y por cada metodo

que tengamos hacer tambien un metodo de prueba, cuyos nombre de metodos empiezen por

"test" y dentro de estos aplicar los diferentes ASSERT.


Que es un Assert ?

Es una clase del paquete junit.framework la cual nos proporciona un conjunto de metodos los cuales

son lo que realmente hacen la prueba si un metodo especifico de nuestra clase esta hacien las cosas

correctamente como deberia, y el funcionamiento de estos metodos no es complicada simplemente

si la condicion da algun tipo de error entonces la prueba no cumple con lo solicitado es decir que se

genero un error en la prueba unitaria.



A continuacion una lista de las pruebas que nos proporciona Assert:


assertArrayEquals ( byte[] esperado, byte[] real )

Afirma que dos matrices de bytes son iguales.

assertArrayEquals ( char[] esperado, char[] real )

Afirma que dos conjuntos de caracteres son iguales.

assertArrayEquals ( int[] esperado, int[] real )

Afirma que dos matrices son iguales int.

assertArrayEquals ( long[] esperado, long[] real )

Afirma que dos matrices son iguales largo.

assertArrayEquals ( Object[] esperado, Object[] real )

Afirma que dos conjuntos de objetos son iguales.

assertArrayEquals ( short[] esperado, short[] real )

Afirma que dos breves conjuntos son iguales.

assertArrayEquals (String mensaje, byte[] esperado, byte[] real)

Afirma que dos matrices de bytes son iguales.

assertArrayEquals ( String mensaje, char[] esperado, char[] real )

Afirma que dos conjuntos de caracteres son iguales.

assertArrayEquals ( String mensaje, int[] esperado, int[] real)

Afirma que dos matrices son iguales int.

assertArrayEquals ( String mensaje, long[] esperado, long[] real )

Afirma que dos matrices son iguales largo.

assertArrayEquals ( String mensaje, Object[] esperado, Object[] real)

Afirma que dos conjuntos de objetos son iguales.

assertArrayEquals ( String mensaje, short[] esperado, short[] real )

Afirma que dos breves conjuntos son iguales.

assertEquals (double esperado, double real, double delta)

Afirma que dos doubles o float son iguales dentro de un delta.

assertEquals ( long esperado, long real )

Asserts that two longs are equal. Afirma que dos largos son iguales.

assertEquals (Object esperado, Object real )

Afirma que dos objetos son iguales.

assertEquals (String mensaje, double esperado, double real, double delta)

Afirma que dos doubles o float son iguales dentro de un delta.

assertEquals ( String mensaje, long esperado, long real )

Afirma que dos long son iguales.

assertEquals ( String message, Object expected, Object actual )

Afirma que dos objetos son iguales.

assertFalse ( boolean condicion )

Afirma que una condición es falsa.

assertFalse (String mensaje, boolean condicion)

Afirma que una condición es falsa.

assertNotNull (Object objeto)

Afirma que un objeto no es nulo.

assertNotNull (String mensaje, Object objeto)

Afirma que un objeto no es nulo.

assertNotSame (Object noEsperado, Object real)

Afirma que dos objetos no se refieren al mismo objeto.

assertNotSame (String mensaje, Object noEsperado, Object real)

Afirma que dos objetos no se refieren al mismo objeto.

assertNull (Object objeto)

Afirma que un objeto es nulo.

assertNull ( String mensaje, Object objeto)

Afirma que un objeto es nulo.

assertSame (Object esperado, Object real)

Afirma que dos objetos se refieren al mismo objeto.

assertSame (String mensaje, Object esperado, Object real) Afirma que dos objetos se refieren al mismo objeto.

assertTrue (boolean condicion) Afirma que una condición es verdadera.

assertTrue (String mensaje, boolean condicion) Afirma que una condición es verdadera.

fail () Falla una prueba y sin mensaje.

fail (String message) Falla una prueba con un mensaje dado.



CREANDO UNAS PRUEBAS PARA UNAS CLASES EN NETBEANS


Primero que nada creamos un nuevo proyecto, y por ejemplo creamos la clase llamada Usuario, en el podremos agregar un metodo que nos pida como parametros el anio de nacimiento del usuario y que
nos devuelva la edad que tiene el usuario, seria un metodo asi:

int agregarANacimiento(int anio)
{
this.edad = 2009 - anio;
return this.edad;
}

Ahora creamos seleccionamos la clase que contiene este metodo, nos vamos a la opciones de herramientas
de NETBEANS seleccionamos la opcion de CREATE JUNITS TEST nos aparece una ventanita donde podemos elegir algunas opciones que deseemos como los comentarios y algunos otros metodos que pueden ser generados automaticamente, nos despreocupamos de eso por el momento y clikeamos en la opcion OK, esto hace que se genere una nueva clase con el postfijo TEST es decir en mi caso la claseseria UsuarioTest.java aca estan los metodos que podemos utilizar para realizar nuestras pruebas unitarias haciendo uso de ASSERTS como vamos ha ver a continuacion

public void testAgregarANacimiento() {
System.out.println("agregarANacimiento");
int anio = 0;
Usuario instance = new Usuario();
int expResult = 0;
int result = instance.agregarANacimiento(anio);
assertEquals(expResult, result);
// TODO review the generated test code and remove the default call to fail.
fail("The test case is a prototype.");
}

el codigo anterior es lo que nos genera NETBEANS, ahora supongamos q OBLIGATORIAMENTE los usuarios deben tener una edad igual a 18 años, entonces podemos hacer uso del metodo "assertEquals" para comparar si el metodo agregarANacimiento(int anio) devuelve un valor igual a 18, para asi determinar si el usuario tiene 18 años, modificando el codigo generado queda de la siguiente forma.

public void testAgregarANacimiento() {
System.out.println("agregarANacimiento");
int anio = 2000;
Usuario instance = new Usuario();
int expResult = 18;
int result = instance.agregarANacimiento(anio);
assertEquals("USTED NO TIENE 18 años",expResult, result);

}

podemos darnos cuenta que "anio" ahora tiene un valor de 2000 esto quiere decir que al querer hacer el calculo de la edad tendremos un resultado igual a 9, por lo que el metodo

assertEquals("USTED NO TIENE 18 años",expResult, result);

espera un resultado igual a 18, sino es asi lanza el mensaje que nosotros queramos que seria el primer parametro enviado, luego el "expResult" es donde hemos dicho que lo compare con el valor de 18 y "result" es el resultado de la operacion realizada por el metodo que se esta testeando(probando), ahora para probarlo seleccionamos la clase de prueba en este caso UsuarioTest.java y le damos click derecho y le damos RUN, observamos lo siguiente


podemos observar que aparece el mensaje que nosotros definimos si quisieramos que el TEST o prueba sea satisfactorio unicamente deberemos colocar un valor a "expResult" de 9 q es el resultado de 2009 - 2000 o restarle con un anio igual 1991 y eso es lo que nos dara como resultado una prueba satisfactoria.