IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tests et Performance Java Discussion :

Solidariser les groupes [TestNG]


Sujet :

Tests et Performance Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Par défaut Solidariser les groupes
    Bonjour tout le monde,

    Je n'arrive pas à trouver un moyen de solidariser l'exécution de mes groupes de test avec TestNG.
    Je m'explique, j'ai 3 groupes de tests, qui utilisent tous le même singleton. J'aimerais éviter les interactions d'un groupe sur les autres. Aussi je voudrais que chacun de mes groupes s'éxécute d'un bout à l'autre avant que ne commence le groupe suivant. Peu importe l'ordre d'exécution des dits groupes, du moment que chacun s'exécute de manière "transactionnelle".

    Savez-vous s'il existe une solution pour parvenir à mes fins ? Car pour l'instant j'ai un bout du premier groupe qui s'exécute, puis un bout du second, un bout du premier à nouveau, un bout du troisième... etc

    Par avance, Merci pour votre aide,

    Pouce.

  2. #2
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    Il faut que tu introduises la notion de dépendance.
    Si j'ai bien compris ce que tu veux, tu dois ajouter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Test(groups="group1",)
    sur toutes tes méthodes de test de ton premier groupe.
    Et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @Test(groups="group2", dependsOnGroups = "group1")
    sur toutes les méthodes de test de ton second groupe.

    Je t'épargne l'annotation des méthodes de ton 3e groupe

    Si tu es en JDK1.4, ce sont des tags javadoc similaire qu'il fait utiliser si ma mémoire est bonne. Mais le principe reste le même.

  3. #3
    Membre éclairé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Par défaut
    Salut et merci pour ta réponse,

    En effet, mettre des dépendances entre les groupes fonctionne bien, mais ce n'est pas ça que je veux (j'avoue que c'est ce que j'ai en place en ce moment en solution paliative mais bon...).

    L'idée c'est que chacun de mes groupes est totalement indépendant des autres. Pour de tests d'intégration les rendre dépendant et vérifier qu'ensemble ils fonctionnent bien, ça me va, par contre pour des TU, non.
    Disons qu'en plus d'exécuter ma suite de tests, je voudrais pouvoir tester chacun des groupes individuellement. Les dépendances impliquent que je les teste en suite. Et si je mets un groupe à jour, je voudrais pouvoir vérifier son fonctionnement avant de l'intégrer avec les autres groupes.

    PS : Je suis en JDK6, sous Eclipse 3.4, et je peux lancer ma suite soit avec le plugin testng d'Eclipse, soit avec Maven 2.1.

    Cdlt,
    Pouce.

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Si cela ne te convient pas, c'est que je n'ai pas compris ce que tu voulais, et ta réponse ne m'a pas aidé à mieux comprendre

    Pourrais-tu être plus précis sur ce que tu veux exactement? Un exemple avec deux groupes de deux tests (par exemple) pourrait peut-être illustrer tout ça.

  5. #5
    Membre éclairé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Par défaut
    OK... alors voici un peu de code

    Prenons un premier groupe : referentiel.config
    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
        /**
         * On définit quel est le fichier qui va être utilisé pour ce référentiel de conf.
         */
        public void defineXmlFile() {
            // On définit dans quel fichier vont se faire les écritures de ce test
            siloB.setXmlFile(XML_FILE);
     
            // Et on instancie le Silo en fonction de ce fichier XML.
            createSilo();
        }
     
        /**
         * Test de remplissage du modèle de référentiel de configuration du Silo.
         */
        @Test(groups = {"functest", "referentiel.config"})
        public void testPopulateModel() {
            // On définit le XML et on crée le Silo.
            defineXmlFile();
     
            // On valide qu'il y a bien des données dans le Silo
            checkSiloFull();
        }
     
       /**
         * Test que la récupération d'un paramètre dont le nom n'est pas connu lève une exception
         */
        @Test(groups = {"functest", "referentiel.config"}, expectedExceptions = {ParamNotFoundException.class}, dependsOnMethods = {"testPopulateModel"})
        public void testInvalidParam() {
            // Accès à un paramètre dont le nom n'est pas valide.
            siloB.getParam(INVALID_PARAM);
        }
    Dans ce premier groupe j'effectue divers tests permettant de valider des accès sur un fichier XML (appelé référentiel de conf et correspondant à un Silo), définit dans la méthode defineXmlFile().

    Prenons désormais, un autre groupe : referentiel.saj. Je teste dans ce second groupe l'implémentation d'une API d'accès à ce référentiel de conf.
    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
        /**
         * On définit quel est le fichier qui va être utilisé pour ce référentiel de conf.
         */
        @Test(dependsOnGroups = {"referentiel.config"})
        public void defineXmlFile() {
            // On définit dans quel fichier vont se faire les écritures de ce test
            siloB.setXmlFile(XML_FILE);
     
            // Et on instancie le Silo en fonction de ce fichier XML.
            createSilo();
        }
     
        /**
         * Constructeur initialisant le modèle de test.
         */
        public TestAPISajImpl() {
            setParamSajEcriture(new ParamSajEcritureImpl());
            setParamSajLecture(new ParamSajLectureImpl());
            setSiloB(SiloB.getInstance());
        }
     
        /**
         * Test d'ajout d'une application au Silo.
         */
        @Test(groups = {"functest", "referentiel.saj"}, dependsOnMethods = {"defineXmlFile"})
        public void testAddApp() {
            paramSajEcriture.addApplication(APP_NAME_1);
     
            siloB.writeModel();
        }
     
        /**
         * Test de présence d'une application.
         */
        @Test(groups = {"functest", "referentiel.saj"}, dependsOnMethods = {"testAddApp"})
        public void testReadApp() {
            siloB.clearSilo();
            siloB.loadModel();
     
            Assert.assertEquals(paramSajLecture.getApplications().size(), 1);
        }
    Il y a 3 API d'accès à ce référentiel de conf. Les accès des 3 API sur le référentiel sont croisées et toutes utilisent la même implémentation... qui se base sur l'implémentation de ma classe SiloB, qui est un singleton.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setSiloB(SiloB.getInstance());
    Pour éviter que les modifications sur le référentiel de conf effectuées par un de mes groupes de test n'est d'impact sur les autres groupes de tests, je définit un fichier XML pour mon référentiel de configuration différent pour chaque groupe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    siloB.setXmlFile(XML_FILE);
    L'idée est que la méthode qui définit le fichier XML (defineXmlFile) doit forcément s'exécuter au début de chaque groupe. Mais comme elle accède au singleton SiloB, il ne faut surtout pas qu'un autre groupe démarre tant que le premier n'est pas terminé. Sinon, le fichier XML change... et les tests plante.

    A ce jour, le fonctionnement @dependsOnMethods/@dependsOnGroups implique (par exemple) que la méthode testReadApp sera exécutée après testAddApp dans le groupe referentiel.saj, mais rien n'empêche qu'entre ces 2 méthodes il n'y ait pas les méthodes defineXmlFile puis testPopulateModel de mon groupe referentiel.config qui soient exécutées.


    Si je fais des dépendances entre les groupes, aucun problème, les 2 s'enchaînent, mais je perds la possibilité d'exécuter l'un sans l'autre.

    J'espère avoir réussi à être plus clair cette fois.

    Cdlt,
    Pouce.

  6. #6
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Je ne m'attendais pas spécialement à avoir du code, je dois t'avouer, mais juste à des exemples simples genre test1group1, etc.

    Je vais résumer ce que je pense avoir compris, après on verra...

    Tu as:
    - un ensemble de méthodes de tests A, disons testA1, testA2, etc. que l'on appelera testA*
    - un ensemble de méthodes de testB*
    - une méthode initA qui doit être exécutée avant les testA*
    - une méthode initB qui doit être exécutée avant les testB*

    Si on joue initA, toutes les testA* doivent être jouées (dans n'importe quel ordre) avant que l'on puisse envisager de jouer initB).
    Et inversement.

    Sachant que cela t'es égal de jouer les A avant ou après les B (tant que ce qui précéde est respecté.

    J'ai bon?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Théorie sur les groupes et les ensembles
    Par grav dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 02/02/2005, 18h24
  2. [SQL] problème avec les date et les group By
    Par Stef784ever dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2004, 09h18
  3. [Débutant][VB 5.0] Obtenir les groupes locaux W2K
    Par Banana_Ultra dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/10/2004, 14h07
  4. Aide sur les groupes (ADO)
    Par portu dans le forum QuickReport
    Réponses: 3
    Dernier message: 18/08/2004, 16h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo