Simplifier le développement des tests avec Unitils

Tout le monde s'accorde sur l'utilité des tests de non régression automatisés, d'ailleurs les outils disponibles dans la sphère Java sont légion : jUnit, dbunit, jmock ... Mais de là à les voir mis en oeuvre systématiquement sur les projets il y a un pas ; l'un des reproches revenant le plus est : "les tests sont trop coûteux à écrire".

Unitils est une bonne réponse à ce problème.

Il s'agit d'un framework "de glue" permettant d'intégrer des frameworks comme jUnit, dbUnit, Spring, EasyMock... afin de simplifier le développement de tests de non régression en tous genres.

Ci-dessous un exemple illustre la concision avec laquelle on est désormais capable de tester un accès à la base de données.

La classe de test ...

@SpringApplicationContext("com/octo/javacoc/applicationContext.xml")
public class BookDaoTest extends UnitilsJUnit4 {

@SpringBean("bookDao")
private IBookDao bookDao;

@DataSet
@Test
public void testFindAllBooks()
{
   Listbooks = this.bookDao.findAllBooks();
   ReflectionAssert.assertPropertyLenEquals(
       "author",
       Arrays.asList("Jules Vernes", "JRR Tolkien", "Isaac Asimov"), books);
}
}

.... avec le jeu de données correspondant :

<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="dataset.xsd">
  <book id="1" title="20000 lieues sous les mers" author="Jules Vernes"/>
  <book id="2" title="Le Seigneur des anneaux" author="JRR Tolkien"/>
  <book id="3" title="Fondation" author="Isaac Asimov"/>
</dataset>

En usant habilement des annotations et du paradigme "convention over configuration" [1], Unitils permet de considérablement réduire le volume de code des tests fixtures [2] afin de se concentrer sur la logique de test.

Un autre exemple de code illustre la déclaration simplifiée de mocks dynamiques [3] .

@Mock
@InjectInto(property="bookDao")
private IBookDao mockBookDao;

@TestedObject
private BookService bookService;

2008 : l'année du Java light?

Cet outil s'inscrit dans la mouvance actuelle de simplification des développements Java : nous somme tous rassasiés par 4 ans de boulimie XML (Spring inside) et bientôt gavés par des kilotonnes d'annotations. Face au poid-plume Grails, Java parait bien pénible pour réaliser nos plus petites applications de gestion. Ainsi je prédis que 2008 sera l'année de la cure pour enfin obtenir un Java allégé aux saveurs de CoC [1] et de DRY [4] !

Pour en revenir à Unitils, il vient de sortir en version 1.0, est disponible dans vos repos maven préférés et pour ne rien gâcher est particulièrement bien documenté et supporté. Bref du tout bon, et on attend la suite ! (tests de webservices ? support des tests contexts de Spring 2.5 ? ...)

[1] Convention over Configuration [2] Test fixture [3] Mock dynamique [4] Don't Repeat Yourself