Forum Programmation.c# NUnit dans Monodevelop : Best Practice

Posté par .
0
13
mar.
2011

Bonjour ,

J'ai voulu utiliser Le module NUnit intégré à Monodevelop , et je m’interroge su la meilleur façon de le faire . dans les (très rares) exemples trouvé sur le net , il est conseillé d'ajouter nunit.core et nunit.framework dans les références du projet puis de creer une classe de test dans le projet lui même . C'est sur que ça marche , mais du coups on se retrouve a compiler les tests dans l'EXE, non ? C'est un peu crappy ça !

Alors , J'ai essayé d'utiliser le modèle de projet "Bibliothèque de test NUnit" , mais ça marche pas "out of the box" ce truc . j'ai réussi a le faire fonctionner en lui ajoutant le projet que je voulais tester dans ses références et en ajoutant un "using" du projet testé .

est-ce bien comme cela qu'il faut procéder ? j'ai un peu l'impression de bidouiller là quand même :-D ! et QUID des méthodes privées , on les testent comment ?

et puis aussi , pourquoi il ne veux pas accepter qu'une classe s’appelle comme son namespace/projet ? c'est interdit par le langage (je le fait tout le temps !! ) ou juste par NUnit ?

Bonjour chez vous :)

  • # Comment fait VS2010...

    Posté par . Évalué à 2.

    Sous Visual Studio, les tests sont mis dans un projet à part. (je rappelle qu'un projet = un exe, et qu'une solution groupe plusieurs projets)

    En général le nom du projet est {Classe testée}.Test et tu fais correspondre un .cs de test par fichier réel.

    Pour les méthodes privées il faudra instancier un assesseur (une classe {classe testée}Assessor qui dérivera de la classe assessor de base. Tu l'instancie au début du test et tu as accès à tous les membres privés et internes à ta classe (n'oublie pas que la portée internal ne sera pas visible dans le projet de test puisque tu seras dans un autre projet).

    Pour le fait qu'il n'accepte pas un namespace et une classe du même nom, je donne ma langue au chat. Je sais que le mot clé est un objet, mais je ne pense pas qu'un namespace soit une classe.

    Je ne sais pas si c'est dans ton modèle de base, mais tu as les attributs [TestInitilalize], [TestCleanup], [MethodInitialize], [MethodCLeanup] qui seront exécutés avant et après chaque test/méthode de test si tu les spécifie. (le snoms sont de tête, pas exacts). Pratique.

    Je peux te fournir un de mes projets de test si ça peut t'aider.

    • [^] # Re: Comment fait VS2010...

      Posté par . Évalué à 0.

      Sous Visual Studio, les tests sont mis dans un projet à part.

      Absolument , et c'est voulant faire pareil dans MD que je me suis trouvé fort marri ...

      Bon, OK, VS2010 et son outil interne de tests génèrent une classe Assesseur pour pouvoir tester la méthode privé ( bah , oui, du coups j'ai testé ce que tu m'a répondu au boulot !! ) :

      #region Assembly Calculatrice_Accessor.exe, v4.0.30319
      // C:\Users\...\obj\Debug\Calculatrice_Accessor.exe
      #endregion
      
      using Microsoft.VisualStudio.TestTools.UnitTesting;
      using System;
      
      namespace Calculatrice
      {
          [Shadowing("Calculatrice.Calc")]
          public class Calc_Accessor : BaseShadow
          {
              protected static PrivateType m_privateType;
      
              [Shadowing(".ctor@0")]
              public Calc_Accessor();
              public Calc_Accessor(PrivateObject value);
      
              [Shadowing("Annee")]
              public int Annee { get; set; }
              [Shadowing("Modele")]
              public string Modele { get; set; }
              [Shadowing("Nom")]
              public string Nom { get; set; }
              public static PrivateType ShadowedType { get; }
      
              [Shadowing("Addition@2")]
              public int Addition(int p_opp, int p_opp2);
              public static Calc_Accessor AttachShadow(object value);
          }
      }
      

      mais c'est pas du Nunit tout ça .... et je ne trouve pas trop comment faire pareil avec nos amis Monodevelop et Nunit à la maison ... :-(

      <mode rationalisation> Bon, tant pis, après tout , si on respecte l'encapsulation , une méthode privé c'est de la cuisine interne : elle ne fournit rien à l’extérieur , elle n'est qu'un outils pour les méthodes et les propriétés ... don pas la peine de la tester !! ( j'y crois à moitié à ce que je viens d'écrire :-) ) </mode rationalisation>

      En tout cas , Merci pour ta réponse !

      • [^] # Re: Comment fait VS2010...

        Posté par . Évalué à 0.

        Tu peux aussi utiliser la réflexion pour appeler les méthodes privées (dingue, non !).

        • [^] # Re: Comment fait VS2010...

          Posté par . Évalué à 0.

          on ne se moque pas , hein ! :-)

          Oui , voila "using System.Reflection;" était la phrase magique !

          bon , j'ai jamais utilisé ce truc : je potasse tout ça et je vous raconte ;-) !

      • [^] # Re: Comment fait VS2010...

        Posté par . Évalué à 2.

        En fait le truc, c'est qu'un test Unitaire regarde ce qu'il se passe à l'intérieur de ta fonction. C'est un test de type "white box".

        Donc mettons que tu teste une implémentation personnelle d'une liste triée, un test Unitaire possible serait d'ajouter n valeurs et de vérifier qu'elles sont bien triées avec des assertions de ce genre:

        Assert.IsTrue(MySortedList[0] = min);

        Assert.IsTrue(MySortedList[1] = theSecondValue);

        (...)

        Assert.IsTrue(MySortedList[n-1] = max);

        Après il me semble que le framework de test de VS est une copie de NUnit.

        Si tu as accès à un VisualStudio, je te conseille de jetter un oeil à Pex aussi. Et à Resharper. Et puis Code Contracts pendant que tu y est. :-)

        Si tu veux faire du C#, il vaut mieux le faire avec l'environnement idoine. Tout comme on aura pas idée de faire du C++ avec Visual C++...

        Tu peux aussi aller voir du coté des mocks, mots clés "test driven developpement C#" sur google et msdn. Il parait que y'a des trucs pour, mais j'utilise pas.

        • [^] # Re: Comment fait VS2010...

          Posté par . Évalué à 0.

          Merci pour ces multiples pistes qui vont m'être fort utiles .

          Une remarque pour conclure : le but de l’opération n’était pas de faire du C# avec le meilleur environnement possible mais d'explorer ce que Monodevelop à dans le ventre et notamment son module Nunit ...

          Autodidacte , j'ai appris beaucoup de choses seul , et C# est en cour d’acquisition ( pour le boulot , justement ! :-) ) . Mono/C#/Gtk# c'est parce que c'est libre ( n'en déplaise a patrickg ^^ ) ET sous linux .

          voili voilou .

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.