[Code Contracts] Nouvelle release 1.6.60505.10 (21 Mai 2014)

Cela fait longtemps que l’équipe Code Contracts n’a pas publié de nouvelle Release (je pense que la cause principal est le fait que l’équipe doit synchroniser leurs développements avec l’équipe qui développe actuellement le nouveau compilateur Roslyn).

L’équipe de Code Contracts vient donc de publier une nouvelle Release de Code Contracts version 1.6.60505.10.

Cette Release apporte les améliorations suivantes :

  • Le support de Visual Studio 2013
  • Corrige bien évidemment des bugs au niveau de l’outil de ré-écriture et d’analyse statique du code.
  • De nouveaux contrats ont été ajoutés dans les bibliothèques du .NET Framework.
  • Et des améliorations au niveau de la performance de l’exécution de l’outil de vérification statique du code.

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[VS2012] Exécuter chacun de ses tests unitaires dans un AppDomain différent, c’est maintenant possible avec Visual Studio Test Extensions !

Aujourd’hui je viens de publier sur CodePlex mon projet Visual Studio Test Extensions qui contient des fonctionnalités complémentaires au moteur MSBuild afin de simplifier au maximum les tests automatiques, et bien évidemment en particulier, les tests unitaires !

Ce projet à pour 2 objectifs :

  • Proposer une infrastructure très légère permettant de faciliter la mise en place technique de certains tests unitaires (par exemple les tests unitaires avec les bases de données).
  • Proposer des méthodes utilitaires permettant de contrôler très facilement les résultats des tests (équivalent des classes Assert de Microsoft).

Continuer la lecture

[Code Contracts] Nouvelle release 1.5.60911.10 (11 Septembre 2013)

L’équipe de Code Contracts vient de publier une nouvelle Release de Code Contracts version 1.5.60911.10.

Cette release corrige énormément de bugs concernant l’outil de vérification statique du code (cccheck.exe).

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[Code Contracts] Nouvelle release 1.5.60813.10 (13 Août 2013)

L’équipe de Code Contracts vient de publier une nouvelle release de Code Contracts version 1.5.60813.10.

Cela fait depuis longtemps (plus de 3 mois) que l’équipe n’avais sortie une nouvelle release… Dans cette release 2 améliorations majeures :

  • La prise en charge de la Preview de Visual Studio 2013
  • La possibilité d’utiliser les post-conditions sur des méthodes async en utilisant « Contract.Result<T>() » et non « Contract.Result<Task<T>>().Result ».

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.

[Code Contracts] Les post-conditions : ce n’est pas uniquement pour contrôler la valeur de retour d’une méthode !

Aujourd’hui j’ai été en mission chez un client qui à mis en place Code Contracts et son outil de vérification statique du code. Lorsque j’ai relus une partie de son code, je me suis aperçu que certains développeurs posait des Contract.Assume() afin d’obliger l’outil de vérification statique à considérer la condition spécifiée en paramètre comme vraie. Voici le code en question (bien évidemment j’ai très simplifié le code…) :

public static class Programme
{
    public static void Main(string[] args)
    {
        Personne personne;
        personne = new Personne();

        InsérerPersonne(personne);

        Contract.Assume(personne.Id != 0, "Le ID ne la personne n'a pas été récupéré depuis la base de données");

        Afficher(personne);
    }

    public static void Afficher(Personne personne)
    {
        Contract.Requires<ArgumentNullException>(personne != null);
        Contract.Requires<ArgumentException>(personne.Id != 0);

        Console.WriteLine(personne.Id);
    }

    public static void InsérerPersonne(Personne personne)
    {
        Contract.Requires<ArgumentNullException>(personne != null);

        personne.Id = 1664;   // On suppose que l'ID provient d'un INSERT sur une base SQL.
    }
}

public class Personne
{
    public int Id
    {
        get;
        set;
    }
}

Bien évidemment je suis aller voir le développeur qui a écrit ce Contract.Assume() et lui ai demandé pourquoi il en avait besoin. Il m’a répondu que c’est l’outil de vérification statique qui lui a indiqué que la pré-condition « personne.Id != 0 » dans la méthode Afficher() ne peut être prouvée…

