Escribir software de buena calidad no es solo cuestion de buenas practicas de ingenieria si no que tambien sobre tener ciertos criteros de calidad que se deben cumplir en mente, y uno de estos criterios son las pruebas uniarias.

Las pruebas unitarias son pruebas que sirven para determinar si piezas independientes de codigo funciona correctamente y de manera esperada.

En este ejemplo realizaremos un proyecto “hola mundo” en java y maven, y realizaremos unas cuantas pruebas unitarias al mismo. El proyecto lo realizaremos en eclipse y su integración con maven.

Crear el proyecto

Como primer paso necesitamos crear el proyecto de maven en eclipse. Para ello nos vamos a File -> New -> Project y nos aparece el siguiente diálogo:

Seleccionamos “Maven Project” para que nos genere los archivos necesarios. y en el siguiente paso seleccionamos estas casillas

Ahora hay que configurar el proyecto resultante, para que genere un artefacto de maven.

Manos al código!

Ahora que ya tenemos eso, abrimos nuestro archivo pom.xml y agregamos la siguiente dependencia justo después de la descripcion:

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
  </dependency>
</dependencies>

Ahora dentro del proyecto (src/main/java) creamos una clase que es la que vamos a probar, digamos que es la siguiente:

package com.ricardogeek;

public class JUnitHelloWorld {
		
	public boolean isGreater(int num1, int num2){
		return num1 > num2;
	}
}

Una clase simple que dice si un numero es mas grande que el otro. Ahora bien procedemos a crear las pruebas unitarias para esta clase. Para ello es necesario que conozcamos algunas anotaciones importantes para los métodos de la clase de prueba.

@BeforeClass: Es usado para escribir código que correra antes de todas las pruebas.
@Before: Código que correra antes de cada uno de los tests
@Test: Código de la prueba unitaria
@After: Código que corre antes de cada una de las pruebas
@AfterClass: Código que corre despues de todas las pruebas.

Ahora escribimos la clase que prueba la clase anterior, por convención la nombramos igual solo que con la palabra “Test” al final. Y debe estar alojada en el mismo paquete, solo que esta vez en la ruta src/test/java

package com.ricardogeek;

import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.BeforeClass;
import org.junit.Before;
import org.junit.AfterClass;
import org.junit.After;


public class JunitHelloWorldTest {
	private static JUnitHelloWorld helloWorld;
	
	@BeforeClass
	public static void beforeClass() {
		System.out.println("Antes de todas");
		helloWorld = new JUnitHelloWorld();
	}
	
	@Before
	public void before() {
		System.out.println("Antes de cada una");
	}
	
	@Test
	public void isGreaterTest() {
		System.out.println("La Prueba");
		assertTrue("Num 1 no es mayor que Num 2", helloWorld.isGreater(4, 3));
	}
	
	@After
	public void after() {
		System.out.println("Despues de cada una");
	}
	
	@AfterClass
	public static void afterClass() {
		System.out.println("Despues de todas");
	}
}

Como pueden ver el método que probamos lo anotamos como @Test, y se llama igual que en la clase que estamos probando.

En el método anotado como @BeforeClass creamos una nueva instancia de la clase que estamos probando para poder usarla durante todas las pruebas. Si tuvieramos mas métodos, y campos que son modificados convendría restaurar la instancia a su valor inicial antes de cada prueba.

Las demás anotaciones estan puestas para ejemplificar y que se den cuenta del momento en que corren.

Y finalmente el método anotado como @Test es la prueba unitaria. En este caso usamos el método JUnit   assertTrue que recibe como parámetro inicial un string, este string es el mensaje de error en caso de que la prueba falle, y como segundo parámetro un booleano dado por el método de la clase.

Para correr las pruebas del proyecto nos vamos a Run -> Run as… -> JUnit Tests

Al hacerlo encontramos en la parte inferior del IDE lo siguientes resultados de las pruebas:

Y si nos cambiamos a la pestaña de Consola vemos el orden en que se ejecutaron los métodos etiquetados.

Bien este fue una breve demostracion de como pueden hacer pruebas unitarias para su codigo. En posts futuros hablaremos más a fondo de los features de JUnit, de su integración con maven y de desarrollo guiado por pruebas (TDD).

Un Saludo!

Tagged in:

, , ,