martes, 13 de marzo de 2012

Pruebas unitarias con junit

Si has oído hablar de pruebas de software, has oído hablar de junit, incluso de alguno de sus sucesores, xunit, etc.

Junit es un framework de pruebas, es decir toda la parafernalia que vas a necesitar poner en tu código java para poder hacer pruebas unitarias de software.

Una prueba unitaria es la prueba de un módulo de software, como puedes adivinar cuantos más módulos tenga una aplicación, más pruebas tendremos que realizar. Si las pruebas las podemos automatizar de alguna manera las podremos repetir tantas veces como sea necesario y dedicar nuestro tiempo a revisar los informes de pruebas y retocar la aplicación, más que a probar y probar, generar los informes, revisar los informes y retocar la aplicación.

Acabo de describir el proceso de integración continua, descargar del sistema de control de versiones el fuente de la aplicación, compilarlo, y realizar las pruebas unitarias y de integración de los módulos. Al ir probándose el código cada cierto tiempo, no nos encontraremos con las sorpresas de último momento.

Volviendo a las pruebas unitarias, ¿cuáles son las características de una prueba unitaria?

  • Independiente: una prueba no debe afectar a las otras.
  • Completa: deben cumplir la mayor parte, o la totalidad, del código.
  • Repetible: una prueba tiene que poderse ejecutar tantas veces sea necesario.
  • Automatizable: una prueba debe ejecutarse sin intervención manual.
  • Profesional: una prueba no deja de ser código, por lo que deben estar documentadas, y bien diseñadas.

Existen varios frameworks de pruebas, testng, junit, y otros, aunque ahora veremos como utilizar junit.

Primero tenemos que tener claro que porción de código queremos probar, en nuestro caso será esta nueva clase que estoy desarrollando:

public class Mathematica {

public static int add (int a, int b){
return a+b;
}

}

Los requerimientos, que tenemos que tener en cuenta tambien en la fase de pruebas unitarias, nos dicen que la funcion add aplicada sobre dos números enteros nos devolverá la suma aritmética de ambos.

Por ello nos disponemos a crear nuestros casos de prueba, vamos a crear 4 casos:

  1. 3+2 = 5
  2. 3+0 = 3
  3. 0+2 = 2
  4. 3+2 != 4

Creamos el típico caso de “happy path”, o que seguro sabemos que podemos cumplir. Muchos programadores nos quedamos aquí, pero tenemos que probar tambien ciertos límites como la suma con cero, y que el valor que obtenemos es diferente de cualquier otro.

Para estas pruebas básicas usamos dos funciones del framework junit:

  • assertEquals(x,y) que compara dos valores x e y (está implementado para casi todos los tipos de datos.
  • assertFalse(z) que verifique un valor booleano.

Tenemos que crear una clase que extienda la clase del framework TestCase:

public class TestMathematica extends TestCase

Y dentro aquellos métodos de prueba correspondientes a los casos de prueba, estos métodos de prueba comienzan con la palabra test.

Por ejemplo, para el primer caso de prueba:

public void testAdd100 (){
int num1 = 3;
int num2 = 2;
int total = 5;
int sum = 0;
sum = Mathematica.add(num1, num2);

assertEquals(sum, total);
}


Para realizar la ejecución de los casos de prueba hay varias formas, con eclipse, netbeans, maven, y ant, por poner algunos ejemplos. Por ejemplo veamos como hacerlo con ant



                 






Al ejecutar la clase TestMathematica resultará:

testMath:
[junit] Running com.blog.TestMathematica
[junit] Tests run: 4, Failures: 0, Errors: 0, Time elapsed: 0 sec

El código completo de la clase de pruebas es:

public class TestMathematica extends TestCase {

public void testAdd100 (){
int num1 = 3;
int num2 = 2;
int total = 5;
int sum = 0;
sum = Mathematica.add(num1, num2);

assertEquals(sum, total);
}

public void testAdd200 (){
int num1 = 3;
int num2 = 0;
int total = 3;
int sum = 0;
sum = Mathematica.add(num1, num2);
assertEquals(sum, total);
}

public void testAdd300 (){
int num1 = 0;
int num2 = 2;
int total = 2;
int sum = 0;
sum = Mathematica.add(num1, num2);
assertEquals(sum, total);
}

public void testAdd400 (){
int num1 = 3;
int num2 = 2;
int total = 4;
int sum = 0;
sum = Mathematica.add(num1, num2);
boolean condition = sum==total;
assertFalse(condition);
}

}

1 comentario:

  1. Hola se puede aplicar este concepto en aplicaciones android????

    ResponderEliminar