finalement combien ca coute de mettre en place ce genre de test ? en terme de temps
actuellement j ai 16 utilisateurs qui testent ce qu'on produit ...j'aimerais voir la réaction de l'appli pour 5000 users en même temps ...
finalement combien ca coute de mettre en place ce genre de test ? en terme de temps
actuellement j ai 16 utilisateurs qui testent ce qu'on produit ...j'aimerais voir la réaction de l'appli pour 5000 users en même temps ...
pour tester la montée en charge c'est encore autre chose . Faut utiliser des trucs comme JMeter
Selenium, junit, shale-test vont te permettre de lancer des tests unitaire, mais on utilise rarement ca pour la montée en charge
les test unitaire, c'est "si je faits çà, ca dois répondre çà", la montée en charge c'est "si j'ai 5000 utilisateurs, la réponse doit arriver dans les 200ms"
Les tests de montée en charge, ca met quelque minute à configurer avec JMeter, après tu lance, tu va te chercher un café et tu regarde
Les tests selenium, y a du bordel à mettre en place, donc les premiers seront plus long à configurer (ici on a mis 3 jours à automatiser correctement les premiers tests selenium), après, les suivant reprenent la meme architecture, y a plus qu'à les écrire, c'est aussi rapide à écrire que des tests JUnit classique. Mais ca vaut le coup. Surtout quand le fenetres défilent à l'écran et que le sysadmin insiste pour te faire installer un anti spyware parce que "c'est curieux ces fenetres qui s'ouvrent toutes seules :p"
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
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
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
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 ?
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.
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }
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
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
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.
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");
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) ?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 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 biensurEssaie peut etre avec firefox juste pour t'en assurer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
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..
Mes cours sur l'écosystème Java EE - N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager