On en a beaucoup parlé lors de sa sortie, on en parle encore maintenant avec la sortie de Google Wave, il s’agit de GWT (Google Web Toolkit).
Rapidement : GWT c’est coder du Javascript en Java, ce qui permet de faire « facilement» de l’Ajax avec des gens qui maîtrisent bien ce langage (plus que JS en tout cas…).
Bref, nous ne sommes pas ici pour parler de GWT tout seul mais plutôt de la façon dont on écrit des tests pour cette technologie. Armé de notre JUnit favoris et de Mocks en tout genre (pour Spring, pour les Web Services, tout ça…) nous sommes pourtant démunis face à GWT. En effet dès l’écriture du premier test unitaire (qui ne ferait que créer un objet par exemple) nous avons une erreur de ce type :
java.lang.ExceptionInInitializerError
[...]
Caused by: java.lang.UnsupportedOperationException: ERROR: GWT.create() is only usable in client code! It cannot be called, for example, from server code. If you are running a unit test, check that your test case extends GWTTestCase and that GWT.create() is not called from within an initializer or constructor.
at com.google.gwt.core.client.GWT.create(GWT.java:91)
at com.google.gwt.user.client.ui.UIObject.(UIObject.java:139)
... 23 more
Ok, pas très grave puisqu’apparement Google y a pensé et nous donne même la solution : on étends la classe GWTTestCase, on refait la même chose et ça devrait marcher. Et c’est vrai ça marche, alors où est le problème ? Le problème c’est que GWT a besoin de lancer son navigateur pour exécuter les tests et que c’est gourmand en ressources et en temps d’exécution (ceux qui font des tests avec un contexte Spring complet savent de quoi je parle).
Hors je travaille sur des projets en méthodologie Agile (avec du TDD dedans), et la fréquence de passage des tests unitaires est très élevée. Contrairement aux tests d’intégration qui sont exécutés moins souvent, le passage des tests unitaires fait partie du processus de création du code, il est donc impensable d’attendre 10 à 15 secondes que le test veuille bien se lancer alors qu’on peut en avoir besoin plusieurs fois par minute !
Actuellement nous avons plus de 1200 tests unitaires sur le projet, et ils s’exécutent sur ma machine en environ 26 secondes et le lancement d’un test lambda est instantané (aussi rapide qu’un test junit classique en tout cas). Nous avons donc contourné le problème en étendant notre propre classe de test GWT mais en choisissant une autre stratégie que Google.
Notre solution a été de patcher les classes GWT au runtime à l’aide d’une librairie spécifique et d’un JDK 1.6. Je passe sur le code lui même car il est utilisé en clientèle mais le principe consiste à intercepter les appels de méthodes GWT qui produisent du code natif JavaScript (JSNI de Google) afin de produire un comportement équivalent en Java.
L’effort consenti en début de projet a été relativement important (création du code pour couvrir 100% des besoins spécifiques du projet, corrections de bugs…) mais le gain est considérable puisque nous avons pu appliquer nos méthodes de développement sans être contraint par cette technologie à avoir une productivité inférieure.
Le projet sur lequel cette solution est mis en place fait travailler une petite dizaine de développeurs depuis plus de 6 mois chez un grand compte, ce n’est pas la refonte d’un SI, mais ce n’est pas non plus du bricolage dans un garage.
Ma question est : comment vous vous faites pour écrire des tests avec GWT ? Pour quelle taille de projet ? Est ce que la solution fournit par Google vous suffit ?
No Translations

2 réponses à “GWT et les tests unitaires rapides”
Par KonstantinMiller le juil 7, 2009
Hi. I like the way you write. Will you post some more articles?
Par Lorenzo le juil 7, 2009
Hello and thank for your comment. I will post more articles as soon as I find the time to do it (I was quite busy thoses past month)