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

Salesforce.com Discussion :

Classe test trigger


Sujet :

Salesforce.com

  1. #1
    Invité
    Invité(e)
    Par défaut Classe test trigger
    Bonjour,

    Je viens vers vous car je n'arrive pas à rédiger ma classe de test.

    Je n'arrive pas à comprendre comment faire une classe de test. J'ai du mal à chaque classe de test que je dois faire...

    J'ai rédigé un trigger qui va faire un calcul.

    Petite explication :

    J'utilise l'objet Case. Dans cette objet, j'ai trois champs : date d'analyse (Date_d_analyse__c), Delai_d_analyse_nombre_de_jours_ouvres__c et Date_d_activation__c.

    Si la date d'analyse est null, alors mon champs Delai_d_analyse_nombre_de_jours_ouvres__c est null. Sinon, je vais calculer le nombre de jour travaillés entre la date d'activation et la date d'analyse.

    Mon trigger :

    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
    trigger Trigger_Jour_Ouvres_Requetes on Case (before insert, before update) {
    Set<Date> holidaysSet = new Set<Date>();
        
        for(Case Requete : trigger.new){
            if(Requete.Date_d_analyse__c == null)
                {
                	Requete.Delai_d_analyse_nombre_de_jours_ouvres__c = null;
                }
                else{
                        Date dtStartDate=Requete.Date_d_activation__c + 1;
                        Date dtDueDate = Requete.Date_d_analyse__c;
    
                        Integer JourTravaille= 0;
                        Integer NonTravaille = 0;
        
                            for(integer i=0; i <= dtStartDate.daysBetween(dtDueDate); i++)
                                {
            
                                    for(Holiday currHoliday : [Select ActivityDate from holiday])
                                        {
                                            holidaysSet.add(currHoliday.ActivityDate);
                                        }
            
                                    Date dt = dtStartDate+ i;
                                    DateTime currDate = DateTime.newInstance(dt.year(), dt.month(), dt.day());
                                    String todayDay = currDate.format('EEEE');
                
                                    if(todayDay != 'Saturday' && todayDay !='Sunday' && (!holidaysSet.contains(dt)))
                                        {
                                            JourTravaille = JourTravaille + 1;
                                        }
                                    else
                                        {
                                            NonTravaille = NonTravaille +1;
                                        }
               
                                    system.debug('Jour travaillé ========> ' + JourTravaille);
                                    system.debug('Jour NON travaillé ========> ' + NonTravaille);
                            
                                    Requete.Delai_d_analyse_nombre_de_jours_ouvres__c = JourTravaille;
                            
                     }
                }
            }
            
    }

    Ma classe de test :

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    @isTest
    private class Test_Trigger_Jour_Ouvres_Requetes
    {
        static testMethod void Verifier_Jour_Ouvres_Requetes()
        {
             //INSERER LES DONNEES
             // Initialisation du RecordType de la Ressource INEO à créer
             Id RessourceRTId = [select Id from RecordType where SobjectType = 'Ressource_INEO__c' and DeveloperName = 'Support'].Id; 
             
             //Il faut insérer une Ressource_INEO__c 
             Ressource_INEO__c MaRessource = new Ressource_INEO__c (Name='MaRessource', RO__c=FALSE, RecordTypeId = RessourceRTId);   
             insert MaRessource;
             
             // Initialisation RecordType des Sites INEO à créer
             Id SiteRTId = [select Id from RecordType where SobjectType = 'Site__c' and DeveloperName = 'Client_DOS'].Id; 
             
             //Il faut insérer un Site__c rattaché à un RecordType
             Site__c MonSite = new Site__c(name='Site Client', RecordTypeId = SiteRTId);
             insert MonSite;
             
             //Il faut insérer un Compte__c rattaché à un Site
             Account MonCompte = new Account(Name='MonCompte',  Site_INEO__c=MonSite.id);
             insert MonCompte;
            
             //Il faut insérer une activité rattaché à un Site
             Activite_Site__c Activite = new Activite_Site__c(Site__c= MonSite.id, Responsable__c = MaRessource.Id);
             insert Activite;
             
             //Il faut insérer une Action INEO
             Action__c Action = new Action__c(Activite_site__c = Activite.Id, Pilote_Action__c= MaRessource.Id, Date_debut__c = system.today(), Date_fin__c = system.today() + 1);
             insert Action;
            
             //Il faut insérer un contact
             Contact Contact = new Contact(LastName='toto');        
             insert Contact;
                
            Case c = new Case(Date_d_analyse__c = Date.today(), Date_d_activation__c = Date.today() + 1);
            Case c1 = new Case(Date_d_analyse__c = null);
            
            if(c1.Date_d_analyse__c == null)
                {
                	c1.Delai_d_analyse_nombre_de_jours_ouvres__c = null;
                }
            
            // Début du test
            test.startTest();
    		
            insert c;
            insert c1;
           
            system.assertEquals(Date.newInstance(2015,11,18), c.Date_d_analyse__c);
            system.assertEquals(null, c1.Date_d_analyse__c);
            // Fin du test
            test.stopTest();
        }
    
    }
    Elle couvre 45% de mon trigger...

    Pourriez-vous m'aider à mieux comprendre les classes de test et plus particulièrement celle-ci ?

    Je vous remercie par avance.

    Bonne journée.


    Dedex
    Dernière modification par Invité ; 18/11/2015 à 13h36.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    Par défaut
    Hello Dedex,

    Le principe de la classe de test est de simuler la création de données par un utilisateur.
    Dans ton cas, il s'agit donc de créer des requêtes avec les bons paramètres qui vont déclencher les bons calculs.

    Le pourcentage de couverture de test sur une classe dépend du nombre de lignes qui sont parcourues les traitements effectués dans la classe de test.
    Donc pour obtenir une couverture de test importante, il faut rester le plus de cas possibles (voir tous pour arriver à 100%).

    il est très simple de voir quelles sont les lignes parcourues en allant dans la console développeur puis dans l'onglet Tests en bas et ensuite en sélectionnant la classe de test en question.
    En plus du pourcentage de couverture, les lignes en bleues sont celles qui sont couvertes et celles en rouges celles qui ne le sont pas.

    Attention, dans ton code à ne pas faire de DML (Select, Insert, Update, Delete) dans une boucle (for) car si on traite plus de 100 enregistrements en une seule fois la limite de Salesforce sera dépassée.

    Pour cela le mieux de récupérer toutes les données utiles dans une collection (list, map) avant tout traitement par boucle et ensuite de venir chercher les informations utiles dans ces collections.
    Ainsi il n'y aura pas autant d'opération DML que d'itérations dans la boucle.

    Pour résumer les classes de test, il faut vraiment à cela comme si tu étais en train de tester "à la main" tous les cas possibles pour vérifier que ton développement fonctionne.
    Sauf qu'au lieu de créer les données "à la main", il faut les créer par code (new case(...) c, insert c).

    Et c'est ensuite lors de l'insertion que le trigger va se lancer et que les asserts vont vérifier que le traitement a été fait correctement.
    Pour obtenir plus de couverture de test, il faut donc que tu teste davantage de cas.

    Bon courage.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut tomasi,

    Avant toute chose, je te remercie pour toutes tes explications. C'est plus facile à comprendre lorsque c'est quelqu'un qui t'explique.

    Les documentations c'est bien, mais c'est toujours pour les bases, ce n'est majoritairement pas approfondi.

    Du coup, pour ma classe de test, j'ai donc inséré cinq cases : Case c = new Case(.....), Case c1 = new Case(...)

    Chaque case comprend différents champs que je test (depuis, j'ai rajouté des calculs dans mon trigger).

    Ensuite, je fais des insert entre mon test.startTest(); et test.stopTest();

    Et effectivement, j'arrive bien à 100% !!!

    Ça me paraissait tellement compliqué... Et à chaque classe de test, je bute alors qu'enfin de compte, au final, ça reste tout bête...

    En tout cas, je te remercie !

    Je te souhaite une bonne fin de journée.

    Dedex

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 130
    Points : 146
    Points
    146
    Par défaut
    Super si ça t'as permis d'avancer.

    Juste pour info (pour reboucler avec les selects dans les boucles) Apex Best Practices: The 15 Apex Commandments

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Janvier 2020
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Inde

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2020
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par tomasi Voir le message
    Hello Dedex,

    Le principe de la classe de test est de simuler la création de données par un utilisateur.
    Dans ton cas, il s'agit donc de créer des requêtes avec les bons paramètres qui vont déclencher les bons calculs.

    Le pourcentage de couverture de test sur une classe dépend du nombre de lignes qui sont parcourues les traitements effectués dans la classe de test.
    Donc pour obtenir une couverture de test importante, il faut rester le plus de cas possibles (voir tous pour arriver à 100%).

    il est très simple de voir quelles sont les lignes parcourues en allant dans la console développeur puis dans l'onglet Tests en bas et ensuite en sélectionnant la classe de test en question.
    En plus du pourcentage de couverture, les lignes en bleues sont celles qui sont couvertes et celles en rouges celles qui ne le sont pas.

    Attention, dans ton code à ne pas faire de DML (Select, Insert, Update, Delete) dans une boucle (for) car si on traite plus de 100 enregistrements en une seule fois la limite de Salesforce sera dépassée.

    Pour cela le mieux de récupérer toutes les données utiles dans une collection (list, map) avant tout traitement par boucle et ensuite de venir chercher les informations utiles dans ces collections.
    Ainsi il n'y aura pas autant d'opération DML que d'itérations dans la boucle.

    Pour résumer les classes de test, il faut vraiment à cela comme si tu étais en train de tester "à la main" tous les cas possibles pour vérifier que ton développement fonctionne.
    Sauf qu'au lieu de créer les données "à la main", il faut les créer par code (new case(...) c, insert c).

    Et c'est ensuite lors de l'insertion que le trigger va se lancer et que les asserts vont vérifier que le traitement a été fait correctement.
    Pour obtenir plus de couverture de test, il faut donc que tu teste davantage de cas.

    Bon courage.
    This really helps me and that source also.

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

Discussions similaires

  1. Classe test sur un objet
    Par yoh42 dans le forum Langage
    Réponses: 8
    Dernier message: 01/02/2011, 15h29
  2. c'est quoi cette syntaxe : class="<?=$test?>" ?
    Par Figaro90 dans le forum Langage
    Réponses: 5
    Dernier message: 20/04/2010, 16h41
  3. [NUnit] - Ignorer classe Test
    Par marcel_kobain dans le forum C#
    Réponses: 2
    Dernier message: 15/05/2009, 15h32
  4. class TEST nomClass
    Par nocolach dans le forum C++
    Réponses: 2
    Dernier message: 16/04/2009, 23h15
  5. [JUnit] Compilation de ma classe Test
    Par pamic dans le forum Tests et Performance
    Réponses: 3
    Dernier message: 30/06/2005, 11h41

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