Débat Java : Quel framework de test utiliser pour une application JSF ?

Le , par Esil2008, Membre actif
Salut

Comme il y a peu de documentation sur ce sujet, je reviens vers vous pour avoir vos feedbacks sur des frameworks de tests pour tester des applications JSF, Icefaces, Richefaces ...

Perso, j'utilise pour tester mon appli Icefaces, HtmlUnit c'est pas mal, mais je suis très limité quand c'est question de tester un composant un peu complexe. La par exemple je cale sur le test de deux data table imbriquées. C'est vraiment pas fait pour ca je pense.
Il y a JSFUnit qui apparemment permet de tester les composants JSF, mais avec une petite recherche sur google concernant mon cas. j'ai remarqué qu'il engendre des des conflits entre icefaces et jsf. Des erreurs liées au javascript aussi.

Pourriez me donner vos retours d'expériences concernant ce sujet ?

Et si quelqu'un à deja utilisé Htmlunit pour faire des tests poussés sur des composants icefaces, richefaces ou autre. ca serait bien s'il me montre comment il a procédé

Merci


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de *alexandre* *alexandre* - Inactif http://www.developpez.com
le 26/03/2009 à 23:04
mais mon problème reste que le même qu'au départ es ce que jmeter est capable de compléter mes champs autocomplete et de gérer des interfaces icefaces complexe ? j'ai du mal à la croire sans une interaction lourde de la part des développeurs
Avatar de tchize_ tchize_ - Expert éminent sénior http://www.developpez.com
le 26/03/2009 à 23:07
tu dosi séparer ton test en 2

avec selenium, tu vérifie que l'interface se comporte correctement pour un utilisateur.

avec jmeter, tu fait un enregistrement de session (oui jmeter est capable de capturer une session au niveau de la couche tcp/ip et traduire çà en série de requetes http à envoyer au serveur) et tu lui demande de rejouer cette session de requetes 5000 fois en //, et tu regarde si le serveur tiens le coup. C'est deux tests différents

Si tu veux tout tester d'un coup, tu va aboutir à des test inmaintenable, qui casseront sans nécessité à la première occasion. Faut saucisonner tes test en éléments de base. T'as un formulaire avec 50 champs auto-complete? Tu crée des pages tests avec 2/3 autocomplete et tu vérifie que le composant se comporte correctement
Avatar de Esil2008 Esil2008 - Membre actif http://www.developpez.com
le 27/03/2009 à 9:32
Tu as toute fait raison tchize_, pour les tests de charge, j'ai pas trouvé mieux que JMeter, c'est simple et assez complet, avec plein de stats etc.

Pour tester l'interface graphique, j'ai essayé HtmlUnit et Selenium, je préfère de loin Selenium, même si jusqu'à maintenant je n'arrive pas à faire des tests très complexe sur mon appli Icefaces, surtout sur les datatable imbriquées, mais il faut dire que ça fait un moment que j'y est pas toucher, car j'ai essayé de voir pas mal d'autres frameworks.

Je vous tiendrais au courant pour mes tests Selenium, que je vais reprendre aujourd'hui
Avatar de Esil2008 Esil2008 - Membre actif http://www.developpez.com
le 27/03/2009 à 10:29
Salut,

Avec Selenium, pour attendre le chargement d'une page, on a la méthode waitForPageToLoad, mais pour attendre le chargement des données suite à un clique sur une case à cocher par exemple comment peut on faire ? le sleep ne marche pas, il y a un blocage et le wait déclenche une exception (current thread not owner). Comment pourrais je faire cela ?
Avatar de tchize_ tchize_ - Expert éminent sénior http://www.developpez.com
le 27/03/2009 à 10:53
si t'es coté java (en utilisant donc une instance de com.thoughtworks.selenium.Selenium), tu as plusieurs méthodes:

* setSpeed(), qui défini le temps que selenium dois prendre encre chaque opération, utile pour laisser au serveur web le temps de réagir en ajax
* waitForCondition(), que j'ai jamais essayé
* ou le sleep en java (explique pourquoi ca marche pas si ca marche pas)

le "wait", coté java, c'est présent sur tout les objet et ça a a voir avec les sémaphore -> ne te concerne pas.
Avatar de Esil2008 Esil2008 - Membre actif http://www.developpez.com
le 27/03/2009 à 11:02
Merci pour ces precisions, je vais essayer setSpeed.

Pour le sleep, il ne marche pas dans le cas d'un test en lançant le browser selenium. IL cree un blocage ...

