Pruebas unitarias con JUnit

Automatización de pruebas

Mediante las pruebas unitarias garantizamos que una parte del código funciona como se espera.  Este tipo de pruebas son codificadas por el usuario, utilizando una serie de funciones o métodos de una clase.

Este conjunto de clases (En el caso de JAVA), se denomina Frameworks y nos proporciona las herramientas a modo de métodos y anotaciones, para llevar a cabo las pruebas, codificando algoritmos que comparan el resultado dado por el programa con el resultado que se espera.

Para JAVA tenemos el caso de JUnit,  este  framework  resulta muy útil para realizar y automatizar estas pruebas.

Como ya hemos comentado, una prueba unitaria se caracteriza por realizar una comparación del resultado esperado de un método con lo retornado por la codificación.

Esta comparación puede ser con cualquier tipo de dato, ya sean numéricos, cadenas de texto, booleanos o incluso excepciones. El único requisito para que una prueba unitaria resulte efectiva es que tenga únicamente dos posibilidades de resolución (correcta/incorrecta).

JUnit forma parte de las versiones mas actuales de Netbeans y Eclipse, aunque si usamos alguna versión que no lo traiga incluido, se puede instalar desde el “market” de cada aplicación fácilmente.

Las ventajas principales de JUnit son:

  • Es de código abierto.
  • Podemos crear anotaciones para identificar los métodos de ensayo.
  • Funciona a base de aserciones.
  • Es sencillo de aplicar.
  • Se pueden ejecutar de forma automática.
  • Permite realizar suites de pruebas.
  • Además del error nos proporciona información.

Las clases principales que nos encontramos en JUnit son:

  • Assert: contienen un conjunto de métodos de aserción.
  • TestCase: contienen un caso de prueba definido como accesorio para ejecutar varias pruebas.
  • TestResult: contienen métodos para recoger los resultados de la ejecución de un caso de prueba.

Además disponemos de anotaciones como @RunWith y @Suite, qur nos permitirán ejecutar baterías de pruebas.

JUnit se encarga de ejecutar todos los métodos testxxx() que contiene la clase.

En el siguiente ejemplo el único método con este nombre es testConcat(), por tanto JUnit lo ejecutará. Dentro de testConcat() hay una llamada al método assertTrue(). Este método comprueba si la expresión que recibe como argumento es cierta, y trasmite el resultado a JUnit.


Para conocer más a fondo el uso de JUnit, tanto en NetBeans como en Eclipse, y su funcionamiento básico, te recomendamos las siguientes lecturas:

Tutorial JUnit (Eclipse)

JUnit es una biblioteca de Java que te ayuda a realizar pruebas unitarias. https://courses.cs.washington.edu/courses/cse143/11wi/eclipse-tutorial/junit.shtml

Tutorial JUnit (NetBeans)

Este tutorial presenta los conceptos básicos de escritura y ejecución de pruebas de unidad JUnit en el IDE NetBeans. https://netbeans.org/kb/docs/java/junit-intro.html


La clase JUnit

Como sucede con todo lo referente a JAVA, al hablar de JUnit estamos refiriéndonos a un conjunto de clases, desde las cuales ejecutaremos los métodos para implementar las pruebas.

Estas clases heredan de junit.framework.TestCase.  En el caso de los métodos de prueba veremos que comienzan por test.

El procedimiento para realizar las pruebas es sencillo, una vez tenemos creada la clase, definimos los métodos(Test) donde ejecutaremos los métodos del programa y mediante los assert comprobaremos si el resultado es el que le indicamos.

En el código anterior vemos dos métodos de prueba, el primero usamos el constructor de nuestro programa y comprobamos que el saldo este en 0.

En el segundo utilizamos un método ingresar, donde añadimos 100 € y comprobamos que el nuevo saldo sea el esperado.

Una vez que codifiquemos nuestros casos de prueba, la herramienta JUnit se encargará de validar los resultados y mostrarlos.

Ventanas de JUnit para mostrar el resultado de la prueba.

Métodos JUnit

JUnit dispone de los métodos Assert para probar que los resultados sean los esperados por la  ejecución de nuestro código. Estos métodos permiten especificar un error, el resultado esperado  y el resultado real.

Estos métodos son:

  • assertArrayEquals()
  • assertEquals()
  • assertTrue()
  • assertFalse()
  • assertNull()
  • assertNotNull()
  • assertSame()
  • assertNotSame()
  • assertThat()

Veamos algunos ejemplos de aplicación:

assertArrayEquals()

Con el método assertArrayEquals() comparamos el array de prueba con el array generado por nuestro código, determinando si el resultado es el esperado.

assertEquals()

Con el método assertEquals() comprobamos si el dato resultante tiene el valor deseado.

assertTrue() y assertFalse()

Con los métodos assertTrue() y assertFalse() validamos si un resultado es verdadero o falso.

Anotaciones JUnit

Para crear un método test dentro de una clase tenemos que añadir la anotación “@test”.

A continuación detallamos algunas anotaciones existentes:

  • @RunWith. Se le asigna una clase a la que se invocará en lugar del ejecutor por defecto.
  • @Before. Indicamos que el método se debe ejecutar antes de cada test (precede al método setUp).
  • @After. Indicamos que el siguiente método se debe ejecutar después de cada test.
  • @Test. Indicamos que es un método de test.

En algunos casos el resultado de la ejecución puede ser una excepción. Mediante la anotación @Test podemos indicar la excepción esperada.

Otra forma de realizar la prueba es utilizando el método fail, que nos indica un fallo en la prueba.

De este modo, mediante un bloque try-catch, podemos capturar la excepción esperada si el método falla.

Suites de pruebas

Cuando desarrollamos un programa la cantidad de métodos puede crecer considerablemente.

Esto provoca que debamos agrupar diferentes casos de prueba para ejecutarlos a la vez.

Mediante las suites podemos agrupar métodos de prueba para ejecutarlos de forma conjunta.

Ejemplo de uso

Vamos a realizar un ejemplo de uso de JUnit sobre una aplicación muy sencilla que calcule el precio con IVA de un producto.

Diseño de nuestra aplicación.

 

Declaración de atributos y constructores.

Una vez tenemos nuestro pequeño programa, vamos a generar la clase de pruebas con JUnit.

Crear clase JUnit

Al ser la primera vez que lo utilizamos, Eclipse no nos mostrara el acceso en el menú inicial, por lo que le damos a «Other…».

 

Configuración de la clase.

 

Seleccionamos la opción JUnit Test Case y en la ventana seleccionamos la versión de JUnit a utilizar y el nombre que le daremos a la clase de pruebas.

Métodos de prueba, el primero compara el valor del precio con PVP y el segundo con el IVA añadido.

Resultado de la prueba.

Pruebas parametrizadas

En algunas ocasiones no es suficiente comprobar el resultado con un solo dato, necesitando enviar una batería de datos para comprobar que el método funciona correctamente.

Con JUnit podemos parametrizar pruebas, enviando mediante una lista una serie de datos a comprobar.