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

C# Discussion :

Regles pour tests unitaires


Sujet :

C#

  1. #1
    Membre régulier Avatar de Orphey
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 58
    Points : 83
    Points
    83
    Par défaut Regles pour tests unitaires
    Désolé si je ne suis pas au bon endroit mais je n'ai pas trouvé de thread pour les tests unitaires..
    Donc j'essaie de faire quelques tests unitaires et le premier est déjà problématique..

    Je dois évaluer le constructeur de ma classe, dans le constructeur j'ai mis une instanciation d'un champ privé et l'assignation du paramètre passé au constructeur a un champ de l'objet privé.. Ainsi comment je dois évaluer si ce champ de cet objet PRIVATE n'est pas nul ? (parce que je suppose que c'est ca que je dois tester)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public BUDGET_MANAGER(int aParam)
        {
            this.budget_provider = new BUDGET_PROVIDER();
            this.budget_provider.Id = aParam
        }
    this.budget_provider est donc bien un champs privé de ma classe..
    --> Test Mehod :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        [TestMethod()]
        public void BUDGET_MANAGERConstructorTest1()
        {
            BUDGET_MANAGER target = new BUDGET_MANAGER(10);      
            Assert.IsNotNull(??,"the provider is not instancied correctly");
     
        }
    Je suis vraiment un gros débutant donc soyez indulgents :-)
    Merci de vos réponses en tout cas.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    On peut overidder la méthode ToString() de la classe. ce sera aussi utile pour le debug et d'autres tests.
    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
     
    // dans la class BUDGET_MANAGER
    public override string ToString()
    {
      return ToString(this,"") ; 
    }
     
    public static string ToString(BUDGET_MANAGER budget_Manager,string Prefix)
    {
       string Result=Prefix ;
      if (budget_manager==null) Result+="#"
      else
     {
       Result+=budget_Provider.budget_manager.ToString(Prefix+".budget_manager") ;
       // Result+=Environment.NewLine+Prefix+".MavarX="+budget_manager.MavarX.ToString()
      }
    return Result ;
    }
     
    // dans la class BUDGET_PROVIDER
    public override string ToString()
    {
      return ToString(this,"") ; 
    }
     
     
    public static string ToString(BUDGET_PROVIDER budget_provider,string Prefix)
    {
      string Result="Prefix" ;  
      if (budget_provider==null) Result+="#"
      else
      { 
         Result+="="+id.ToString() ;  
         // Result+=Environment.NewLine+Prefix+"MavarY="+budget_provider.MavarY.ToString() ;  
    return Result ;
    }
    Si la méthode de test appele ToString() et affiche la chaine retournée, le test sera Ok si on obtiendra " .budget_provider.id=10 "

    La methode peut paraître compliqué au premier abord, mais elle permet de gérer l'imbrication des classes.

    On peut également obtenir un résultat analogue en utilisant la sérialisation XML (moins souple) necessitant moins de codage.
    Voir : http://tlevesque.developpez.com/dotn...serialization/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Les tests unitaires servent à vérifier le comportement de la classe vu de l'extérieur, pas à contrôler les détails de son implémentation interne. Si ce champ est privé, tu n'as aucune raison de vérifier sa valeur, vu que tu n'es même pas supposé savoir qu'il existe (tu le sais parce que tu as écrit la classe, mais elle pourrait avoir été écrite par quelqu'un d'autre). Donc à mon avis ce test est inutile...

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Tu peux le faire de 2 façons soit en utilisant une classe de Ms qui encapsule ta classe et dans ce cas tu auras accès aux membres privates sinon tu ajoutes un accesseur Get à ta classe pour le champs qui t'intéresse..

    Pour ma part je prendrais la première solution pour éviter à avoir un accesseur utile que pour un test.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  5. #5
    Rédacteur
    Avatar de Yoshio
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 732
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 732
    Points : 2 853
    Points
    2 853
    Par défaut
    Comme on te l'a dit précédemment, les tests unitaires sont généralement utilisé pour tester la partie public d'une classe, donc celle que les utilisateurs vont utiliser.

    Toutefois, il arrive que l'on doivent tester quelques methodes private d'une classe. Je ne pense pas que cela s'applique à ton scenario. Dans ton cas tu devrais créer une propriété public ou tout simplement ne pas tester la valeur de ton champs privé. Ce n'est pas nécessaire de le tester directement. Par contre tu peux tester une méthode public qui utilise ce champ privé et voir si tu obtiens le bon résultat.

    Si tu veux vraiment tester la valeur du champ privé tu peux utiliser comme l'a dit hegros, la classe PrivateObject. Cette classe se trouve dans le namespace Microsoft.VisualStudio.TestTools.UnitTesting (assembly: Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll)

    Voici un exemple pour l'appel de méthode privée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyClass privateObject = new MyClass(this._container);
    PrivateObject myObj = new PrivateObject(privateObject);
     
    Int32 value = (Int32)myObj.Invoke("MyMethod", "arg1");

  6. #6
    Membre régulier Avatar de Orphey
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 58
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos reponses, je crois que je ne vais pas tester ce champs privé puisqu'il apparait que ce n'est pas une bonne pratique! Mais je garde quand meme en tête que cela pourrais etre possible grace a la classe privateObject..

    Merci beaucoup, j'ai un peu de mal à cerner le "scope" de test des tests unitaires..
    Par exemple je dois tester une méthode .Get() sur le BUDGET_MANAGER qui fait appel a une autre méthode sur le BUDGET_PROVIDER qui lui est associé en champ privé et retourne son résultat. Comment tester ca? Dois je faire un Mock du fameux BUDGET_PROVIDER?

    Merci pour vos réponses!

  7. #7
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Une ultime possibilité est de faire appel à la Réflexion pour aller chercher la valeur de la variable privée.

    +++
    Christophe B.

  8. #8
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    Citation Envoyé par elbj Voir le message
    Bonjour

    Une ultime possibilité est de faire appel à la Réflexion pour aller chercher la valeur de la variable privée.

    +++
    C'est inutile de se compliquer la vie, il y a ce qu'il faut dans le framework Ms pour le faire.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BudgetManagerAccessor target = new BudgetManagerAccessor(10);
     
    Assert.IsNotNull(target.Param);
    Yoshio aussi l'a fait à la main en utilisant un Invoke alors que Ms peut créer pour toi une classe Accessor ce qui est plus pratique car il n'y a pas à nommer expliciter les noms des propriétés.
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

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

Discussions similaires

  1. Outils pour test unitaire SQL server
    Par Delphieur dans le forum Outils
    Réponses: 2
    Dernier message: 17/06/2011, 09h38
  2. Mesure de la RAM et CPU pour tests unitaires
    Par polymorphisme dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 06/06/2011, 09h38
  3. Choix d'un logiciel pour test unitaire en C++
    Par tiagocerqueira dans le forum C++
    Réponses: 7
    Dernier message: 27/01/2010, 18h44
  4. Strategies pour les tests unitaires
    Par xxiemeciel dans le forum Test
    Réponses: 6
    Dernier message: 17/04/2008, 11h59
  5. Test unitaire pour de l'interface graphique
    Par nak dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 28/12/2005, 22h00

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