En este tutorial se introduce una gran aplicación la tecnología de JUnit: detección y alerta de errores.
0. Índice de contenidos
1. Introducción
JUnit es un framework de trabajo para escribir pruebas de tal forma que sean repetibles,es una implementación de la arquitectura xUnit para frameworks
de pruebas unitarias. Para la entender este tutorial se requiere tener unos mínimos conocimientos sobre JUnit
(ver https://github.com/junit-team/junit/wiki/Getting-started).
Muchas veces el objetivo de utilizar JUnit, es implementar un sistema automatizado de pruebas unitarias,
normalmente para las pruebas de regresión. Este sistema automatizado de pruebas alertará a los desarrolladores
de los problemas que presenta una aplicación tras un cambio, todo ello sin la necesidad de repetir las tediosas
pruebas unitarias tras cada cambio realizado sobre la aplicación.
La automatización de pruebas necesita mecanismos que permitan presentar el resultado de las pruebas de la forma más sencilla posible al probador de software. Es decir, de nada vale tener las pruebas automatizadas si interpretar el resultado de estas pruebas es tan costoso como realizar las pruebas manualmente.
Lo que se presenta en este tutorial es una forma detectar mediante la arquitectura de JUnit cuando se ha producido un error y así alertar al probador. Esto permite por ejemplo preparar un sistema de pruebas que se ejecute todas las noches y envíe un email al responsable de las pruebas del software en el caso de que algo haya ido mal.
2. Entorno
El tutorial está escrito usando el siguiente entorno:
- Hardware: ADM Semprom 2600+, MMX DNow, 1.8GHz 1024MB RAM.
- Sistema Operativo: Windows XP Professional
- Entorno de desarrollo:
- Eclipse IDE for Java Developers Version: Indigo Service Release 2
- JUnit 4.12
3. Código del ejemplo
El ejemplo consta de tres clases:
- Calculadora. Es el código a probar.
- PruebaCalculadora. Contiene un caso de prueba y es una implementación con JUnit de una prueba para Calculadora.
- SiFallaLaPrueba. Esta clase toma el control cuando se ejecuta el caso de prueba. Permite saber si ha fallado (método failed) o ha terminado con éxito (método succeeded). En el caso de este ejemplo el interés está en controlar los casos en que la prueba falla, de ahí el nombre de la clase
Aquí está el código de las tres clases que componen el ejemplo:
Calculadora.java
public class Calculadora { public int evalua(String expression) { int suma = 0; for (String sumando: expression.split("\\+")) suma += Integer.valueOf(sumando); return suma; } }
PruebaCalculadora.java
import static org.junit.Assert.assertEquals; import org.junit.Rule; import org.junit.Test; public class PruebaCalculadora { @Rule public SiFallaLaPrueba EjemploRegla = new SiFallaLaPrueba(); @Test public void evaluatesExpression() { Calculadora calculadora = new Calculadora(); int sum = calculadora.evalua("1+2+3+5"); assertEquals(6, sum); } }
SiFallaLaPrueba.java
import org.junit.rules.TestWatcher; import org.junit.runner.Description; public class SiFallaLaPrueba extends TestWatcher { @Override protected void failed(Throwable e, Description descripcion) { System.out.println("Si la prueba falla se ejecuta esto"); } }
PruebaCalculadora ejecuta un caso de prueba que termina con error puesto que no obtiene el resultado esperado. La suma a realizar es 1+2+3+5=11 y en el caso de prueba se ha codificado que la suma debería dar un resultado de 6. Cuando la prueba falla, JUnit ejecuta lo codificado bajo la anotación @Rule y es el método failed del objeto creado el que deberá contener aquello que se quiera implementar para alertar del error. En el caso del ejemplo la sentencia:
System.out.println("Si la prueba falla se ejecuta esto");
La clase SiFallaLaPrueba hereda de TestWatcher. Ésta es una clase base para reglas que toman nota de las acciones de pruebas, sin modificarlas. En este ejemplo, la clase SiFallaLaPrueba permite sin modificar la clase PruebaCalculadora tomar nota de que se ha obtenido un resultado que no era el esperado.
4. Conclusiones
Cuando se automatizan pruebas se debe de tener en cuenta que la forma de alertar sobre los errores sea lo más práctica posible. No es de utilidad generar mucha información que posteriormente tenga que ser analizada manualmente. Probablemente sea tan costoso analizar la información resultado de las pruebas como hacer las propias pruebas.
La técnica mostrada en este tutorial permite reducir el tamaño de los datos resultado de las pruebas automatizadas. El desarrollador solo tendrá que echar un vistazo para saber si todo ha ido bien o no tras la ejecución de las pruebas.
5. Referencias
- https://thomassundberg.wordpress.com/2012/07/08/performing-an-action-when-a-test-fails/
- http://junit.org/javadoc/latest/org/junit/rules/TestWatcher.html