Contrat non prouvé

Bien évidemment, même si on a affecté le « Id » de la personne (en provenance d’une base de données) dans la méthode InsérerPersonne() il n’y a rien qui nous prouve que l’identifiant est supérieur à 0. J’ai donc poser la question suivante au développeur : « Pourquoi vous ne spécifiez pas une post-conditions qui indique que l’Id de personne est supérieur à 0 ». J’ai été surpris aussitôt surpris par sa réponse : « Les post-conditions, ce n’est pas pour contrôler le retour des méthodes ? ». Et bien non ! Les post-conditions, ce sont des conditions qui doivent être vérifiées à la fin de la méthode. Ces conditions peuvent vérifier le retour de la méthode, mais aussi si une exception est déclenchée, si un paramètre est correcte, si l’âge du capitaine n’a pas changé….

Bref, toute condition qui doit être vérifié à la fin de la méthode, peut-être marquée à l’aide des post-conditions. Rappelez-vous aussi que les post-conditions sont des bons indicateurs aux intégrateurs de votre méthode (ceux qui vont utilisés votre méthode) afin de leur indiquer le nouvel état des objets qui sont modifiés par la méthode (paramètres, propriétés d’une classe, retour de la méthode,…).

Si on reprend l’exemple précédent voici le code qui faudrait mettre dans la méthode InsérerPersonne() :

public static void InsérerPersonne(Personne personne)
{
Contract.Requires<ArgumentNullException>(personne != null);
Contract.Ensures(personne.Id != 0);

personne.Id = 1664;   // On suppose que l'ID provient d'un INSERT sur une base SQL.
}

au niveau du Main() bien évidemment on supprimera le Contract.Assume() :

public static void Main(string[] args)
{
    Personne personne;
    personne = new Personne();

    InsérerPersonne(personne);

    Afficher(personne);
}

Et voilà le résultat au niveau de l’outil de vérification statique du code de Code Contracts :

Contrats vérifiés

[.NET] Comment réaliser des tests unitaires sur une couche d’accès aux données qui utilise une base de données ?

Lorsque l’on développe sa couche d’accès aux données (à la main, via Entity Framework ou tout autre ORM) il est nécessaire comme tout code de le tester ! Beaucoup de développeurs ne testent pas leur couche d’accès aux données car ils considèrent que « cela ne se fait pas ». Or, pour moi, tout code qui est pondu par un développeur doit être testé sans exception ! Un code non testé est un code dont le développeur ne peut garantir son fonctionnement…

Cet article a pour vocation de vous montrer différentes stratégies qui existent et qui sont utilisés (que j’ai déjà rencontré à travers différentes missions) avec leurs inconvénients. A la fin de cet article, j’expliquerai une stratégie simple que j’applique systématiquement depuis 8 ans pour tester les couches d’accès aux données via des tests unitaires.

Continuer la lecture

[.NET] Le point sur les collections du .NET Framework 4.0 et 4.5

Après plusieurs interventions pour auditer la qualité du code chez différents clients, je me suis rendu compte (et vraiment surpris) que beaucoup de développeurs ne connaissaient pas toutes les collections disponibles du .NET Framework. Certains se limitent aux listes et aux tableaux, et d’autres ne savent réellement pas où et quand utiliser une Collection<T>, une List<T> ou un simple tableau…

Cet article à pour but de présenter très rapidement les différentes collections qui existent dans le .NET Framework et dans quelles cas les utiliser. Cet article explique aussi les nouvelles interfaces qui sont apparues dans le .NET Framework 4.5 afin de palier un problème de conception initial du .NET Framework. Cette article ne parlera pas des collections qui ne sont pas typées et que je considère moi-même obsolète dans le .NET Framework ainsi que les collections spécifiques à WPF/Silverlight.

Continuer la lecture

[Code Contracts] Nouvelle release 1.5.60502.11 (02 Mai 2013)

L’équipe de Code Contracts vient de publier une nouvelle Release de Code Contracts version 1.5.60502.11.

Cette release optimise le démarrage et la consommation mémoire utilisé par l’outil de réécriture (ccrewriter).

Vous pouvez télécharger cette release directement sur le site de la galérie de Visual Studio.