Voila une petite classe de test que j'utilise

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class ObmSelenium extends TestCase { 
	 
	private Selenium browser; 
	 
    public void setUp() throws Exception { 
        browser = new DefaultSelenium("localhost", 
            4444, "*iexplore", "http://localhost:8087/extranet/"); 
        browser.start(); 
    } 
     
	public void testNew() throws Exception { 
		System.out.println("Start testing"); 
		 
		browser.open("/extranet/login.iface"); 
		browser.type("loginForm:login", "test"); 
		browser.type("loginForm:password", "testtest"); 
		browser.click("loginForm:j_id25"); 
		 
		System.out.println("User connected"); 
		 
		browser.waitForPageToLoad("30000"); 
		 
		 
		browser.click("idFormFilter:idTimeFilter:_2"); 
		System.out.println("Week view activated"); 
		 
		Thread.sleep(10000); 
		 
		browser.click("idFormFilter:idTimeFilter:_3"); 
		System.out.println("Opened view activated"); 
		 
		 
		browser.click("idFormFilter:idParentFilter:_2"); 
		System.out.println("Child orders view activated"); 
		 
		 
		browser.click("idFormFilter:idParentFilter:_1"); 
		System.out.println("Parent ordres view activated"); 
		 
		 
		 
	} 
	 
	public void tearDown() { 
		browser.stop(); 
	} 
	 
}
Le programme se bloque au niveau du premier sleep, si je l'enlève ça marche, mais les données n'ont sûrement pas était chargées.

Pour le wait ta raison, je l'ai mit bêtement sans réfléchir.

EDIT

Je viens de remplacer le sleep par un setSpeed, ça me cause aussi un blocage sur ce niveau.
Si je met le setSpeed au debut directement après le browser.start(), le programme se bloque sur witForPageToLoad, ta une idée ???

Merci
Avatar de tchize_ tchize_ - Expert éminent sénior http://www.developpez.com
le 27/03/2009 à 11:17
remplace par

try{
Thread.sleep(10000);
} catch (InterruptedException e){
e.printStackTrace();
}

histoire qu'un interrupted arrete pas ton test

aussi, recommendation. quand tu dois viser des composant par leur id, assure toi que les id sont fixe. Des choses comme _id1, _id2, c'est fortement suceptible de changer d'une compilation à l'autre. Imagine qu'un developpeur rajoute un composant non nommé qui prend l'_id1, ben ton test marche plus car tous les autres id sont décallé

donc quand selenium vise un composant jsf, toujours s'assurer que ce composant a un id="...." dans le template
Avatar de tchize_ tchize_ - Expert éminent sénior http://www.developpez.com
le 27/03/2009 à 11:19
Citation Envoyé par Esil2008  Voir le message
EDIT

Je viens de remplacer le sleep par un setSpeed, ça me cause aussi un blocage sur ce niveau.
Si je met le setSpeed au debut directement après le browser.start(), le programme se bloque sur witForPageToLoad, ta une idée ???

attends 30 secondes pour la wait Si tu lance dans un debugger (genre eclipse) fait un pause de ton application et regarde dans la stack ce qu'il a l'air de vouloir attendre. C'est peut etre un problème de synchro entre internet explorer et le serveur selenium. Essaie peut etre avec firefox juste pour t'en assurer. Personellement, j'ai jamais utilisé ie dans le tests, mais mes collègues le font et ca a l'air de marcher.
Avatar de Esil2008 Esil2008 - Membre actif http://www.developpez.com
le 27/03/2009 à 11:41
Merci pour ton conseil,

Au faite concernant les ids, j'ai bien indiqué les id de tous mes composants JSF que j'utilise, sauf que pour le cas d'un ensemble de case à cocher dynamique, la génération est automatique, je peux pas faire grand chose, c'est pour ça il ya des choses comme idTimeFilter:_3. Sinon pour le bouton loginForm:j_id25 c'est vrai mais le logon je le gére pas dans mon module, c'est géré dans le core de l'appli et malheureusement je suis pas en charge de ça, mais je vais transmettre à mon collegue

Pour le try catch, je viens de le mettre et ça marche, même si j'ai aucune exception de lancer ! mais cette fois ci ça se bloque sur la dernière commande browser.click("idFormFilter:idParentFilter:_1");

attends 30 secondes pour la wait Si tu lance dans un debugger (genre eclipse) fait un pause de ton application et regarde dans la stack ce qu'il a l'air de vouloir attendre.

