Articles avec le tag ‘GWT’
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.
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 !
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.
L’utilisation d’un RowLayout dans un conteneur supprime la possibilité d’avoir une barre de défilement pour ce conteneur. En fait, la raison est assez simple : RowLayout calcule la position et la taille précises de chaque enfant, et c’est à chacun de ses enfants de gérer sa barre de défilement, au besoin.
Donc, si vous avez besoin d’une barre de défilement dans un panneau, n’utilisez pas RowLayout : dans la plupart des cas, un FlowLayout peut être préférable. Utiliser un FlowLayout revient à utiliser un RowLayout(Orientation.VERTICAL) avec des contraintes RowData(1, -1) pour chaque enfant (c’est-à-dire : utiliser toute la largeur disponible et laisser chacun des enfants calculer sa propre hauteur).
Il peut parfois être utile de savoir si l’on est en mode hosted ou en mode web dans une application GWT. En fait, cela m’est surtout utile pour faire des tests : en mode hosted (en cours de développement), j’attaque ma servlet de test et en mode web (déployé, donc), j’attaque la servlet réelle de l’application.
Pour cela, il faut utiliser la méthode statique isScript() de la classe GWT :
if ( GWT.isScript() ) { // Fonctionnement en mode web (déployé) }


