miércoles, 13 de abril de 2011

Diseño de Pruebas Unitarias

Programación Orientada a Objetos - Semana 11 - Reporte 10

Mientras desarrollamos una aplicación atravesamos varias fases, pero no hay fase de desarrollo más importante que la fase de pruebas.
Con las pruebas comprobamos que nuestro código realmente haga lo que esperamos y especificamos, y que cumpla con los requerimientos establecidos al inicio.

Las Pruebas Unitarias (Unit Test), se consideran las más importantes para garantizar un proyecto exitoso. Dichas pruebas se encargan de probar clases aisladamente y están relacionadas con el código y responsabilidad de cada clase y sus fragmentos de código más críticos.

Por ejemplo: una clase que sume dos números, y devuelva el resultado. La prueba se encargara de probar el método y verificando que efectivamente sume dos números correctamente y devuelva el resultado correcto.

Ventajas de las Pruebas Unitarias

  • Asegura calidad del código entregado.
  • Es la mejor forma de detectar errores tempranamente en el desarrollo. No obstante, esto no asegura detectar todos los errores, por tanto prueba de integración y aceptación siguen siendo necesarias.
  • Ayuda a definir los requerimientos y responsabilidades de cada método en cada clase probada.
  • Permite encontrar errores o bugs tempranamente en el desarrollo.

Entre muchas otras ventajas, como probar la eficiencia de nuestro código ante el estrés (tiempos de espera y de ejecución).

Proceso

Los pasos para crear pruebas unitarias exitosas son los siguientes:

  • Antes de implementar una determinada funcionalidad, piensa cómo deberías probarla para verificar que se comporta correctamente. Esto permite desarrollar la funcionalidad teniendo las ideas muy claras de lo que debería hacer.
  • Escribe el código que implementa la funcionalidad deseada.
  • Escribe el código de las pruebas inmediatamente después.
  • Ejecuta las pruebas que hiciste.
  • Corrige la unidad de código que implementa la funcionalidad deseada hasta que pase todas y cada una de las pruebas.
  • Al añadir una nueva funcionalidad, repite el ciclo: piensa en cómo probarla, codifica la funcionalidad, codifica las pruebas, ejecuta todas las pruebas que hiciste (nuevas y viejas). No sigas hasta que el código pase absolutamente todas las pruebas.
  • Así una y otra vez para cada nueva funcionalidad que implementes.

JUNIT
JUNIT es un conjunto de clases (framework) que permite realizar la ejecución de clases Java de manera controlada, para poder evaluar si el funcionamiento de cada uno de los métodos de la clase se comporta como se espera. Es decir, en función de algún valor de entrada se evalúa el valor de retorno esperado; si la clase cumple con la especificación, entonces JUnit devolverá que el método de la clase pasó exitosamente la prueba; en caso de que el valor esperado sea diferente al que regresó el método durante la ejecución, JUnit devolverá un fallo en el método correspondiente.

Para realizar su trabajo, JUNIT utilizama métodos ASSERT. Un método Assert es un método de JUnit que realiza una prueba y que retorna un “AssertionFailedError” si la prueba fallo. Para más información sobre dichos métodos visitar las referencias al pie de la entrada.

Configurar JUNIT

1. Descargar el Framework de JUNIT (Descarga directa: [junit4.9b2.zip])
2. Extraer el contenido del paquete.
3. Colocar la carpeta en junit4.9b2 alguna ubicación conocida. (en mi caso /home/juancarlos/)
4. El paso anterior es para configurar el CLASSPATH. Abrimos una terminal, nos aseguramos que estamos en nuestra carpeta personal (en mi caso /home/juancarlos, en su caso /home/sunombredeusuario) y escribimos emacs -nw .bashrc



5. Nos vamos hasta el final del archivo y escribimos la siguiente linea:



Todo es en una sola línea, no poner ningún salto de línea. En el CLASSPATH van escritas las direcciones de las librerias contenidas en 3 archivos .jar. Las tres direcciones van separadas por el caractér de dos puntos ( : ) mas o menos con la siguiente sintaxis:

export CLASSPATH=/UBICACION/junit4.9b2/junit-4.9b2.jar:/UBICACION/junit4.9b2/junit-4.9b2-src.jar:/UBICACION/junit4.9b2/junit-dep-4.9b2.jar:.

Listo, con ello ya hemos ubicado nuestras librerias, ahora podemos comenzar a escribir y compilar pruebas con JUNIT.

IDENTIFICACIÓN DE PRUEBAS

Despues de llenar la factura, se necesita calcular el total a cobrar. Dicho total debe ir escrito en número y letra.
Para obtener el total en número basta con realizar todas las operaciones (suma, resta, multiplicación, división) correctamente. Pero, para obtener el número con letra, el valor debe enviarse a una función y después de procesarlo se debe enviar el valor con letra. Por ejemplo:

1. Se captura una orden, el total a cobrar de dicha orden es de 1535.50
2. El atributo total almacena el valor: orden.total = 1535.50
3. Se genera un nuevo Conversor (clase) y el total de envía a la función llamada getStringOfNumber(float num). getStringOfNumber(orden.total)
4. El método getStringOfNumber regresa una cadena de caracteres (String) que contiene el valor del total en letra.
5. Se espera que getStringOfNumber regrese MIL QUINIENTOS TREINTA Y CINCO PESOS 50/100 M.N

De la misma manera, implementando polimorfismo, hay un método getStringOfNumber() que en lugar de recibir un flotante, recibe un entero.
La finalidad es la misma solo que se trabaja con números de tipo INT (Integer)

REFERENCIAS Y TUTORIALES

2 comentarios: