JUnit es uno de los frameworks importantes para la evolución del Desarrollo Guiado por Pruebas (TDD). Este framework de software libre fue portado a muchos otros lenguajes (PHPUnit para PHP, NUnit para C#, y otros lenguajes de la JVM) y hoy en día se encuentra integrado a los IDE más populares. La gente de DZone tuvo una charla con David Saff, colaborador del proyecto JUnit, y hablaron sobre el estado actual del proyecto y la nueva versión que ya está disponible.
Saff cuenta que JUnit comenzó con una reunión entre los dos fundadores: Kent Beck y Erich Gamma. "Creo que Kent ya había implementado a mano varios frameworks similares para Smalltalk, y Kent y Erich compartían algunas cosas: la necesidad de tener feedback rápído, la habilidad de ser desarrolladores, la curiosidad por incrementar sus habilidades en Java, un vuelo trans-Altántico y una notebook", dice Saff. JUnit ocupa un espacio único en el ecosistema de frameworks de pruebas Java. "Si bien JUnit se distribuye con varias extensiones (algunas más experimentales que otras), lo que nos resulta importante es que el núcleo de JUnit es la intersección de todos los frameworks de pruebas útiles en Java, y no su unión. Para probar tu proyecto, voy a considerar que hemos fallado si no podés construir lo que necesitas encima de JUnit, pero no si tenés que extener JUnit para conseguirlo".
JUnit continua evolucionando gracias al feedback de los usuarios. Junit 4.8, la nueva entrega, incluye categorías, que fue la característica más pedida en una encuesta reciente. Las categorías permiten que los desarrolladores anoten pruebas como pertenecientes a ciertos grupos, incluyendo o excluyendo sólo esas pruebas. El ejecutador de categorías recibe un conjunto de clases de pruebas y ejecuta sólo las clases y métodos que estén anotados con la categoría en la anotación @IncludeCategory, o un subtipo de esa categoría. Se pueden usar clases o interfaces como categorías. Como se manejan subtipos, si escribimos @IncludeCategory(SuperClass.class), se ejecutará una prueba marcada con @Category({SubClass.class}). Se puede usar @ExcludeCategory para excluir categorías.
Un ejemplo de categorías
Veamosun ejemplo de exclusión de categorías:
public interface FastTests { /* una categoria */ } public interface SlowTests { /* otra categoria */ } public class A { @Test public void a() { fail(); } @Category(SlowTests.class) @Test public void b() { } } @Category({SlowTests.class, FastTests.class}) public class B { @Test public void c() { } } @RunWith(Categories.class) @IncludeCategory(SlowTests.class) @SuiteClasses( { A.class, B.class }) // Las categorias son un tipo de Suite public class SlowTestSuite { // Se ejecutará A.b y B.c, pero no A.a } @RunWith(Categories.class) @IncludeCategory(SlowTests.class) @ExcludeCategory(FastTests.class) @SuiteClasses( { A.class, B.class }) // Las categorias son un tipo de Suite public class SlowTestSuite { // Se ejecutará A.b, pero no A.a ni B.c }
Saff cuenta: "JUnit 4.8 es una entrega rápida para obtener experiencia de la comunidad con el API propuesta para las categorías. Estamos ansiosos por ver cómo lo usan los desarrolladores".
Saff dice que el desarrollo de JUnit es lento y constante. Él y Kent Beck hacen programación de a pares una vez por semana.
Lo que se viene
- Un nuevo mecanismo de asersiones que utilice los métodos booleanos de Java:
- assertThat(miLista).contains(elemento) =>
- Failed: <["a veces", "raramente", "casi nunca"]> does not contain
- Mejor soporte para procesadores multi-núcleo
Saff tambíén dice que el equipo está entusiasmado por la reutilización de JUnit en lenguajes de la JVM más nuevos, como Scala, Groovy y JRuby. "Estamos viendo cómo evoluciona todo esto", dice. "JUnit fomenta a que los desarrolladores prueben su propio código, y buscamos que sea algo fácil y divertido".