Les tests sont les procédures qui permettent de vérifier si une version d’une application est stable afin de pouvoir être livrée en phase d’intégration.
Il y a deux types de problèmes qui peuvent arriver avant l’intégration, les régressions et les bugs sur de nouvelles fonctionnalités.
Afin de prévenir ces deux cas d’erreurs, il est nécessaire de tester l’ensemble de l’application et dans les différents contextes d’utilisation.
Si une erreur est détectée, il faut corriger l’erreur et recommencer l’ensemble des tests (la correction de l’erreur est susceptible d’avoir provoqué un autre bug !!).
Les tests classiques
Il s’agit de faire l’ensemble des tests à la main. Dans le cas qui nous concerne dans ce document, le test d’une IHM, il faut aller sur l’ensemble des pages existantes et avec différents valeurs.
Les tests Automatisés
Pour faciliter cette étape laborieuse, des outils existent. Ils simulent les remplissages de champs et les clics sur les différents éléments de la page. Ces outils sont ensuite capables de définir si tout c’est déroulé comme prévu grâce à différents critères paramétrables.
Nous pouvons par exemple vérifier qu’un champ ait bien la valeur attendue, que la page ait bien été chargée etc…
L’intérêt est évident, un programme est capable de cliquer plus vite qu’un humain,
3. Solution proposée: HTMLUnit
Contrairement à ce que le nom de l’API laisse entendre, HTMLUnit, n’a pas à vocation de gérer les tests comme le fait Junit.
Il s’agit simplement d’un ensemble de classes qui facilitent grandement les actions que l’ont peut faire sur un navigateur tel que remplir un champs, cliquer, selectionner des élément, vider le cache, désactiver le javascript.
La solution proposée consiste à utiliser Junit et HtmlUnit en complément. JUnit gère la scénarios de tests, les mécanismes de détection de réussite ou non d’un tests (assertions), ainsi que l’intégration aux différents logiciels de tests (TestDirector, Eclipse, …) grâce à ses fonctions standardisées. Html Unit gère l’accès au navigateur.
3.1. Avantages
Tests IHM avec différents navigateurs virtuels (IE, FF)
Compétences faciles à trouver
Intégrable à de nombreux logiciels dont eclipse et testDirector.
Libre d’utilisation
Basé sur Java : modulabl
3.2. Inconvénients
Les navigateurs ne sont que simulés, il n’est pas sur que les tests soient à 100% fidèles au vrai navigateur (cependant d’après les quelques tests que j’ai créé, il semblerait qu’il soit moins permissif, un test qui passe sous HTMLUnit passerait théoriquement sur FF ou IE).
Nécessite de coder les tests « à l’aveugle »
Déroulement des tests « à l’aveugle » aussi
J’ai appelé créer un test « à l’aveugle », l’action d’indiquer un clic sur des éléments ou des changements de page sans pouvoir les visualiser. C'est-à-dire qu’il faut réaliser les mêmes opérations manuellement dans un autre navigateur lors de la création du test pour savoir sur quel écran on est. Cet inconvénient est en partie contourné grâce à un retour d’information (affichage de la réponse HTML, log visuel) ajouté dans IHMTest, une librairie que j'ai faite pour faciliter la création des tests (détaillé dans la suite de ce document).
4. IHMTest : JUnit et HTMLUnit simplifié !
Ce point explique l’implémentation technique de ces API dans un projet.
4.1. Création d'un nouveau projet sur eclipse
File => new => javaProject
4.3. Création d’un nouveau test
Là ça devient intéressant, voici encore un exemple de code source :
import Tools.ConfigData; import Tools.IHMTest;
public class TestMonSite extends IHMTest{ public static void testGoogle() throws Exception{ ConfigData.initConfig("c:/output/", "TestMonSite"); changeURL("http://www.stephane-arnault.net/"); clickLinkFromHrefSubstring("cherche-jar"); String pageTitle= "Trouvez le nom du fichier jar qui contient un package ou une classe Java"; assertTrue("pageTitle not found on result page",contains(pageTitle)); setTextFieldFromName("classe", "javax"); clickButtonFromId("searchJar"); assertTrue("la recherche de classe n'a pas retourné le résultat attendu",contains("connector.jar")); } }
On remarque que les premières lignes sont nécessaires pour initialiser le test :
La fonction addLog permet d’afficher dans la fenetre liée au test une ligne qui indique oû en est le test.
Enfin la commande clickLinkFromHrefSubstring("CompanyManagement/begin.do"); clique dans le menu sur le search company.
Il est important de remarquer que le test n’hérite pas de testBase comme JUnit l’impose, mais de RiskAgentViewTest qui ajoute aux fonctionnalités JUnit la possibilité de manipuler l’IHM facilement sans se soucier de HTML Unit.
4.4. Méthodes de manipulation d’IHM fournies par IHMTest
public static void setTextfieldFromId(String id, String value)
Rempli un champs text (input type = « text ») à partir de son id.
public static void setTextFieldFromName(String name, String value)
Rempli un champs text (input type = « text ») à partir de son name.
public static void setPasswordFieldFromName(String name, String value)
Rempli un champs password (input type = « password») à partir de son name.
public static void clickButtonFromId(String id)throws Exception
Clique sur un bouton à partir de son id
public static void clickButtonFromName(String name) throws Exception
Clique sur un bouton à partir de son name
public static void clickLinkFromName(String name) throws Exception
Clique sur un lien (balise a) à partir de son name
public static void clickLinkFromId(String id) throws Exception
Clique sur un lien (balise a) à partir de son id
public static void clickLinkFromHrefSubstring(String hrefSubstring) throws Exception
Clique sur un lien (balise a) à partir d’une sous chaine de son href
public static void clickRadioFromId(String id)throws Exception
Clique sur un bouton radio à partir de son id
public static void clickRadioFromNameAndValue(String name, String value)throws Exception
Clique sur un bouton radio à partir de son name et de sa valeur (puisque le name n’est pas unique dans la page, il faut spécifier la valeur)
public static void selectComboboxOption(String id, String key)
Selectionne une option dans une combo box. Id de la combobox et key de l’élément à selectionner.
public static boolean contains(String str)
Permet de tester l’existance d’une chaine de caractere dans l’ensemble du HTML présent dans la page HTML. Très performant pour vérifier les enchainement de page.
public static void changeURL(String url)
Change l’url du navigateur.
public static void checkCheckBoxFromName(String name)
Coche une checkbox à partir de son name.
4.5. Récupération des popup javascript alert et confirm
Il est possible de récupérer à n’importe quel moment la liste des « alert » ouvertes grâce à la commande suivante :
List listAlerts = Browser.getInstance().collectedAlerts ;
La gestion des « confirm » n’est pas encore implémentée dans IHMTest, cependant l’API htmlUnit le permet.
4.6. Retour visuel du navigateur virtuel lors des tests
Comme je l’ai indiqué dans les inconvénients de HtmlUnit, une des difficultés pour le débuggage d’un test est de comprendre ce qu’il c’est passé sur une page donnée.
Pour cela, le démarrage d’un test ouvre une fenetre d’aperçu de la situation du navigateur visuel:
4.7. Démarrer un test via Eclipse
Pour démarrer un test avec eclipse, il suffit de cliquer avec le bouton droit sur une classe de test (qui hérite de IHMTest), puis de selectionner « run as » dans le menu déroulant, puis cliquer sur « JUnit test ».
Le rapport s’affiche dans l’onglet « Junit » d’ éclipse.
Si l’onglet JUnit n’existe pas, dans le menu principal d’éclipse, selectionner « window », « show view », « other ». une pop up s’ouvre avec une arborescence, selectionner « java » puis « Junit ».
5. Conclusion
Voici un aperçu fonctionnel et technique de l’utilisation conjointe de JUnit et HTMLUnit par l’intermédiaire de quelques classes utilitaires.
Comme on le voit, quelques lignes sont suffisantes pour tester une fonctionnalité.
Sujets
Auteur du sujet: gfsgq
Auteur de la derniere réponse: gfsgq
Date de la derniere réponse: 2009/09/24 13:15