viernes, 15 de junio de 2012

Introducción


Hoy en día las metodologías ágiles están siendo utilizadas en muchas empresas. Y si hablamos de metodologías ágiles, tenemos que hablar de TDD (Test Driven Development), y, especialmente, si desarrollamos en Java, hablamos de JUnit.

JUnit es un framework que nos permite realizar y automatizar pruebas de nuestras aplicaciones Java.

Implementando TDD en nuestros proyectos podremos detectar errores a tiempo y poder desarrollar una aplicación más eficiente, obviamente también depende mucho de la sinceridad que tenga el programador al momento de plantear sus pruebas. Lo recomendable es tratar de hacer que las pruebas fallen para poder tener un campo de visión más amplio de lo que podría suceder en nuestra aplicación.

Instalación


Si usas el IDE de Eclipse o SpringSource, sólo necesitas añadir la librería al momento de crear tu proyecto Java en la opción Libraries / Add Library.

Notaciones

  • @BeforeClass: Se ejecuta una sola vez antes de todas las pruebas.
  • @Before: Se ejecuta antes de cada prueba.
  • @AfterClass: Se ejecuta al final de todas las pruebas.
  • @After: Se ejecuta al final de cada prueba
  • @Test: Indica que es una prueba que se debe ejecutar.
  • @Test(expected=IOException.class): La prueba será validada si se lanza una determinada excepción.
  • @Test(timeout=1000): La prueba tendrá un tiempo límite de ejecución, expresado en milisegundos. Si se excede el tiempo, la prueba fallará.
  • @Ignore: Indica que es una prueba que no se debe ejecutar.

Métodos Básicos de la clase Assert

  • assertTrue(): Prueba si una conodición es verdadera.
  • assertFalse(): Prueba si una condición es falsa.
  • assertEquals(): Compara dos valores dados.
  • assertNull(): Prueba que el valor dado sea nulo.
  • assertNotNull(): Prueba que el valor dado no sea nulo.

Ejemplos


A continuación crearemos una clase Calculadora que tendrá como métodos sus funciones básicas de sumar, restar, multiplicar y dividir.

package com.ejemplos;

public class Calculadora {
 
    private int numeroOperaciones = 0;

    public int sumar(int valor1, int valor2){
        int resultado = valor1 + valor2;
        return resultado;
    }
 
    public int restar(int valor1, int valor2){
        int resultado = valor1 - valor2;
        return resultado;
    }

    public int multiplicar(int valor1, int valor2){
        int resultado = valor1 * valor2;
        return resultado;
    }
 
    public int dividir(int valor1, int valor2){
        int resultado = valor1 / valor2;
        return resultado;
    }

    public void contarOperacion(){
        this.setNumeroOperaciones(this.getNumeroOperaciones() + 1);
    }
 
    public int getNumeroOperaciones() {
        return numeroOperaciones;
    }

    public void setNumeroOperaciones(int nOperaciones) {
        this.numeroOperaciones = nOperaciones;
    }
}

Ahora implementaremos sus pruebas unitarias:

package com.ejemplos;

import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class TestCalculadora {
 
    private static Calculadora calc;
    private int valor1;
    private int valor2;
 
    @BeforeClass
    public static void setUpClass(){
        calc = new Calculadora();
    } 
 
    @Before
    public void setUp(){  
        valor1 = 12;
        valor2 = 4;
    }
 
    @Test
    public void testSuma(){
        assertEquals("Error en sumar()!", 16, calc.sumar(valor1, valor2));
    }
 
    @Test
    public void testResta(){
        assertEquals("Error en restar()!", 8, calc.restar(valor1, valor2));
    }
 
    @Test
    public void testMultiplicacion(){
        assertEquals("Error en multiplicar()!", 48, calc.multiplicar(valor1, valor2));
    }
 
    @Test
    public void testDivision(){
        assertEquals("Error en dividir()!", 3, calc.dividir(valor1, valor2));
    }
  
    @Test(expected = ArithmeticException.class)  
    public void testDivisionConException() {  
        calc.dividir(valor1, 0);
    }  
 
    @Ignore("Aun no esta listo para testear")
    @Test
    public void testPotencia(){
        // Implementando
    }
 
    @Test(timeout = 2)
    public void testSumaExpira() {
        for(int i=0; i<500000; i++){
            calc.sumar(valor1, i);
        }
    } 
 
    @After
    public void tearDown(){  
        calc.contarOperacion();
    }
 
    @AfterClass
    public static void tearDownClass(){
        assertEquals("Numero de operaciones realizadas", 4, calc.getNumeroOperaciones());
    calc = null;
    }
}

A continuación les presento otro ejemplo con listas:

package com.ejemplos;

import static org.junit.Assert.assertEquals;

import java.util.ArrayList;

import org.junit.Before;
import org.junit.Test;

public class TestArrayList {
 
    private ArrayList<String> lst;
 
    @Before
    public void setUp(){  
        lst = new ArrayList<String>();
        lst.add("Jorge"); // indice 0
        lst.add("Manuel"); // indice 1
    }
 
    @Test
    public void testInsertar(){

        assertEquals("Numero de elementos", 2, lst.size());
        lst.add(1, "Fernando");
        assertEquals("Numero de elementos", 3, lst.size());
        assertEquals("Jorge", lst.get(0));
        assertEquals("Fernando", lst.get(1));
        assertEquals("Manuel", lst.get(2));
    }
 
    @Test
    public void testMofificar(){

        assertEquals("Numero de elementos", 2, lst.size());
        lst.set(1, "Fernando");
        assertEquals("Numero de elementos", 2, lst.size());
        assertEquals("Jorge", lst.get(0));
        assertEquals("Fernando", lst.get(1));
    }
}

Espero estos pequeños ejemplos les hayan sido de utilidad.