«

»

abr
29
2010

Pruebas unitarias con JUnit (básico)

Cuando nos grabamos en la cabeza el ciclo de vida clásico de un proyecto de software hay una fase por la que amenudo se pasa de puntillas, y no es que no se haga, sino que se hace de la manera que se puede y con el tiempo que quede (osea, poco y mal).

Esta situación no es culpa de nadie en concreto y de todos en general, desde la dirección de la empresa (no exige o ve un aumento de gasto “eludible”), pasando por los jefes de proyecto (en la planificación, si aparece una tarea, es con una previsión de tiempo aleatoria y sin ningún plan de pruebas predeterminado) y terminando por los programadores (nada metódicos en este punto, improvisación en los casos a probar, falta de motivación).

El final de todo esto es un conjunto de pruebas insuficientes, mal diseñadas y no reutilizables. Y subrayo lo de no reutilizable porque si estamos acostumbrados a la reutilización de código deberíamos acostumbrarnos a la reutilización de pruebas para que al modificar, corregir o ampliar funcionalidad de un componente se vuelven a pasar las pruebas junto con otras nuevas para verificar el buen funcionamiento de las modificaciones y evitar efectos colaterales inesperados.

Profesionalmente yo soy parte de la cadena y tengo mi cuota de culpa, pero en mis desarrollos personales en los que soy el mecenas, jefe de proyecto, analista, programador y hasta encargado de la limpieza, quiero, además de moverme en campos a los que no me dedico o no me dejan dedicarme para matar el gusanillo, aprender cualquier aspecto de mi profesión, hacer las cosas lo mejor posible y hablar de los temas basándome en mi experiencia personal y no soltando alguna frase que haya leído en algún libro para que parezca que sé de lo que hablo (de éstos que sueltan frases hay un montón y además llegan lejos, hay que joderse).

Para realizar pruebas unitarias en proyectos Java nos apoyaremos en el archiconocido framework JUnit, así que lo primero que haremos será bajar la última version (4.8.2 actualmente) desde http://www.junit.org.

1. ¿Qué necesitamos?

Por supuesto descargar (http://github.com/KentBeck/junit/downloads) e incluir en nuestro proyecto junit-x.x.x.jar. Y para ejecutar los casos de pruebas positivos habilitar los asertos en el entorno (en este caso Eclipse), para ello:

  1. Menú Window –> Preferences
  2. Java –> Installed JREs
  3. Editar el JRE –>Default VM arguments = -ea

2. ¿Cómo se utiliza?

Su uso es muy simple (otra cosa es obtener una buena batería de pruebas ya que esto no nos lo facilita el framework) se basa en anotaciones java:

  • @Test: Marca un método como prueba para que la herramienta lo identifique y lo ejecuta en el proceso de pruebas. Para el caso de pruebas de casos positivos se usan asertos para evaluar las operaciones y en las de casos negativos se parametriza con la excepción que debe lanzar (ej @Test (expected Exception.class) ).
  • @Before: El método marcado se ejecuta antes de cada uno de los marcados con @Test suele ser un setup inicial y compartido por todas las pruebas de la clase
  • @After: Este se ejecuta después de cada @Test y suele ser el clean de la prueba.
  • @BeforeClass: Se ejecuta una sola vez antes de la batería de pruebas definida en la clase y el método marcado debe ser static.
  • @AfterClass: Se ejecuta al final del proceso completo y el método debe ser static.
  • @Ignore: Marca un método o una clase completa para que no se ejecute (puede ser una prueba pesada que no queremos que se ejecute siempre).

Así el ciclo completo de ejecucuón será:

3. Casos de prueba

Para los casos de prueba positivos usamos assert(expresión), donde expresión es la evaluación de un método a probar con el resultado esperado. Si se lanza una excepción o el resultado no es el esperado fallará la prueba.

Y para los casos negativos (aquellos que definimos con supuestos que lanzarían excepciones) pasará la prueba si la ejecución de la prueba lanza una excepción como la que esperamos o alguna derivada de esta. Si no se lanza la excepción o una no esperada la prueba será fallida.

4. Un ejemplo de clase podría ser


package es.jromay.pruebas;

import org.junit.Test;

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.Ignore;

public class BateriaEjemplo{

private java.sql.Date tiempo1;
public static java.io.File archivo;

    @BeforeClass
    public static void inicializarEntorno() {
        archivo = Utilidades.crearFicheroTiempos();
    }

    @AfterClass
    public static void terminarEntorno() {
        Utilidades.cerrarFicheroTiempos();
    }

    @Before
    public void inicializarPrueba() {
        tiempo1 = new Date();
    }

    @After
    public void terminarPrueba() {
        Utilidades.EscribirFichero(archivo,"Tiempo prueba: " + ((new Date).getTime()-tiempo1.getTime()) +"ms");
    }

    @Test
    public void casoPositivo() {
        assert(1 == 1);
    }

    @Test(expected=<code>ArithmeticException</code>.class)
    public void casoNegativo() {
        int error = 1/0;
    }
}

5. Ejecutar en Eclipse

En el entorno, con el botón derecho del ratón Run As –> JUnit. Se lanzan las pruebas y muestra el informe de resultados numéricos y con un código de colores.

Posts relacionados:

Enlace permanente a este artículo: http://blog.jromay.es/2010/04/29/pruebas-unitarias-con-junit-basico/

4 comentarios

  1. Luis escribió:

    Vaya lavado de cara que le has metido al blog! Te ha quedado muy bien!

    Un saludo!

  2. Luis escribió:

    Mira por donde, me va a venir bien tu tutorial. Estamos con las pruebas del proyecto y me sonaba haber visto por aquí algo de junit :)

    No sabía que se podían hacer usando anotaciones. Me ha resultado curioso no tener que extender de TestCase y demás historia.

    Me quedo con las anotaciones!

    Un saludo y que disfrutes de tus vacaciones!

    PD: CAAAAMPEOONEEES!!!

  3. jhasid escribió:

    queria saber como testear método privados?? hay que utilizar otraas cosas!!

    1. Javi Romay escribió:

      Jashid, me parece que estás confundiendo pruebas con depuración. Por definición las pruebas se hace para ver el funcionamiento correcto cumpliendo la especificación definida para el uso del componente, mediante metodología de caja negra (sin conocer la implementación) o caja blanca (intentando buscar fallos conociendo la implementación). Así que se hacen sobre los métodos públicos que son los que se ofrecen a la sistema qe utilizará nuestro componente. Los métodos privados los utilizan los públicos qu estamos testeando, así que si falla la prueba habrá que encontrar el error depurando.

      Saludos.

Deja un comentario

Tu email nunca se publicará.


nueve × = 63

Puedes utilizar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Images hosting provided by ImageShack Via ImageShack Migration plugin