JUnit 4 - ¡A Toda Máquina!

Introducción a la Evolución y Nuevas Características de JUnit 4

En este artículo presentaremos la evolución que ha sufrido el framework para el desarrollo de pruebas unitarias JUnit en su última versión, así como sus nuevas características.Objetivos de la versión 4 de JUnit
JUnit es ya de por sí un framework que facilita en demasía el desarrollo de prueba unitarias, pero ahora la versión 4 simplifica más el desarrollo de éstas por medio de la explotación de las anotaciones otorgadas por Java 5, eliminando el desarrollo de pruebas basado en subclassing, reflection y convenciones de nombrado.

La intención de Kent Beck (creador de JUnit junto con Erich Gamma) con esta nueva versión, es animar a más desarrolladores a escribir más pruebas unitarias por medio de la simplificación de JUnit.

Una vez conocidos los objetivos de esta versión, veamos cómo aplicar las nuevas características de JUnit haciendo comparativas sobre cómo es que hacíamos la cosas en la versión anterior.

Métodos de prueba
Con JUnit 4 se eliminan las convenciones de nombrado y el uso de reflection para localizar los métodos de prueba. Ahora, para señalar un método de prueba lo anotaremos con @Test. No será necesario heredar de la clase TestCase para hacer uso de los métodos assertXXX() y podremos hacer uso de ellos mediante la utilización de importaciones estáticas, característica proporcionada por Java 5. Ejemplo:



Así haríamos la misma prueba con JUnit 3:


Como podemos ver en la implementación de la prueba con JUnit 4, no ha sido necesario heredar de la clase TestCase ni poner el prefijo test a cada uno de los métodos de prueba por lo que podríamos generar nuestras propias convenciones de nombrado de pruebas.

Evolución de los métodos setUp() y tearDown()
Los métodos setUp() y tearDown() ya no serán necesarios, los métodos anotados con @Before y @After toman su lugar. Además de eliminar las convenciones de nombrado, podremos tener tantos métodos anotados con @Before y @After como deseemos, donde la ejecución de estos métodos se hace en el caso de los métodos anotados con
@Before antes de ejecutarse cada uno de los métodos de prueba y la de los métodos anotados con @After se hará después de la ejecución de cada una de las pruebas. Ejemplo:



En JUnit 4 se introduce una característica sin equivalente en JUnit 3 con el comportamiento de los métodos anotados con @BeforeClass y @AfterClass. Sólo puede existir un método anotado con @BeforeClass y uno con @AfterClass, ambos métodos sólo se ejecutarán una sola vez por todos los métodos de prueba existentes, antes de la ejecución de éstos en el caso del método anotado con @BeforeClass y después de la ejecución de éstos en el caso del método que sea anotado con @AfterClass. Dicha característica sirve bien para apertura y cierre de recursos necesarios para la ejecución de pruebas, pero que son costosos en cuanto a desempeño al momento de abrir y/o cerrar.

Prueba de excepciones
La forma en que se prueba el lanzamiento de una excepción en JUnit 4
también cambia en relación con JUnit 3. Ejemplo:



Así haríamos la prueba con JUnit 3:



¡La claridad de esta prueba en JUnit 4 es excepcional!

Ignorando pruebas
Ya no será necesario comentar un método de prueba cuando no queramos que éste se ejecute, quizá porque aún no desarrollamos la implementación del código a probar o porque sólo queremos probar algún otro método en particular. Los métodos anotados con @Ignore serán ignorados para su ejecución. Ejemplo:



Ayuda en pruebas de desempeño
JUnit 4 proporciona ayuda para realizar pruebas de desempeño dentro de las pruebas unitarias. Y aunque no resuelve de todo el tema de este tipo de pruebas por no ser su objetivo principal, sí proporciona una ayuda importante. Ejemplo:



En el ejemplo anterior estamos diciendo que si la ejecución de la prueba pasa los 2000 milisegundos se interrumpirá su ejecución. El mensaje que arrojará será el siguiente:



Nuevas aserciones
JUnit ha sido diseñado desde sus inicios, para de manera eficiente poder capturar las intenciones del desarrollador sobre su código y rápidamente poder revisar que cubra éstas intenciones. Sin embargo, existen algunas cosas que son difíciles de decir con JUnit 3 y que con JUnit 4 se hará mas fácil integrando la aserción assertThat(). Nota: Esta nueva aserción se incluye a partir de la versión 4.4 del framework. Ejemplo:



La intención de assertThat como mencionamos antes, es poder expresar mediante el código que escribimos, la prueba que queremos realizar.

Conclusión
• JUnit 4 más que una nueva versión de ésta ya de por sí poderosa herramienta para pruebas unitarias, es la versión más significativa desde el surgimiento de este framework.

• Basando su funcionamiento mediante la explotación de las características de Java 5, permite un desarrollo de pruebas más flexible sin la rigurosidad de convenciones de nombrado.

• Se aportan nuevas formas para realizar pruebas como lo son las de desempeño, y una manera mucho más elegante para probar el lanzamiento de una excepción.

• Con la versión 4.4 se agrega la capacidad de poder decir de una manera más fácil a través de nuestro código, aquéllas cosas que antes eran más complejas, esto mediante assertThat().

• Con esta nueva versión de JUnit se simplifica la escritura de pruebas unitarias, por lo que se agiliza su desarrollo, intentando motivar a más desarrolladores a escribir más pruebas unitarias haciéndolo ¡a toda máquina!


Referencias
[ junit.org ]

[ -128.ibm.com/developerworks/java/library/j-junit4.html ]

[ devx.com/Java/Article/31983 ]

[ code.google.com/p/hamcrest/ ]

Acerca del Autor

Erick Frausto es egresado de la carrera de Ingeniería en Informática de UPIICSA–IPN, cuenta con certificaciones SUN en tecnología Java y actualmente se desempeña como Arquitecto JEE. Erick invita a todos, a nunca dejar de soñar y luchar por hacer sus sueños realidad.