Featured Posts

Velocity, le cache distribué selon Microsoft Velocity (nom de code du projet) est un principe de cache distribué qui peut être attaqué par des programmes .Net. Vous pouvez donc l'utiliser sur votre site Web, sur une application serveur distribué...

Read more

Injecter des Mocks via IOC (NInject et Rhino Mocks) Bonjour à tous, Voici un petit post expliquant l'intégration quasi-parfaite de Rhino Mocks avec NInject. Pour rafraichir les esprits, NInject est un framework d'IOC et donc d'injection de dépendance....

Read more

A l’assaut de Qt Bon, les enfants, aujourd'hui j'ai envie de partir à la découverte de Qt. Non pas que j'abandonne .Net et son Winform / WPF, mais dans la vraie vie il faut aussi avoir créer de jolies interfaces...

Read more

Velocity, le cache distribué selon Microsoft

Posted by alphamax | Posted in Uncategorized | Posted on 25-05-2010

4

Velocity (nom de code du projet) est un principe de cache distribué qui peut être attaqué par des programmes .Net. Vous pouvez donc l’utiliser sur votre site Web, sur une application serveur distribué ou sur toute autre implémentation … Il sera généralisé dans peu de temps afin de l’offrir aux développeurs mais se rendra aussi disponible sur Azure.

Une fois l’installation effectuée (principe d’un maitre et de plusieurs esclaves), on peut alors manager le cache par un power shell. Selon les dire, il sera disponible une interface pour la sortie officielle.

Pour le coté développement, on ajoute simplement les assemblies au projet pour utiliser le cache. C’est une cache de type “Key -- Value” qui peut stocker n’importe quel type d’objet .Net.

Il est bien sur disponible un procédé de duplication et de reprise sur erreur ainsi qu’un système de versionning basique pour gérer les “conflits” que l’on peut imaginer avec l’aspect distribué.

Le plus intéressant dans ce projet est la vision future. Il sera bientôt possible de le requeter avec du LinQ.

Il sera aussi possible de lui intégrer du code exécutif ce qui permettra de faire passer la couche d’accès aux données par ce cache… On peut alors imaginer que la persistance passera par cette cache qui se chargera automatiquement et “au besoin” de persister les données dans la base.

La possibilité d’avoir un “cache client” qui déleste un peu le serveur et qui permet une application cliente plus rapide, plus réactive et avec moins d’accès au réseau. Pour l’instant c’est disponible par exécutable séparé mais la version assembly sera bientôt disponible. A cela s’ajoute la possibilité de brancher des évènements pour prévenir le client de modification sur le cache du serveur.

Pour ce qui est du transport, le cache s’appuie sur la technologie WCF, il est donc possible d’y ajouter (par simple modification d’un fichier de configuration) toute les sécurités et protections proposés par WCF.

(Article aussi posté sur www.alphablog.org)

Injecter des Mocks via IOC (NInject et Rhino Mocks)

Posted by alphamax | Posted in Programmation | Posted on 21-05-2010

98

Bonjour à tous,

Voici un petit post expliquant l’intégration quasi-parfaite de Rhino Mocks avec NInject. Pour rafraichir les esprits, NInject est un framework d’IOC et donc d’injection de dépendance. Il permet l’injection de classes et autorise donc un fort découplage dans votre application. Rhino Mocks est quand à lui un framework fortement lié au contexte du test. Il permet, lors d’un test unitaire, de “bouchonner” une brique en cours de test afin d’isoler celle ci et donc de garantir sa testabilité “unitaire”.

Le but de cet article est de concevoir une application à faible couplage, avec NInject, et facilement “Mockable” avec RhinoMock. Afin de comprendre cet article, il est fortement conseillé de connaitre le principe de Mock, d’injection et l’utilisation de Rhino Mocks.

Contexte


Dans notre projet de test, NInject est installé coté serveur. Il met en relation les différentes classes en garantissant un fort découplage. Arrive la partie des tests unitaires. Nous décidons de mettre Rhino Mocks afin de bien “unitariser” les tests. Seul problème, les dépendances sont injectées en cours d’exécution. Il faut donc demander à NInject d’injecter du Rhino Mocks.

Les versions utilisés sont Rhino Mocks 3.6 et NInject 2.0

Compréhension par l’exemple :

Exemple de classe métier injectée avec NInject :

public class FileDAO : IFileDAO
 {
     [Inject]
     private IFileDAL _fileDAL { get; set; }

     public virtual File AddFile(string name, FileType fileType, byte[] contentFile)
     {
         //Some stuff here that use _fileDAL
     }

     public virtual bool DeleteFile(long index)
     {
         //Some stuff here that use _fileDAL
     }
 }

Sur le code ci dessus nous remarquons que la variable _fileDAL est injecté par NInject (on le remarque par le tag [Inject]) lors de la création d’une instance de la classe.

