SWTBot, tests fonctionnels pour développeurs

A l'heure de l'avènement de Jubula, plateforme de tests fonctionnels pour Eclipse RCP distribué avec Indigo, j'ai décidé de plutôt étudier le fonctionnement de SWTBot et ce pour plusieurs raisons :

  • Le "fonctionnel" ne doit pas être exclusif à la maîtrise d'ouvrage surtout quand il s'agit de test : c'est le reproche principal que je fais à Jubula. Il est à mon sens un peu trop orienté vers cette idée : de prime abord, il ressemble à une grosse usine à gaz prévue pour que les "acteurs du fonctionnel" puisse s'amuser à assembler les pièces du puzzle de leur scénario de test. Utiliser des "bibliothèques" d'actions (clic souris, drag and drop...) ou de comportements de composants (sélection de checkbox...) et les glisser-déposer sur le jeu de test pour créer le scénario me semble un peu moins pertinent qu'une suite d'instructions claires et atomiques écrites noir sur blanc...
  • Faciliter le mariage "intégration continue-tests fonctionnels" parce que chacun d'eux peut s'avérer être une peine en soi, si en plus il faut passer par des manipulations quelque peu capilotractées... Pourquoi faire compliqué quand on peut faire simple, avec juste une suite de tests JUnit!
  • Assurer la maintenance des tests car c'est bien souvent là que sont sollicités les développeurs. Même si certains tests fonctionnels sont parfois livrés dès le départ du projet, joints aux spécifications, dès que celles-ci évoluent (et c'est toujours le cas), ce sont bien les développeurs qui sont chargés des les maintenir. Donc fournir toute une batterie d'outils graphiques pour la réalisation des tests s'avère bien plus lourd et inconfortable que quelques lignes de codes à modifier simultanément à l'application.

Je tiens tout de même à préciser que ces remarques sont entièrement personnelles et subjectives et n'ont en aucun cas pour but de dévaloriser l'outil. Cet article a seulement vocation de mettre en avant certaines facilités offertes par SWTBot du point de vue développeur. Jubula a surement fait le choix d'autres cibles puisque moins particulièrement orienté SWT/Eclipse RCP.

Fonctionnement de SWTBot

Rentrons maintenant dans le vif du sujet. Le principe de base de ce plugin est de fournir un moyen d'exécuter une application basée sur SWT (et plus particulièrement Eclipse RCP), dérouler un scénario d'utilisation et contrôler son comportement. Techniquement, ceci est utilisable très facilement en créant une classe basique JUnit avec un runner fournit : SWTBotJunit4ClassRunner. Pour le reste, l'API parle d'elle-même, exemple :

@Test
public void testCompilationJava() throws Exception {
	// Préparation de la perspective
	bot.menu("Fenêtre").menu("Afficher la vue").menu("Autre...").click();
	bot.shell("Afficher Vue").activate();
	bot.tree().expandNode("Général").select("Progression");
	bot.button("OK").click();
	bot.menu("Fenêtre").menu("Afficher la vue").menu("Autre...").click();
	bot.shell("Afficher Vue").activate();
	bot.tree().expandNode("Général").select("Marqueurs");
	bot.button("OK").click();
	...
	// Pour supprimer les warnings de la vue 
	SWTBotView markersView = bot.viewByTitle("Marqueurs");
	markersView.show();
	markersView.setFocus();
	markersView.menu("Configurer le contenu...").click();
	bot.shell("Configurer le contenu").activate();
	bot.button("Nouveau").click();
	bot.checkBox("Afficher les gravités :").click();
	bot.checkBox("Avertissement").click();
	bot.checkBox("Info").click();
	bot.button("OK").click();
		
	/*
	 * Normallement, les éléments de la vue sont réduits et on
	 * teste qu'il n'y ait pas la catégorie "Incidents Java".
	 */
	SWTBotTree markersTree = tree(markersView);
	assertEquals(markersTree.visibleRowCount(),0);
}

private SWTBotTree tree(SWTBotView view) {
	List controls = new ChildrenControlFinder(view.getWidget()).findControls(widgetOfType(Tree.class));
	if (controls.isEmpty())
		throw new WidgetNotFoundException("Could not find any tree");
	SWTBotTree tree = new SWTBotTree(controls.get(0));
	return tree;
}

Le but de ce test est de vérifier qu'un projet java a bien été compilé et donc qu'il n'y a pas de marqueurs d'erreur dans la vue "Marqueurs". Simple, directif et concis. Comme vous pouvez le voir, il est possible d'utiliser directement les méthodes "assertXXX" de JUnit pour vérifier le comportement/état des éléments graphiques. La navigation dans l'interface est facilitée par la possibilité d'enchainer les instructions pointées comme lors de la sélection de sous-menus.

SWTBot recèle également quelques fonctionnalités très intéressantes notamment lors d'une utilisation dans un contexte d'intégration continue : système de log avancé et très précis, création de captures d'écran à chaque problème pour connaitre l'état de l'application... Et puisque chaque classe de test relève d'un simple outillage JUnit, une application Eclipse RCP peut être exécutée à partir d'un script ANT en ligne de commande! Que demande le peuple :) Si ce n'est pas encore fait, voici de quoi vous convaincre en moins de 5 min.

Un must-have donc pour tout développeur RCP!

Sources


Fichier(s) joint(s) :

0 commentaires: