Developpez.com - Rubrique Java

Le Club des Développeurs et IT Pro

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

Le 2009-03-12 17:19:24, 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
  Discussion forum
32 commentaires
  • tchize_
    Expert éminent sénior
    pour tester les bean jsf, j'utilise des outils de type comme shale-test, qui fournissent des implémentation Mock des composants JSF et qui me permettent de tester les bean, les EL etc (tout ce qui n'est pas HTML) sans avoir besoin d'un conteneur web (rapide et léger à lancer tout ça). Pour le reste (tester les comportement visuels), j'utilise Selenium, qui permet de lancer directement les teste à travers un browser web (firefox ou IE) après avoir déployé un webapp de test sur un serveur de test.

    En pratique, pour cette phase, on a un projet maven2 'test' de type WAR, et dans l'intégration-test on a un combinaison de Selenium server, cargo (pour démarrer un tomcat de test) et des unit tests qui ressemblent à çà:

    Code :
    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
    49
    50
    
    import junit.framework.TestCase;
    
    import com.thoughtworks.selenium.DefaultSelenium;
    import com.thoughtworks.selenium.SeleneseTestCase;
    import java.util.regex.Pattern;
    
    public class TextAndDocsParameterTest extends SeleneseTestCase {
            protected DefaultSelenium createSeleniumClient(String url) throws Exception {
                    return new DefaultSelenium("localhost", 4444, "*firefox", url);
            }
            public void setUp() throws Exception {
                    selenium=createSeleniumClient("http://localhost:6969/");
                    selenium.start();
            }
            public void tearDown() throws Exception {
                    selenium.stop();
            }
            protected boolean isCaptureScreetShotOnFailure() {return true;}
            
        public void testTextAndDocument() throws Exception {
                    selenium.open("test-site/test/HtmlTextAndDocsParameterRenderer.faces");
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:comment"));
                    assertTrue(selenium.isTextPresent("Obvious textgoogle (be)google (com)google (uk)"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:add"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:0:delete"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:1:delete"));
                    verifyTrue(selenium.isElementPresent("parameterTestForm:edit:2:delete"));
                    assertEquals("google (be)", selenium.getText("link=google (be)"));
                    assertTrue(selenium.isElementPresent("link=Modifier ce document"));
                    assertTrue(selenium.isElementPresent("link=google (com)"));
                    assertTrue(selenium.isElementPresent("//a[@onclick=\"if (showBlock('parameterTestForm:edit:1:edit')) removeElementContent('parameterTestForm:edit:1:show'); return false;\"]"));
                    assertTrue(selenium.isElementPresent("link=google (uk)"));
                    assertTrue(selenium.isElementPresent("//a[@onclick=\"if (showBlock('parameterTestForm:edit:2:edit')) removeElementContent('parameterTestForm:edit:2:show'); return false;\"]"));
                    selenium.type("parameterTestForm:edit:comment", "text and document test");
                    selenium.click("parameterTestForm:edit:add");
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:3:name"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:3:uploadedDocument"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:3:uploadedDocument"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:3:update"));
                    assertTrue(selenium.isTextPresent("Nom"));
                    assertTrue(selenium.isTextPresent("Envoyer un fichier"));
                    assertTrue(selenium.isTextPresent("Type de document"));
                  assertTrue(selenium.isElementPresent("document.parameterTestForm.elements['parameterTestForm:edit:3:DocumentType'][1]"));
                    assertTrue(selenium.isElementPresent("parameterTestForm:edit:3:DocumentType"));
                    assertTrue(selenium.isElementPresent("document.parameterTestForm.elements['parameterTestForm:edit:3:DocumentType'][2]"));
                   
            }
    }
    Seules limitations rencontrées avec selenium:
    1. Pas possible de tester les fileupload (selenium travaillant en javascript)
    2. on ne peux rien faire sur la machine pendant ce temps (envahie de fenetre firefox pendant quelques minutes)
    3. Les adminitrateur système veulent t'effacer ce virus qui affiche des popups :p
    4. Compiler le war + démarrer tomcat, même si c'est automatique dans le test, ca prend du temps (quelques minutes)
    5. si tu teste trop fort ton composant, tu dois changer régulièrement tes tests (en particulier si les ids changent souvent, selenium se basant fortement là dessus)


    j'avais testé à une époque des framework du type HttpUnit, mais c'est vraiment mal adapté (pas de test de javascript, analyse du html brut nécessaire, le moindre changement dans le html fait sauter le test, pas de garantie visuelle).

    Cerise sur le gateau, les unit test selenium peuvent faire un capture d'écran lors du failure du test (non seulement tu sais quoi foire, mais tu sais ce qu'il y avait à l'écran à ce moment là :p)
  • Esil2008
    Membre actif
    Merci beaucoup pour ta reponse,

    J'avais vu un peu selenuim mais vite fait, j'avais preferer utiliser HtmlUnit croyant que c'est plus pratique par ce qu'il est a priori plus utiliser...

    En tous cas je vais me lancer dans tests plus pousser avec Selenium, j'espere qu'il pourra me tester mes data table

    Merci encore
  • romaintaz
    Rédacteur
    Il existe aussi JSF Unit de JBoss, mais je ne l'ai jamais essayé. Quelqu'un a un retour à faire sur l'outil ?
  • Esil2008
    Membre actif
    Salut tchize_,

    Est ce que tu aurais un peu de doc sur Shale ? a part la doc du site officiel. Car sur leur site je ne vois pas par ou commencer, de mon humble avis je trouve que c'est mal organisé pour quelqu'un qui ne sait absolument rien du tout sur Shale ou les implementations Mock
  • tchize_
    Expert éminent sénior
    non j'ai pas de doc. J'ai juste utilise la javadoc pour voir quelles classes existaient et les manipuler. Le reste, comme c'est juste des bêtes classes, ca a pas été trop dur (pas de config particulière à faire, etc)

    http://shale.apache.org/shale-test/a...ocs/index.html
  • Esil2008
    Membre actif
    Merci pour ta réactivité,

    tu n'aurai pas quelque part sur ta machine un exemple d'une classe hello world avec ce framework qui traine encore, ca m'aidera a commencer ?

    EDIT : Desole je crois que j'ai écrit vite, je pense qu'il propose des exemples si je telecharge ce framework !

    Merci
  • tchize_
    Expert éminent sénior
    le framework de test est de toutes facon utilisé par shale en lui même pour ses unit test -> suffit de regarder les unit test
  • Es-ce possible d'initlialiser des test avec des champs autocomplete sur une application qui utilise des tabbed pane d icefaces ??? si c'est possible je me demande bien comment ...
  • tchize_
    Expert éminent sénior
    avec selenium, tu peux tester tout ce que tu veux coté browser. (sauf les file upload). Principe, un serveur java pilote le navigateur (firefow ou ie ou autre) par javascript pour simuler le comportement de l'utilisateur. Les requetes sont elles, effectuées par un vrai serveur (tomcat, jboss ou autre) qui donne les réponse. Plus qu'à tester que les pages correspondent à ce qu'on attends.
  • Envoyé par tchize_
    avec selenium, tu peux tester tout ce que tu veux coté browser. (sauf les file upload). Principe, un serveur java pilote le navigateur (firefow ou ie ou autre) par javascript pour simuler le comportement de l'utilisateur. Les requetes sont elles, effectuées par un vrai serveur (tomcat, jboss ou autre) qui donne les réponse. Plus qu'à tester que les pages correspondent à ce qu'on attends.
    Merci ça l'air intéressant en effet