Développement
Les nouveaux utilisateurs de VoiceObserver ne pouvaient plus créer un compte depuis la version 3.0.1. Ce bug a été corrigé dans la version 3.0.2 qui est en place actuellement. Nous avions placé des règles de sécurité trop strictes.
Tout est revenu à la normale en ce début d’après-midi et d’autres améliorations ont été ajoutées. Vous pourrez consulter la liste de ces améliorations demain, lors de notre prochaine Friday Update.
J’ai mis à jour Safari 5 (car quelques nouveautés intéressantes) et je n’ai remarqué aucun souci avec le plugin GWT, ça passe !
J’suis pas non plus complètement fou, je m’étais renseigné, et ce qu’il ressortait c’est que ça passe quand on est sous Mac OS X 10.6 et que Safari tourne en 64 bits. Si vous n’êtes pas dans cette configuration-là, je ne vous conseille pas la mise à jour de Safari.
Je viens de réinstaller une nouvelle version d’Eclipse (3.5, Galileo), mais en conservant mon workspace en l’état (de ma version 3.4, Ganymede). Quand je lance un tâche Ant depuis la Ant view, en faisant un double-clic, Eclipse m’ouvre une fenêtre intitulée Ant Configuration Selection, m’invitant à sélectionner la tâche Ant à lancer… c’est assez ennuyeux à la longue (c’est-à-dire au bout de 2 fois
).
Voici comment résoudre le problème :
cd [workspace]/.metadata/.plugins/org.eclipse.debug.core/.launches/ rm [nom.du.project]*.launch
GXT (grâce à GWT) permet de créer des applications web riches, dont l’ergonomie est assez proche d’une application lourde. Nous avons déjà eu l’occasion de publier des articles à ce sujet sur ce blog. Il est assez simple de faire des tests unitaires sur des services dans les couches basses d’une application. Et encore, dès qu’il y a une base de données en jeu, ça se complique (et c’est d’ailleurs très souvent le cas). Mais qu’en est-il des interfaces graphiques ? Evidemment, certains éléments graphiques peuvent être testés via des tests unitaires, mais comment s’assurer que l’interface, dans son ensemble, répond aux besoins ?
C’est là qu’intervient Selenium. Selenium est un jeu d’outils qui permettent d’automatiser les tests d’interface graphique, en pilotant un navigateur via du code (ce code, c’est le testcase). Par exemple, on va pouvoir demander le chargement d’une page, effectuer un clic sur un lien bien précis, vérifier que la page contient un texte, … Une session complète sera dédiée à Selenium au DeveloperForum 5, le 8 octobre 2009 à Strasbourg.
Mais avant de pouvoir tester nos interfaces, il faut mettre en place Selenium. Voici comment faire fonctionner Selenium dans un projet GWT dans Eclipse sur Mac OS X Snow Leopard (10.6).
Comment ça marche ?
Il faut deux éléments pour faire fonctionner le tout :
- Selenium IDE est une extension Firefox qui permet d’enregistrer les actions réalisées dans la fenêtre de Firefox et d’ainsi produire le code du testcase (dans le langage de votre choix – dans notre cas, ce sera Java).
- Selenium RC (Remote Control) est un serveur capable de piloter un navigateur et pouvant recevoir des commandes via le réseau, déclenchées par le testcase.
Mise en place
Utilisez Firefox pour télécharger et installer Selenium IDE (extension Firefox) : http://seleniumhq.org/download/
Téléchargez ensuite Selenium RC et décompresser l’archive dans le répertoire de votre choix. Depuis ce répertoire, lancez Selenium RC via la ligne de commande :
java -jar selenium-server-1.0.1/selenium-server.jar
Le serveur se lance et devrait vous afficher les gentillesses suivantes :
10:53:44.369 INFO - Java: Apple Inc. 14.1-b02-90 10:53:44.370 INFO - OS: Mac OS X 10.6.1 i386 10:53:44.379 INFO - v1.0.1 [2696], with Core v@VERSION@ [@REVISION@] 10:53:44.461 INFO - Version Jetty/5.1.x 10:53:44.462 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver] 10:53:44.463 INFO - Started HttpContext[/selenium-server,/selenium-server] 10:53:44.463 INFO - Started HttpContext[/,/] 10:53:44.475 INFO - Started SocketListener on 0.0.0.0:4444 10:53:44.475 INFO - Started org.mortbay.jetty.Server@1ff7a1e
Premier test
Dans Firefox, allez sur une page web de votre choix puis, dans le menu Outils, choisissez Selenium IDE. Commencez à surfer sur la page web et regardez Selenium « Big Brother » IDE enregistrer toutes vos actions dans le navigateur… Exactement comme lorsqu’on enregistre un macro dans certains logiciels. Après avoir navigué dans quelques pages, sélectionnez du texte dans la page et faites un clic droit puis sélectionnez l’option verifyTextPresent <le texte que vous avez sélectionné>.
Dans le menu de la fenêtre de Selenium, choisissez Exporter le test sous… puis choisissez Java (JUnit). Enregistrez le fichier avec le nom de votre choix, sans oublier l’extension .java.
Dans Eclipse, dans votre projet GWT/GXT, créez un nouveau dossier de sources nommé test (si ce n’est pas déjà fait). Ajoutez-y le fichier généré par Selenium IDE puis corrigez le nom du package ainsi que le nom de la classe. Corrigez le build path de votre projet en ajoutant le JAR selenium-java-client-driver.jar (que vous trouverez dans l’archive de Selenium que vous avez téléchargée). Clic droit sur la classe dans Eclipse puis Run As > JUnit Test.
Et là, c’est le drame : une erreur se produit lors du lancement de Firefox. Après le passage à Snow Leopard, une incompatibilité de librairie est arrivée. Pour la contourner, il existe une solution qui vaut ce qu’elle vaut (j’adore cette expression qui ne veut rien dire dans l’absolu et qui pourtant veut bien dire… ce qu’elle veut dire !) :
- Quittez Firefox
- Lancer le Terminal puis rendez-vous dans /Applications/Firefox.app/Contents/MacOS.
- Renommez libsqlite3.dylib :
mv libsqlite3.dylib _libsqlite3.dylib
Relancez votre testcase et tout devrait rentrer dans l’ordre !
Il existe bien sûr un guide de migration qui permet de passer de GXT 1.x à GXT 2.x, avec plus ou moins de succès. Mais une chose importante a été oubliée dans ce guide. Quand on utilise des listes paginées, le paramètre indiquant la page de données voulue s’appelait auparavant start, il s’appelle désormais offset. C’est comme ça, et ce n’est pas paramétrable.
Faut juste modifier toutes les servlets… à moins que, comme nous, vous n’ayez centralisé ce genre de choses.
Je ne vais ni vous envoyer de bisous ni vous parler d’un groupe de hard-rock, mais bien d’un principe que l’on applique tous les jours pour notre développement logiciel : KISS !
Il s’agit d’un acronyme signifiant : « Keep It Short & Simple« .
Il existe d’autres variantes « Keep It Sweep & Simple » ou « Keep It Strictly Simple » mais l’idée reste la même.
KISS veut dire qu’il faut toujours chercher à faire simple, cette maxime est un moyen de rappeler au développeur qu’un programme simple est un programme que l’on maintient et que l’on comprend plus facilement, mais aussi qui est certainement moins sujet aux anomalies.
Ce terme est parfois utilisé pour éviter le phénomène de « feature creep » d’un logiciel. Bien sûr cette maxime s’inscrit dans nos pratiques agiles.
Mais KISS peut s’appliquer à bien d’autres domaines, l’informatique n’en a pas l’exclusivité !
Comme l’a très bien dit Léonard de Vinci : « La simplicité est la sophistication suprême. »
Quelle histoire, ce sabotage de Google ! Un peu de sérieux, en attendant des nouvelles de ce cher Serge-Jean (plus facile à écrire qu’à dire !).
Je me suis fait avoir par quelque chose d’assez subtil avec GWT. En parsant du XML avec le XMLParser fourni par GWT, j’ai eu besoin de récupérer la valeur d’attributs optionnels. J’avais donc écrit des blocs de code qui ressemblent à peu près à ceci :
NamedNodeMap paramAttrs = paramNode.getAttributes(); String view = null; try { view = paramAttrs.getNamedItem("view").getNodeValue(); } catch (NullPointerException e) { }
En me disant que si un élément est null dans la chaîne d’exécution, alors view vaudrait tout simplement null. Ceci est valable en Java, mais une fois traduit en JavaScript par GWT, ça ne marche pas du tout. La solution est donc de tester « à la main » les valeurs nulles :
NamedNodeMap paramAttrs = paramNode.getAttributes(); Node item = paramAttrs.getNamedItem("view"); String view = item != null ? item.getNodeValue() : null;
Dans cet exemple, je vous l’accorde, ce n’est pas plus long et c’est même plus propre, mais j’avais un peu plus d’éléments dans ma ligne, et donc plusieurs valeurs (potentiellement nulles) à tester.