Si je suspend l'execution, j'aurai pas mal de thread de Selenium qui seront suspendus aussi, comment savoir ce qu'il est entrain d'attendre (la vue debug ne donne pas grand chose) ?

Essaie peut etre avec firefox juste pour t'en assurer

C'est ce que j'avais essayer lors de premiere utilisation de selenium, mais j'ai eu soit une exception, la voila, c tjrs d'actualité côté serveur biensur

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
11:37:50.546 WARN - POST /selenium-server/driver/ HTTP/1.1 
java.lang.RuntimeException: Firefox refused shutdown while preparing a profile 
        at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLauncher.waitForFullProfileToBeCreated(FirefoxCustomProfileLaunch 
er.java:277) 
        at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLauncher.launch(FirefoxCustomProfileLauncher.java:147) 
        at org.openqa.selenium.server.browserlaunchers.AbstractBrowserLauncher.launchRemoteSession(AbstractBrowserLauncher.java:24) 
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.getNewBrowserSession(SeleniumDriverResourceHandler.java:587) 
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.doCommand(SeleniumDriverResourceHandler.java:396) 
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.handleCommandRequest(SeleniumDriverResourceHandler.java:375) 
        at org.openqa.selenium.server.SeleniumDriverResourceHandler.handle(SeleniumDriverResourceHandler.java:123) 
        at org.mortbay.http.HttpContext.handle(HttpContext.java:1530) 
        at org.mortbay.http.HttpContext.handle(HttpContext.java:1482) 
        at org.mortbay.http.HttpServer.service(HttpServer.java:909) 
        at org.mortbay.http.HttpConnection.service(HttpConnection.java:816) 
        at org.mortbay.http.HttpConnection.handleNext(HttpConnection.java:982) 
        at org.mortbay.http.HttpConnection.handle(HttpConnection.java:833) 
        at org.mortbay.http.SocketListener.handleConnection(SocketListener.java:244) 
        at org.mortbay.util.ThreadedServer.handle(ThreadedServer.java:357) 
        at org.mortbay.util.ThreadPool$PoolThread.run(ThreadPool.java:534) 
Caused by: org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLauncher$FileLockRemainedException: Lock file still present! C:\D 
OCUME~1\mjamal\LOCALS~1\Temp\customProfileDir246093\parent.lock 
        at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLauncher.waitForFileLockToGoAway(FirefoxCustomProfileLauncher.jav 
a:235) 
        at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLauncher.waitForFullProfileToBeCreated(FirefoxCustomProfileLaunch 
er.java:275) 
        ... 15 more

Merci bq
Avatar de pvoncken pvoncken - Membre averti http://www.developpez.com
le 21/04/2009 à 10:01
Pour ceux qui sont bloqué à cause des identifiants, une solution est l'utilisation de xpath.

Mon client à ce problème des id générés par JSF, je lui ai conseillé d'utiliser xpath en s'appuyant sur d'autres valeurs que l'id pour cibler un composant.

Je lui ai montré un exemple avec un bouton dont le label est "Rechercher". En indiquant la requête XPath suivante, et sachant que les labels des boutons sont stables, les tests deviennent stables:

//input[@value='Rechercher']

Je conseille l'utilisation de XPath qui est normalisé et qui permet de manipuler le DOM sur des bases solides. Pour les bidouilleurs, je déconseille l'utilisation de Javascript qui est une autre technique pour obtenir des locators.

PS: pour ton problème de tableau qui génère des ID correspondant aux lignes et colonnes dynamique tu peux utiliser une requete XPath de ce type:
//table[@id='id_stable_de_ta_table']/tr[position()=1]/td[position()=1]

-> Cette requete XPath va sélectionner la première case de ton tableau.
Avatar de Aldian Aldian - Membre éclairé http://www.developpez.com
le 03/06/2014 à 18:11
Nécromancie de topic! (Merci la fonction recherche)

J'aurais souhaité savoir si vous aviez connaissance de nouveaux outils plus pratiques qui seraient apparus récemment pour faire des tests unitaires sur des appli JSF avec des appels javascript/ajax dans tous les sens?

J'ai un peu fouillé déjà, mais j'ai l'impression que c'est toujours Sélénium qui domine les débats..
Offres d'emploi IT
Devops en environnement big data
MATIERE GRISE - Ile de France - Paris (75000)
DEVELOPPEUR JAVA J2EE EXPERIMENTE
COOPTALIS - Nord Pas-de-Calais - Lille
Ingénieur QA pour applications web et mobile h/f
Mobiskill - Ile de France - Paris (75000)

Voir plus d'offres Voir la carte des offres IT
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -