L’un des principaux problèmes du build (sur le poste de dév et sur le serveur d’intégration continue) est le temps d’exécution des tests unitaires. Effectivement, dès lors que l’on dépasse le milliers de tests, on commence a dépasser les quelques minutes de temps d’exécution et multiplié par le nombre de développeurs et le nombre de builds quotidiens, on perd vite des heures !
Dans cet article, je vais utiliser mon outil de build quotidien (Maven) avec un outil de cloud nommé Gridgain pour distribuer mes tests JUnit.
Gridgain
Gridgain est un framework open source permettant de développer des applications en cloud ou en grille. Basé sur des annotations, il permet depuis la version 1.6 de distribuer les tests :
public class GridTests extends TestSuite {
@GridifyTest
public static Test suite()
{
TestSuite suite = new TestSuite("Test for fr.javasioux.gridgain");
suite.addTestSuite(ClientDaoTest.class);
// ...
}
}
L’annotation @GridifyTest permet d’exécuter la suite de tests sur la grille, de même que si j’avais déclaré GridJunit3TestSuite au lieu de la simple TestSuite.
C’est censé fonctionner avec JUnit 4 également (GridJunit4Suite) mais j’ai essuyé quelques exceptions m’empêchant d’aller au bout…
Alors bien sûr, ce n’est pas magique et pour distribuer les tests, il faut bien un ou des noeuds sur lesquels les distribuer. Dans le répertoire bin de l’installation de grigain se trouve un fichier gridgain-junit.bat (ou .sh). Lancez le autant de fois que vous souhaitez de noeud. Bien entendu il s’agit du mode le plus simple de tester, en local tout sur la même machine.
Mais ce n’est pas tout. Plusieurs choses restent à configurer. Et plutôt que de le faire dans eclipse comme la vidéo d’exemple le montre, je vais le faire dans Maven…
Maven
Dépendances
Avant de rentrer dans les détails techniques, quelques généralités. Tout d’abord, les dépendances :
Premièrement, j’exclue les tests pour n’ajouter que la ou les suites de tests.
Ensuite, on a besoin de préciser le javaagent (doc officielle), en l’occurence aspectj weaver.
Et pour que le javaagent retrouve ses petits, il faut copier le jar dans le répertoire pointé par le javaagent.
Un point important qu’on ne voit pas dans le pom est la présence du META-INF/aop.xml (disponible dans gridgain-x.x.x/config/aop/aspectj/) dans les ressources du projet (src/test/resources). Effectivement ce répertoire doit être dans le classpath.
Exécution
Comme je le disais plus haut, il faut lancer autant d’instances que nécessaire dans le répertoire bin de gridgain. Ensuite, depuis votre projet mave, lancez simplement un mvn test -DGRID_ROUTER_PREFER_REMOTE=true
Et voilà ! On a un build Maven qui exécute les tests en parallèle sur plusieurs noeuds.
Conclusion
Ecrire des tests, c’est bien… Les executer, c’est mieux ! Et donc si vous avez arrete de les executer car vous etes perpetuellement en train d’attendre qu’ils soient termines, gridgain peut vous aider. Ce framework de cloud permet (entre autre) de dispatcher les tests en parallele sur differents noeuds et ainsi diminuer la duree du build.
Toutefois, lancer plusieurs fois gridgain-junit.bat sur son poste fini par plomber le temps de build plutot que de l’ecourter. Il faut donc mettre en place une vraie infrastructure de cloud sur des serveurs / VM distantes pour y gagner. Je suis parvenu à utiliser gridgain dans un JBoss local (Mac OS) depuis une VM Windows (Gridgain peut découvrir les noeuds faisant partie de la grille) :
Sur l’integration continue, cela peut egalement etre utile pour alleger la charge sur serveur. L’ideal serait de pouvoir combiner cette fonctionnalite avec les possibilites de build distribue fournies par les principaux acteurs du marche (Teamcity, Hudson) et ainsi lancer les tests sur lea agents deja configure. A quand un plugin Hudson Gridgain ?!
Eh oui, à quand un plug-in Hudson?
En tout cas c’est très intéressant, merci pour l’article
Post revu et corrigé sur Octo : http://blog.octo.com/distribuer-les-tests-junit-avec-gridgain-et-maven/