Suite à la présentation qui a été faite de SWTBot, nous allons présenter
dans cette article un exemple de test sur une application développée avec SWT.
Nous avons choisi une application de Tchat avec deux tests à réaliser :
s'assurer que les composants graphiques sont bien présents et qu'après l'envoi
d'un message la zone de saisie est de nouveau vide. 
Classe de test
Définition
Les classes de tests dans SWTBot doivent hériter de SWTBotTestCase. Cette
classe hérite elle-même de la classe TestCase de JUnit, ce qui prouve que
SWTBot est une extension du framework JUnit. Cela signifie également que vous
aurez la possibilité de redéfinir les méthode setUp() et tearDown() dans vos
classes de test.
Démarrage de l'application
Pour plus de facilité, c'est la classe de test qui va démarrer notre
application graphique dans un autre thread. Nous allons donc ajouter une partie
static qui se chargera du lancement de l'application à tester au chargement de
la classe de test.
static {
startApplicationInAnotherThread();
}
private static void startApplicationInAnotherThread() {
new Thread(new Runnable() {
public void run() {
new ChatView().main(new String[]{});
}
}).start();
long endTime = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < endTime) {
try {
Display display = SWTUtils.display();
if (display != null)
break;
} catch (Exception e) { }
}
}
On voit dans cet exemple que l'application ChatView est démarrée, puis on
essaie de récupérer l'objet Display dans un boucle while pour s'assurer que
l'application graphique a bien été démarrée avant de commencer l'exécution des
tests
Ecriture des tests
Les méthodes de test doivent toutes être nommée testXXX(), Il s'agit d'une
convention reprise de JUnit. Puis il s'agit de récupérer des références sur les
objets graphiques de l'interface, cette opération se fait via l'attribut bot,
qui est hérité de la classe SWTBotTestCase. Enfin les méthodes assertXXX()
(comme dans Junit) nous permettrons de tester l'état de nos composants
graphiques.
Voici un exemple qui permet de s'assurer que tous les composants graphiques de
l'interface sont bien présents et actifs. Notez la manière de récupérer une
référence sur l'objet graphique via bot.
public void testPresence() throws Exception{
assertNotNull(bot.activeShell());
assertEnabled(bot.text(""));
assertEnabled(bot.button("Envoi"));
}
Ici un autre exemple qui permet de dérouler un scénario fonctionnel, l'envoi
d'un message via l'IHM de tchat, et de s'assurer une fois le message envoyé que
la zone de saisie est bien vide.
public void testEnvoi() throws Exception{
SWTBotText txt = bot.text("");
txt.setText("Bonjour à tous");
bot.button("Envoi").click();
assertEquals("", txt.getText());
}
Exécution du test
Dans Eclipse l'exécution du test sera identique à celle d'un test JUnit,
c'est à dire via le menu run... Notez tout de même qu'en mode debug, les
méthodes pour récupérer une référence sur un objet graphique ne fonctionnent
pas, cela vient probablement de la gestion des threads (ce point reste à
élucider). Dernière remarque, si vous écrivez plusieurs classe de tests, il
serait bon de les regrouper dans une TestSuite de manière à ne démarrer qu'une
seule fois l'application.
Tout le code est en pièce jointe.