public void AuthenticateTest()
{
    //Creation of the mock
    IUserDAO = _userDAOMock = Repository.StrictMock()

    //Usefull data for test
    string login = "toto@toto.com";
    string password = "titi";
    Employee user = new Employee(login, password);

    //Record what will be called and what will be returned
    using (NInjectMockProvider.Repository.Record())
    {
        Expect.Call(_userDAOMock.GetEmployee(login, password)).Return(user);
    }

    //Start the "playback" feature.
    using (NInjectMockProvider.Repository.Playback())
    {
        bool authOK = loginService.Authenticate(login, password);

        //Verify that everithing has been properly called
        _userDAOMock.VerifyAllExpectations();
        //Check if the test is OK
        Assert.IsTrue(authOK);
    }
}

Sur le code ci dessus, nous voyons les quelques étapes essentielles de l’utilisation de Rhino Mocks :

  • Mise en place des données de test
  • Enregistrement du comportement du mock
  • Lancement de la séquence de test
  • Vérification que l’enregistrement correspond bien au comportement appelé et vérification des résultats.

Le but de cet article est donc de s’abstraire de cette ligne :

IUserDAO _userDAOMock = Repository.StrictMock<IUserDAO>();

Comme nous injectons aussi dans nos classes testées, il nous faudrait procéder à l’injection des mocks par NInject.

Don’t fight NInject !


Pour paraméter l’injection, NInject s’appuie sur une classe dérivée de la classe abstraite NinjectModule ou il suffit de surcharger la fonction Load() afin de définir les bindings sous la forme :

Bind<IUserDAO>().To<UserDAO>().InSingletonScope();

Ninject nous donne la possibilité d’ajouter un “Provider” qui fournirait donc l’instance de la classe. L’utilisation parfaite dans notre cas serait :

Bind<IUserDAO>().ToProvider<NInjectMockProvider<IUserDAO>>();

Nous indiquerons alors à NInject d’injecter un Mock pour des IUserDAO. Nous unifions donc le provider NInject avec la factory Rhino Mocks !

Que fait ce provider ?

public class NInjectMockProvider<T> : IProvider where T : class
{
    //References to the MockRepository
    public static MockRepository Repository = new MockRepository();
    //Static dictionnary that allow to create a Mock by kernel
    private static Dictionary<int, object> allItems = new Dictionary<int, object>();

    public object Create(IContext context)
    {
        return CreateInstance(context);
    }

    //Say Ninject what type we are injecting
    public Type Type
    {
        get { return typeof(T); }
    }

    //Create the mock or return the mock already created
    private T CreateInstance(IContext context)
    {
        int temp = context.Kernel.GetHashCode();
        if (!allItems.Keys.Contains(temp))
        {
            allItems.Add(temp, Repository.StrictMock<T>());
    }
    return allItems[temp] as T;
}

Ce qu’il faut retenir de ce provider-factory :

  • Il est configuré en injection Singleton by-design. Nous n’avons pas creusés plus loin, cela couvrait nos besoins
  • Il simule auprès de NInject l’injection d’une classe abstraite
  • Il s’occupe de la création des mocks typés.

Nous pourrions améliorer son fonctionnement en gérant les types d’injections (singleton, par thread, “OnePerRequest”) par exemple.

Références :


Ninject Dojo

Rhino Mocks documentation

Spécial Thanks to :


Lionel Molas, pour le peer-programming qui nous a permis de trouver la solution ainsi que son idée de publier la solution !

A l’assaut de Qt

Posted by Ed | Posted in Programmation, Tests et dossiers | Posted on 12-04-2010

5

Bon, les enfants,

aujourd’hui j’ai envie de partir à la découverte de Qt. Non pas que j’abandonne .Net et son Winform / WPF, mais dans la vraie vie il faut aussi avoir créer de jolies interfaces en C++. Et sur ce point, à part Borland C++ Builder qui propose une BCL sympa avec des composants visuels riches, je ne connais pas de solution prêt à l’emploi pour faire des IHM en mode RAD.

MFC ? Non, on oublie…

Ce qui me donne envie de me Qt devant mon PC :

  • Portabilité des sources vers Windows, Windows CE (donc mobile), Linux, MacOS, Symbian.
  • Framework complet et pas seulement graphique : parsers Xml, Sql, réseau, OpenGL, scripting (hmm, vous avez dit scripting ?!)
  • Possibilités graphiques vraiment bluffantes, comparables à du WPF avec gestion des animations et styles.

Pour commencer, j’ai téléchargé le SDK pour Windows ici :

http://qt.nokia.com/downloads

Mais il faut savoir que les librairies du SDK (compilées avec MinGW) ne sont pas linkables avec le compilo Visual Studio, donc il faut bien penser à télécharger les lib VS 2008 (sur la même page).

Et comme je suis un assisté du monde Windows, j’aime bien tout avoir à disposition depuis l’IDE et pouvoir faire du wysiwyg comme avec les Winform. Pour celà, on peut télécharger en option :

http://qt.nokia.com/downloads/visual-studio-add-in

Au passage, toutes les librairies sont disponibles aussi en open source et on peut les compiler soi-même avec un makefile.

Pour l’instant je me focalise sur l’utilisation du framework et de ses objets, on verra plus tard comment on génère les binaires et comment on gère le multi-plateforme…

Pour l’instant, j’ai compilé et exécuté quelques exemples fournis et franchement, ça me fait briller les yeux !

Suite dans le prochain épisode…